在使用request进行爬虫时,往往需要根据网页结构以及反爬措施加入伪装头(head)、登陆信息(Cookies)以及代理IP池等一系列反反爬措施,而这次使用的Selenium完全是基于用户行为模拟,不需要像request这一系列操作
我们需要导入selenium并且下载对应的浏览器驱动,链接如下
pip install selenium
Chrome:
http://npm.taobao.org/mirrors/chromedriver/
Edge:
https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
Firefox:
https://github.com/mozilla/geckodriver
这里采用的是chrome的驱动,也就是代码中的chromedriver.exe 需要提前下载好放到目录中
from selenium.webdriver.chrome.service import Service
s = Service("chromedriver.exe")
driver = webdriver.Chrome(service=s)
url = 'https://www.jd.com/'
driver.get(url)
通过F12打开源码,定位到搜索框可以看到id=“key”这个关键信息,下面就可以通过id元素在输入框中输入显卡,同时我们还需要点击搜索才能将页面跳转到对应的商品页面,同样也是用F12源码进行定位
代码展示如下
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
s = Service("chromedriver.exe")
driver = webdriver.Chrome(service=s)
url = 'https://www.jd.com/'
# driver.get('https://search.jd.com/Search?keyword=%E6%98%BE%E5%8D%A1&enc=utf-8&wq=%E6%98%BE%E5%8D%A1&pvid=1f22a9148002444d8f1def12968bd0e4')
driver.get(url)
search = driver.find_element(by=By.ID, value='key').send_keys('显卡') # 找到搜索框并输入显卡
click = driver.find_element(by=By.CLASS_NAME, value='button') # 找到搜索
click.click() # 点击搜索
其中各行代码的意思已经写在注释中
这里通过xpath方法来进行解析
右击上面找到的<em> 点击copy→copy xpath 即可复制商品名的xpath属性 如下所示
//*[@id="J_goodsList"]/ul/li[1]/div/div[3]/a/em
多点击几个商品的xpath
//*[@id="J_goodsList"]/ul/li[2]/div/div[3]/a/em
//*[@id="J_goodsList"]/ul/li[3]/div/div[3]/a/em
可以看出li[]中的数字表示第几个商品
这时可以通过for循环实现对页面商品名的批量下载
代码如下
for i in range(17, 30):
T = driver.find_element(by=By.XPATH, value='//*[@id="J_goodsList"]/ul/li[{}]/div/div[3]/a/em'.format(i))
print(T.text)
其中value的值就是我们copy的xpath,通过format可以实现对i的控制
同样商品价格也是如此
利用xpath获得的值
//*[@id="J_goodsList"]/ul/li[1]/div/div[2]/strong/i
多找几个
//*[@id="J_goodsList"]/ul/li[2]/div/div[2]/strong/i
//*[@id="J_goodsList"]/ul/li[3]/div/div[2]/strong/i
其中li[]中的数字也是代表第几个商品
这里是直接进入商品页面,爬取第17-30条商品信息
# -*- coding = utf-8 -*
from selenium import webdriver
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
s = Service("chromedriver.exe")
driver = webdriver.Chrome(service=s)
url = 'https://www.jd.com/'
driver.get('https://search.jd.com/Search?keyword=%E6%98%BE%E5%8D%A1&enc=utf-8&wq=%E6%98%BE%E5%8D%A1&pvid=1f22a9148002444d8f1def12968bd0e4')
# driver.get(url)
# search = driver.find_element(by=By.ID, value='key').send_keys('显卡')
# click = driver.find_element(by=By.CLASS_NAME, value='button')
# click.click()
for i in range(17, 30):
T = driver.find_element(by=By.XPATH, value='//*[@id="J_goodsList"]/ul/li[{}]/div/div[3]/a/em'.format(i))
M = driver.find_element(by=By.XPATH, value='//*[@id="J_goodsList"]/ul/li[{}]/div/div[2]/strong/i'.format(i))
# //*[@id="J_goodsList"]/ul/li[2]/div/div[3]/a/em
# //*[@id="J_goodsList"]/ul/li[2]/div/div[3]/a/em/text()
print(i)
print(T.text)
print(M.text)
print("=="*30)
#driver.quit()
运行结果如下
在使用selenium进行xpath定位时,需要仔细查看对应的值 不同的浏览器 不同的页面其xpath值也不同,比如本次第16条商品信息的xpath与其他不同,需要单独拉出进行爬取。