python 爬虫某东网商品信息 | 没想到销量最高的是
哈喽大家好,我是咸鱼
好久没更新 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 爬虫某东网商品信息 | 没想到销量最高的是的更多相关文章
- 基于Python爬虫采集天气网实时信息
相信小伙伴们都知道今冬以来范围最广.持续时间最长.影响最重的一场低温雨雪冰冻天气过程正在进行中.预计,今天安徽.江苏.浙江.湖北.湖南等地有暴雪,局地大暴雪,新增积雪深度4-8厘米,局地可达10- ...
- Python爬虫-爬取京东商品信息-按给定关键词
目的:按给定关键词爬取京东商品信息,并保存至mongodb. 字段:title.url.store.store_url.item_id.price.comments_count.comments 工具 ...
- 【收藏】收集的各种Python爬虫、暗网爬虫、豆瓣爬虫、抖音爬虫 Github1万+星
收集的各种Python爬虫.暗网爬虫.豆瓣爬虫 Github 1万+星 磁力搜索网站2020/01/07更新 https://www.cnblogs.com/cilisousuo/p/1209954 ...
- 如何利用BeautifulSoup选择器抓取京东网商品信息
昨天小编利用Python正则表达式爬取了京东网商品信息,看过代码的小伙伴们基本上都坐不住了,辣么多的规则和辣么长的代码,悲伤辣么大,实在是受不鸟了.不过小伙伴们不用担心,今天小编利用美丽的汤来为大家演 ...
- 如何利用Xpath抓取京东网商品信息
前几小编分别利用Python正则表达式和BeautifulSoup爬取了京东网商品信息,今天小编利用Xpath来为大家演示一下如何实现京东商品信息的精准匹配~~ HTML文件其实就是由一组尖括号构成的 ...
- 如何利用CSS选择器抓取京东网商品信息
前几天小编分别利用Python正则表达式.BeautifulSoup.Xpath分别爬取了京东网商品信息,今天小编利用CSS选择器来为大家展示一下如何实现京东商品信息的精准匹配~~ CSS选择器 目前 ...
- python爬虫之12306网站--火车票信息查询
python爬虫之12306网站--火车票信息查询 思路: 1.火车票信息查询是基于车站信息查询,先完成车站信息查询,然后根据车站信息查询生成的url地址去查询当前已知出发站和目的站的所有车次车票信息 ...
- python爬虫抓取哈尔滨天气信息(静态爬虫)
python 爬虫 爬取哈尔滨天气信息 - http://www.weather.com.cn/weather/101050101.shtml 环境: windows7 python3.4(pip i ...
- 利用python爬取贝壳网租房信息
最近准备换房子,在网站上寻找各种房源信息,看得眼花缭乱,于是想着能否将基本信息汇总起来便于查找,便用python将基本信息爬下来放到excel,这样一来就容易搜索了. 1. 利用lxml中的xpath ...
- python爬虫——《瓜子网》的广州二手车市场信息
由于多线程爬取数据比单线程的效率要高,尤其对于爬取数据量大的情况,效果更好,所以这次采用多线程进行爬取.具体代码和流程如下: import math import re from concurrent ...
随机推荐
- Rainbond的 Gateway API 插件制作实践
Gateway API 作为新一代的流量管理标准,对原有 Ingress 的扩展不规范.移植性差等问题做出了改进.从兼容K8s生态和优化网关体验出发,Rainbond 支持以插件的形式扩展平台网关能力 ...
- cookie时效无限延长方案
作者:京东科技 刘清洁 1.痛点(*) 自动化测试有2种形式,接口自动化和UI自动化.而UI自动化经常会被登录节点堵塞,例如验证码.图形.滑块等,尽管有些方式可以识别图形和定位滑块位置,但成功率都不高 ...
- window计时器函数
// 定时器: // 计时器 // 开启:setInterval() // 参数1:回调函数 // 参数2:毫秒数 // 功能:每个指定的毫秒数执行一次回调函数 demo: var t = setIn ...
- 遗传算法(启发式算法)—R实现
遗传算法 遗传算法(Genetic Algorithm,GA)最早是由美国的 John holland于20世纪70年代提出,该算法是根据大自然中生物体进化规律而设计提出的.是模拟达尔文生物进化论的自 ...
- 逍遥自在学C语言 | 位运算符的基础用法
前言 一.人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 -- 自在. 第二位上场的是和我们一起学习的小白程序猿 -- 逍遥. 二.构成和表达方式 位运算符是一组用于在二进制数之间进行操作 ...
- 五月十五日java基础知识点
1.匿名内部类适用于编写事件程序 interface Ishape{ void shape(); } class MyType{ public void outShape(Ishape s){//接口 ...
- 随机模块random os模块 序列化模块
random: 验证码的实现: choice是选择列表中任意一个 ##记得把randint取出来的数字转化成str类型,要不就会相加 ##cha()是把asc编码表里的数字转化成字符 更进一步做成函数 ...
- must be reducible node 错误
"must be reducible node"错误通常是由于使用了无法转换为表达式树的代码或表达式. 场景再现:在项目中使用GroupBy的时候,对字段进行了类型转换,接下来正常 ...
- 无法使用Resource注解
问题描述: 学习Spring框架的时候,发现无法使用@Resource注解,只能使用@Autowired注解. 问题原因: JDK11删除了javax.annotation包,需要导入,否则无法使用@ ...
- YOLO精讲------YOLOV1
CV小白说YOLOV1 题外话: 目标检测是什么? 它是在图像中对一类或多类感兴趣的目标进行查找和分类,确定它们的类别和位置.由于各类物体有不同的外观.形状和姿态,加上成像时各种因素的干扰,目标检测一 ...