翼度科技»论坛 编程开发 python 查看内容

python 爬虫某东网商品信息 | 没想到销量最高的是

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
哈喽大家好,我是咸鱼
好久没更新 python 爬虫相关的文章了,今天我们使用 selenium 模块来简单写个爬虫程序——爬取某东网商品信息
网址链接:https://www.jd.com/
完整源码在文章最后
元素定位

我们需要找到网页上元素的位置信息(xpth 路径)

我们首先需要知道搜索框和搜索按钮的位置,然后才能把商品名字输入到搜索框中并点击收缩按钮
打开 F12,通过开发者调试工具检查相应的的位置,可得如下 Xpath 表达式:
  1. # 输入框位置:
  2. //*[@id="key"]
  3. # 搜索按钮位置:
  4. //*[@class='form']/button
复制代码
以 python 书籍为例

我们需要获取商品的名字、价格、评价数量以及店铺名


然后通过发者调试工具检查相应的的位置,可得如下 Xpath 表达式:
  1. # 当前页面商品列表
  2. //*[@id="J_goodsList"]/ul/li
  3. # 商品名字
  4. .//div[@]/a/em | .//div[@]/a/em
  5. # 商品价格
  6. .//div[@]/strong
  7. # 商品评价数量
  8. .//div[@]/strong
  9. #店铺名字
  10. .//div[@] | .//div[@]
复制代码
请注意,我在定位商品名字 xpath 的时候用了或(|),这是因为我在爬取其他商品信息的时候发现商品名字的 xpath 路径有多个
  1. .//div[@]/a/em 或 .//div[@]/a/em
复制代码


商品店铺名字同理
  1. .//div[@] 或 .//div[@]
复制代码
且多个 Xpath 路径表达式可以同时使用,其语法如下:
  1. xpath表达式1 | xpath表达式2 | xpath表达式3
复制代码
实现了自动搜索后,接下来就是要抓取页面中的商品信息
需要注意的是你会发现只有将滑动条滚动至底部,商品才会全部加载完毕
我们还需要做个判断,当爬取到最后一页时,下一页这个按钮是点击不了的,这时候就退出爬虫程序
<img alt="image-20230607151757989" loading="lazy">


代码实现

首先我们定义一个类 JdSpider,然后给它初始化对象
  1. class JdSpider(object):
  2.     def __init__(self):
  3.         self.url = 'http://www.jd.com/'
  4.         self.options = webdriver.ChromeOptions()
  5.         self.options.add_argument('--headless')  # 设置不显示窗口
  6.         self.browser = webdriver.Chrome(options=self.options)  # 创建浏览器对象
  7.         self.i = 0  # 计数,一共有多少件商品
复制代码
然后是输入商品名字点击搜索按钮的代码实现
  1.     def get_html(self):
  2.         self.browser.get(self.url)
  3.         self.browser.find_element(By.XPATH, '//*[@id="key"]').send_keys('python书籍')
  4.         self.browser.find_element(By.XPATH, "//*[@class='form']/button").click()
复制代码
获取信息
  1.     def get_data(self):
  2.         # 执行js语句,拉动进度条
  3.         self.browser.execute_script(
  4.             'window.scrollTo(0,document.body.scrollHeight)'
  5.         )
  6.         # 给页面元素加载时预留时间
  7.         time.sleep(2)
  8.         # 用xpath提取每页中所有商品,最终形成一个大列表 \
  9.         li_list = self.browser.find_elements(By.XPATH, '//*[@id="J_goodsList"]/ul/li')
  10.         for li in li_list:
  11.             # 构建空字典
  12.             item = {}
  13.             item['name']=li.find_element(By.XPATH, './/div[@]/a/em | .//div[@]/a/em').text.strip()
  14.             item['price']=li.find_element(By.XPATH, './/div[@]/strong').text.strip()
  15.             item['count']=li.find_element(By.XPATH, './/div[@]/strong').text.strip()
  16.             item['shop']=li.find_element(By.XPATH, './/div[@] | .//div[@]').text.strip()
  17.             print(item)
  18.             self.i += 1
复制代码
入口函数
  1.     def run(self):
  2.         # 搜索出想要抓取商品的页面
  3.         self.get_html()
  4.         # 循环执行点击“下一页”操作
  5.         while True:
  6.             # 获取每一页要抓取的数据
  7.             self.get_data()
  8.             # 判断是否是最一页,-1说明没找到,不是最后一页,执行点击 “下一页” 操作
  9.             print(self.browser.page_source.find('pn-next disabled'))
  10.             if self.browser.page_source.find('pn-next disabled') == -1:
  11.                 self.browser.find_element(By.CLASS_NAME, 'pn-next').click()
  12.                 # 预留元素加载时间
  13.                 time.sleep(1)
  14.             else:
  15.                 print('数量', self.i)
  16.                 break
复制代码
跑一下看看


小伙伴们可以对爬取到的数据进行一下数据清洗处理等操作,就能够进行数据分析了
源码如下:
  1. from selenium import webdriverimport timefrom selenium.webdriver.common.by import Byclass JdSpider(object):    def __init__(self):        self.url = 'http://www.jd.com/'        self.options = webdriver.ChromeOptions()        self.options.add_argument('--headless')  # 无头模式        self.browser = webdriver.Chrome(options=self.options)  # 创建无界面参数的浏览器对象        self.i = 0  # 计数,一共有多少件商品        # 输入地址+输入商品+点击按钮,切记这里元素节点是京东首页的输入栏、搜索按钮    def get_html(self):
  2.         self.browser.get(self.url)
  3.         self.browser.find_element(By.XPATH, '//*[@id="key"]').send_keys('python书籍')
  4.         self.browser.find_element(By.XPATH, "//*[@class='form']/button").click()        # 把进度条件拉倒最底部+提取商品信息    def get_data(self):        # 执行js语句,拉动进度条件        self.browser.execute_script(            'window.scrollTo(0,document.body.scrollHeight)'        )        # 给页面元素加载时预留时间        time.sleep(2)        # 用xpath提取每页中所有商品,最终形成一个大列表 \        li_list = self.browser.find_elements(By.XPATH, '//*[@id="J_goodsList"]/ul/li')        for li in li_list:            # 构建空字典            item = {}            item['name']=li.find_element(By.XPATH, './/div[@]/a/em | .//div[@]/a/em').text.strip()            item['price']=li.find_element(By.XPATH, './/div[@]/strong').text.strip()            item['count']=li.find_element(By.XPATH, './/div[@]/strong').text.strip()            item['shop']=li.find_element(By.XPATH, './/div[@] | .//div[@]').text.strip()            print(item)            self.i += 1    def run(self):
  5.         # 搜索出想要抓取商品的页面
  6.         self.get_html()
  7.         # 循环执行点击“下一页”操作
  8.         while True:
  9.             # 获取每一页要抓取的数据
  10.             self.get_data()
  11.             # 判断是否是最一页,-1说明没找到,不是最后一页,执行点击 “下一页” 操作
  12.             print(self.browser.page_source.find('pn-next disabled'))
  13.             if self.browser.page_source.find('pn-next disabled') == -1:
  14.                 self.browser.find_element(By.CLASS_NAME, 'pn-next').click()
  15.                 # 预留元素加载时间
  16.                 time.sleep(1)
  17.             else:
  18.                 print('数量', self.i)
  19.                 breakif __name__ == '__main__':    spider = JdSpider()    spider.run()
复制代码
来源:https://www.cnblogs.com/edisonfish/p/17467946.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具