哈喽大家好,我是咸鱼

好久没更新 python 爬虫相关的文章了,今天我们使用 selenium 模块来简单写个爬虫程序——爬取某东网商品信息

网址链接:https://www.jd.com/

完整源码在文章最后

元素定位

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



我们首先需要知道搜索框和搜索按钮的位置,然后才能把商品名字输入到搜索框中并点击收缩按钮

打开 F12,通过开发者调试工具检查相应的的位置,可得如下 Xpath 表达式:

# 输入框位置:
//*[@id="key"] # 搜索按钮位置:
//*[@class='form']/button

以 python 书籍为例



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





然后通过发者调试工具检查相应的的位置,可得如下 Xpath 表达式:

# 当前页面商品列表
//*[@id="J_goodsList"]/ul/li # 商品名字
.//div[@class="p-name"]/a/em | .//div[@class="p-name p-name-type-2"]/a/em # 商品价格
.//div[@class="p-price"]/strong # 商品评价数量
.//div[@class="p-commit"]/strong #店铺名字
.//div[@class="p-shopnum"] | .//div[@class="p-shop"]

请注意,我在定位商品名字 xpath 的时候用了或(|),这是因为我在爬取其他商品信息的时候发现商品名字的 xpath 路径有多个

.//div[@class="p-name"]/a/em 或 .//div[@class="p-name p-name-type-2"]/a/em





商品店铺名字同理

.//div[@class="p-shopnum"] 或 .//div[@class="p-shop"]

且多个 Xpath 路径表达式可以同时使用,其语法如下:

xpath表达式1 | xpath表达式2 | xpath表达式3

实现了自动搜索后,接下来就是要抓取页面中的商品信息

需要注意的是你会发现只有将滑动条滚动至底部,商品才会全部加载完毕

我们还需要做个判断,当爬取到最后一页时,下一页这个按钮是点击不了的,这时候就退出爬虫程序

代码实现

首先我们定义一个类 JdSpider,然后给它初始化对象

class 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):
self.browser.get(self.url)
self.browser.find_element(By.XPATH, '//*[@id="key"]').send_keys('python书籍')
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[@class="p-name"]/a/em | .//div[@class="p-name p-name-type-2"]/a/em').text.strip()
item['price']=li.find_element(By.XPATH, './/div[@class="p-price"]/strong').text.strip()
item['count']=li.find_element(By.XPATH, './/div[@class="p-commit"]/strong').text.strip()
item['shop']=li.find_element(By.XPATH, './/div[@class="p-shopnum"] | .//div[@class="p-shop"]').text.strip()
print(item)
self.i += 1

入口函数

    def run(self):
# 搜索出想要抓取商品的页面
self.get_html()
# 循环执行点击“下一页”操作
while True:
# 获取每一页要抓取的数据
self.get_data()
# 判断是否是最一页,-1说明没找到,不是最后一页,执行点击 “下一页” 操作
print(self.browser.page_source.find('pn-next disabled'))
if self.browser.page_source.find('pn-next disabled') == -1:
self.browser.find_element(By.CLASS_NAME, 'pn-next').click()
# 预留元素加载时间
time.sleep(1)
else:
print('数量', self.i)
break

跑一下看看



小伙伴们可以对爬取到的数据进行一下数据清洗处理等操作,就能够进行数据分析了

源码如下:

from selenium import webdriver
import time
from selenium.webdriver.common.by import By class 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):
self.browser.get(self.url)
self.browser.find_element(By.XPATH, '//*[@id="key"]').send_keys('python书籍')
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[@class="p-name"]/a/em | .//div[@class="p-name p-name-type-2"]/a/em').text.strip()
item['price']=li.find_element(By.XPATH, './/div[@class="p-price"]/strong').text.strip()
item['count']=li.find_element(By.XPATH, './/div[@class="p-commit"]/strong').text.strip()
item['shop']=li.find_element(By.XPATH, './/div[@class="p-shopnum"] | .//div[@class="p-shop"]').text.strip()
print(item)
self.i += 1 def run(self):
# 搜索出想要抓取商品的页面
self.get_html()
# 循环执行点击“下一页”操作
while True:
# 获取每一页要抓取的数据
self.get_data()
# 判断是否是最一页,-1说明没找到,不是最后一页,执行点击 “下一页” 操作
print(self.browser.page_source.find('pn-next disabled'))
if self.browser.page_source.find('pn-next disabled') == -1:
self.browser.find_element(By.CLASS_NAME, 'pn-next').click()
# 预留元素加载时间
time.sleep(1)
else:
print('数量', self.i)
break if __name__ == '__main__':
spider = JdSpider()
spider.run()

