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

news2024/11/22 23:50:39

哈喽大家好,我是咸鱼

好久没更新 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()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/625189.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring内容

(195条消息) 超高频面试题系列之----Spring全家桶(面试亲测)_spring全家桶面试题_zyyn_未来可期的博客-CSDN博客 1、推断构造方法: (1)如果只有一个构造方法,没问题就用这个 (2)如…

Java学习路线(26)——XML与设计模式

一、XML (一)XML的概念: XML是可扩展标记语言(Extensible Markup Language),一种数据表示形式,可以描述非常复杂的数据结构,常用于传输和存储数据。 (二)XM…

day50|动态规划11-买卖股票的最佳实际3-4(限制买卖次数的情况)

123.买卖股票的最佳时机III 确定递归函数,当前的每一个状态都由前一天决定。 以dp[i][1]和dp[i][2]为例讲解递归函数的含义: dp[i][1]max(dp[i-1][1],dp[i-1][0]-prices[i]) 含义: 第i天的股票第一天持有状态有两种,一种是前一…

电脑msvcr100.dll丢失的解决方法(一键修复方法)

msvcr100.dll是Microsoft Visual C运行时库的组成部分之一,它是一个重要的动态链接库(DLL)文件,可在Windows操作系统上运行。它包含了许多C/C语言程序库函数的实现,常常被用于支持和调用不同软件程序的运算&#xff0c…

POSTGRES、MYSQL插入数据的UPDATE_INSERT实践

POSTGRES: 1、创建表 create table tbl_user( id serial PRIMARY KEY, name varchar(256), addr varchar(256), age int, score int, fav varchar(256) ); 2、创建唯一约束 alter table tbl_user add constraint name_add_age_unique unique(name,addr,age); 3、首先插入两条数…

Ansible自定义静态资产以及常用模块

静态资产 文件文件,一个格式类似于INI的文件 默认情况下,Ansible的资产文件位于/etc/ansible/host,如果使用pip安装的则可能没有这文件,可以自己创建。 1、自定义资产 #自定义编写inventory.ini文件 1.1.1.1 2.2.2.2 3.3.3.[1:15]…

【C++】—— 模板介绍

前言: 在之前的学习中,我们已经对几个常见的STL库容器进行了详细的讲解,并且进行了模拟实现帮助大家立即。接下来,我们要介绍的就是关于 “模板” 的基本知识。 目录 前言 (一)非类型模板参数 1、基本介…

Splashtop 推出首款专门面向创作者和创意工作室的高性能远程软件

2023年5月3日 加利福尼亚州库比蒂诺 Splashtop 在简化随处办公的远程解决方案领域处于领先地位,公司今天宣布推出 Splashtop Business Access Performance,这是一款全新的远程访问解决方案,针对独立艺术家、游戏玩家、建筑与设计以及创意公司…

Opencv项目实战:基于dlib的疲劳检测

文章目录 一、项目简介二、算法原理三、环境配置3.1、dlib人脸检测器:dlib.get_frontal_face_detector()3.2、dlib关键点定位工具:shape_predictor_68_face_landmarks.dat 四、项目实战(加载视频)五、项目实战(摄像头获…

软件测试猿和bug的爱恨情仇

对程序猿来说改bug可以位列开发过程中最讨厌的事之首了,这么讲应该没有人会反对吧?因为就连Java之父詹姆斯高斯林也很讨厌Bug。 另一方面对于测试猿来说工作职责就是尽可能多地找出bug,并确保其得以解决。所以被程序猿视为眼中钉肉中刺的bug可…

Doris半结构化数据分析(倒排索引使用)快速入门

1. 背景 Apache Doris2.0 基于Apache Doris向量化MPP引擎,增加了倒排索引和半结构化JSON数据支持,更好地满足日志存储、检索、分析需求。与基于ES的日志存储方案相比,有如下优势: 性价比提升:存储成本降低50%以上&am…

‍☠️stm32Cubemx欠采样原理讲解与实现 采集高频信号

🏴‍☠️STM32Cubemx ADCTIMDMA欠采样采集高频信号 本文主要讲解ADC借助欠采样采集高频信号,比如使用100k左右的采样率去采集1M的信号。 所需工具: 开发板:STM32F103RCT6STM32CubeMXIDE: Keil-MDK 相关文章: STM32HAL ADCTIM…

2核4G轻量服务器阿里云和腾讯云区别对比

阿里云轻量应用服务器2核4G4M带宽297.98元12个月,腾讯云轻量2核4G5M服务器168元一年,628元3年,2核4G轻量应用服务器阿里云和腾讯云怎么选择?哪个性能比较好?阿腾云分享轻量应用服务器2核4G配置阿里云和腾讯云CPU、带宽…

打破互联网思维,我们该如何思考?

在会议上,你是否流程规范讲到一半突然卡逻辑、测分会议疯狂输出周围却一脸问号?提交缺陷时,你又是否被告知看不懂,要求补充信息?受挫时捶胸顿足“表达可太太太重要了,难道我天生脑子转的就比别人慢&#xf…

基于深度学习的高精度红外行人车辆检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要:基于深度学习的高精度红外行人车辆检测识别系统可用于日常生活中或野外来检测与定位红外行人车辆目标,利用深度学习算法可实现图片、视频、摄像头等方式的红外行人车辆目标检测识别,另外支持结果可视化与图片或视频检测结果的导出。本系…

围绕中国旅行商问题完成综合性实验报告 旅行商问题

题目:围绕中国旅行商问题完成综合性实验报告 旅行商问题(TSP问题)。 假设有一个旅行商人要拜访全国31个省会城市,它需要选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。…

【裸机驱动LED】使用C代码驱动LED(三)—— C代码编写篇

前面只使用了汇编代码来驱动LED,但是对于后续一些比较复杂的逻辑,使用汇编代码编写驱动的难度太大,因此,这次我们要使用C语言代码来驱动LED。 除了C代码外,依然需要编写汇编代码,在没有OS的情况下&#xf…

基于黄金莱维引导机制的阿基米德优化算法(MSAOA)-附代码

基于黄金莱维引导机制的阿基米德优化算法(MSAOA) 文章目录 基于黄金莱维引导机制的阿基米德优化算法(MSAOA)1.阿基米德优化算法2. 改进阿基米德优化算法2.1 变区间初始化策略2.2 黄金莱维引导机制2.3 自适应波长算子 3.实验结果4.参考文献5.Matlab代码6.Python代码 摘要&#x…

什么是接口测试?怎么做接口测试?Apifox 教你做!

目录 前言: 一、什么是接口测试? 二、接口测试的步骤 三、接口测试工具的选择 四、总结 前言: 随着互联网和移动互联网的发展,企业面对着越来越庞大和复杂的系统和数据接口。在这种情况下,手动测试不再能够满足测…

修复uproject右键菜单完全解决方案办法

在你电脑中找到UnrealVersionSelector通常和epiclauncher是同一个根目录 epiclauncher路径是:D:\MyEpic\Epic Games\Launcher\Portal\Binaries\Win32\EpicGamesLauncher.exe UnrealVersionSelector.exe的路径是:D:\\MyEpic\\Epic Games\\Launcher\\Engine\\Binaries\\Win64\\Un…