首页 > 资讯 >

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

2023-06-09 09:57:23 来源:博客园

哈喽大家好,我是咸鱼

好久没更新 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 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):        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)                breakif __name__ == "__main__":    spider = JdSpider()    spider.run()
上一篇:

梦三国无法连接到服务器(梦三国连接服务器失败)_全球最新

下一篇:

最后一页

x
推荐阅读

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

梦三国无法连接到服务器(梦三国连接服务器失败)_全球最新

当前快报:常何墓碑原文(常何)

短债行情亮眼 同业存单收益率创新低|世界报道

南昌将获中央1亿元补助-环球今头条

俄罗斯黑客出手 《暗黑破坏神4》火速被破解:立省500多元

从电量和综合效益来看 水电是贡献最大的可再生能源 水力发电行业现状调研

每日视点!最高每月可提5400元!重庆住房公积金租房提取额度提高啦

廖昌永:把中国歌曲唱给世界听

亿纬锂能:孙公司拟在匈牙利投资建设乘用车大圆柱电池项目_天天热门

高考保供电丨儿子交高考答卷 父亲交满意“保电卷”

迈信林:新丝路拟清仓减持不超1.49%公司股份 全球新动态

淮安市首发淮安市农村土地承包经营权不动产权证书

今日火炬之光2几种职业_火炬之光2所有职业的10条建议|天天快资讯

尿毒症换肾多少钱啊_尿毒症换肾多少钱

【全球独家】比欧洲便宜20万 试驾北京奔驰“诚意之作”EQE SUV

延期太多 P社为《吸血鬼:避世血族2》预购提供退款

新城控股于上海新设商业经管公司 注册资本1亿元

反p2p终结者安卓手机版(反p2p软件)

世界热推荐:信用卡无力偿还的后果是什么?信用卡逾期会影响征信吗?|当前速递

最新进度从埔高速土建工程完成96%,计划今年内建成通车!

新型冠状病毒mRNA疫苗Ⅱ期临床试验启动

雷雨大风+冰雹+龙卷!黑龙江省发布龙卷预警 环球今亮点

荣盛发展回复年报问询函:短期内销售不景气,公司存一定偿债压力_天天新资讯

环球看热讯:恒生指数收涨0.8% 恒生科技指数收涨2.26%

学者有四失文言文翻译或失则易_学者有四失文言文翻译

电动焦虑下的日系车企:丰田反击,日产提速,本田激进 天天热文

孚能科技(688567.SH)股东深圳安晏减持期满未减持 新视野

当前消息!深圳国资委:市属国企总资产破5万亿 资产证券化率也过60%

看热讯:犬人文言文翻译_犬人文言文翻译及注释

焦点速递!想对总书记说的话,绘成一首散文诗

《崩坏星穹铁道》劳形案牍怎么解锁劳形案牍成就策略 焦点讯息

消息称苹果最新MacBook Air由鸿海、广达在泰国工厂组装,首次在中国以外生产

【收评】棕榈油日内下跌0.31% 机构称油脂反弹乏力-动态焦点

当前讯息:由俭入奢易由奢入俭难_由俭入奢易由奢入俭难意思

环球播报:23安徽债57今日发布发行公告

【速看料】最高人民法院关于彭志新诉梁广成、王树伟借款纠纷案管辖问题的复函(对于最高人民法院关于彭志新诉梁广成、王树伟借款纠纷案管辖问题的复函简单介绍)

环球要闻:vr渲染器怎么安装在3dmax2022_vr渲染器怎么安装

环球最新:山西太原:生死三秒 辅警破门救下醉酒男子

哇好香作文600字

环球今日报丨两江新区:设立紧急护送岗 全力护航高考

最新:卡莱特6月7日快速上涨

30马赫,这才是真正的高科技 热讯

美金融不稳 银行增资本惹恐慌

布兰顿詹宁斯个人资料和图片_布兰顿詹宁斯最新篮球明星动态-每日快讯

世界热议:25年前甲A巅峰对决!大连万达PK申花,当时场景+球员你还记得吗?

当前速读:什么是公共营养师

环球热文:display下载_displayx

全球热头条丨安德森·戈麦斯

真人cs怎么玩的_真人cs怎么玩