python 爬虫某东网商品信息 | 没想到销量最高的是的更多相关文章

  1. 基于Python爬虫采集天气网实时信息

      相信小伙伴们都知道今冬以来范围最广.持续时间最长.影响最重的一场低温雨雪冰冻天气过程正在进行中.预计,今天安徽.江苏.浙江.湖北.湖南等地有暴雪,局地大暴雪,新增积雪深度4-8厘米,局地可达10- ...

  2. Python爬虫-爬取京东商品信息-按给定关键词

    目的:按给定关键词爬取京东商品信息,并保存至mongodb. 字段:title.url.store.store_url.item_id.price.comments_count.comments 工具 ...

  3. 【收藏】收集的各种Python爬虫、暗网爬虫、豆瓣爬虫、抖音爬虫 Github1万+星

    收集的各种Python爬虫.暗网爬虫.豆瓣爬虫  Github 1万+星 磁力搜索网站2020/01/07更新 https://www.cnblogs.com/cilisousuo/p/1209954 ...

  4. 如何利用BeautifulSoup选择器抓取京东网商品信息

    昨天小编利用Python正则表达式爬取了京东网商品信息,看过代码的小伙伴们基本上都坐不住了,辣么多的规则和辣么长的代码,悲伤辣么大,实在是受不鸟了.不过小伙伴们不用担心,今天小编利用美丽的汤来为大家演 ...

  5. 如何利用Xpath抓取京东网商品信息

    前几小编分别利用Python正则表达式和BeautifulSoup爬取了京东网商品信息,今天小编利用Xpath来为大家演示一下如何实现京东商品信息的精准匹配~~ HTML文件其实就是由一组尖括号构成的 ...

  6. 如何利用CSS选择器抓取京东网商品信息

    前几天小编分别利用Python正则表达式.BeautifulSoup.Xpath分别爬取了京东网商品信息,今天小编利用CSS选择器来为大家展示一下如何实现京东商品信息的精准匹配~~ CSS选择器 目前 ...

  7. python爬虫之12306网站--火车票信息查询

    python爬虫之12306网站--火车票信息查询 思路: 1.火车票信息查询是基于车站信息查询,先完成车站信息查询,然后根据车站信息查询生成的url地址去查询当前已知出发站和目的站的所有车次车票信息 ...

  8. python爬虫抓取哈尔滨天气信息(静态爬虫)

    python 爬虫 爬取哈尔滨天气信息 - http://www.weather.com.cn/weather/101050101.shtml 环境: windows7 python3.4(pip i ...

  9. 利用python爬取贝壳网租房信息

    最近准备换房子,在网站上寻找各种房源信息,看得眼花缭乱,于是想着能否将基本信息汇总起来便于查找,便用python将基本信息爬下来放到excel,这样一来就容易搜索了. 1. 利用lxml中的xpath ...

  10. python爬虫——《瓜子网》的广州二手车市场信息

    由于多线程爬取数据比单线程的效率要高,尤其对于爬取数据量大的情况,效果更好,所以这次采用多线程进行爬取.具体代码和流程如下: import math import re from concurrent ...

随机推荐

  1. 探究平台化设计的核心思想和Lattice的设计原则

    一. 平台对业务敏捷支撑的挑战 早期阿里的交易中台遇到了一些挑战,这个在毗卢的博客中有提到,主要遇到了这些问题:新小业务都有一个成长规律,在早期业务模式验证阶段,需要的玩法比较简单,希望能频繁的发布快 ...

  2. ABC291题解(D-G)

    ABC291 D - Flip Cards Solution: 考虑DP,定义状态\(F_{i,0}\)为第\(i\)张卡片正面朝上的方案数,\(F_{i,1}\)为第\(i\)张卡片背面朝上的方案数 ...

  3. LeetCode刷题笔记 - 2022

    这篇博客集中整理在LeetCode的刷题记录,方便查阅 258. 各位相加 - 力扣(LeetCode) (leetcode-cn.com) 代码 class Solution { public: i ...

  4. Flask框架cbv的写法、请求与响应、请求扩展、session源码分析、闪现

    本篇文章将会详细讲在flask框架如何写cbv.请求与响应.请求扩展.session源码分析.闪现等知识点. 目录 一.flask写CBV 二.请求与响应 三.session 四.闪现flash 五. ...

  5. Centos9网卡配置

    Centos9 网卡配置文件已修改,如下 [root@bogon ~]# cat /etc/NetworkManager/system-connections/ens18.nmconnection [ ...

  6. 开源Apinto网关-流量策略

    背景介绍 Apinto是一款高性能.可扩展.易维护的API网关. Apinto网关基于GO语言模块化开发,5分钟极速部署,配置简单.易于维护,支持集群与动态扩容,企业级开箱即用.Apinto除了提供丰 ...

  7. 基于SqlSugar的开发框架循序渐进介绍(25)-- 基于SignalR实现多端的消息通讯

    基于ASP.NET Core SignalR 可以实现客户端和服务器之间进行即时通信.本篇随笔介绍一些SignalR的基础知识,以及结合对SqlSugar的开发框架的支持,实现SignalR的多端处理 ...

  8. 开源项目audioFlux: 针对音频领域的深度学习工具库

    目录 时频变换 频谱重排 倒谱系数 解卷积 谱特征 音乐信息检索 audioFlux是一个Python和C实现的库,提供音频领域系统.全面.多维度的特征提取与组合,结合各种深度学习网络模型,进行音频领 ...

  9. day20:正则表达式

    单个字符的匹配 findall(正则表达式,字符串) 把符合正则表达式的字符串存在列表中返回 预定义字符集(8) \d 匹配数字 \D 匹配非数字 \w 匹配数字字母下划线 \W 匹配非数字或字母或下 ...

  10. Message源码分析

    Message 在Android中主要是在 消息循环机制 中使用,即配合 Handler,Looper和MessageQueue来进行线程切换,线程间传递数据.Message存储了我们所有需要的东西. ...