2025年3月31日 星期一 乙巳(蛇)年 正月初一 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > Python

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

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

一、写在前面

在使用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与其他不同,需要单独拉出进行爬取。

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