您当前的位置:首页 > 计算机 > 编程开发 > Python

利用Selenium爬取商品名以及价格

时间:01-22来源:作者:点击数:

一、写在前面

在使用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

三、代码实现

1、首先我们先利用selenuim进入到商品页面

这里采用的是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)

2、首先在爬取商品名和价格时,需要先搜索一种商品,这里以“显卡”为

通过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() # 点击搜索

其中各行代码的意思已经写在注释中

3、在转入到商品页面后同样通过F12找出相关信息

这里通过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[]中的数字也是代表第几个商品

4、完整代码如下

这里是直接进入商品页面,爬取第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与其他不同,需要单独拉出进行爬取。

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门