Python爬虫第20节-使用 Selenium 爬取小米商城空调商品

目录

前言

一、 本文目标

二、环境准备

2.1 安装依赖

2.2 配置 ChromeDriver

三、小米商城页面结构分析

3.1 商品列表结构

3.2 分页结构

四、Selenium 自动化爬虫实现

4.1 脚本整体结构

4.2 代码实现

五、关键技术详解

5.1 Selenium 启动与配置

5.2 页面等待与异步加载

5.3 商品数据解析

5.4 分页处理

5.5 异常处理

5.6 可选:保存到 MongoDB

六、Headless 模式与浏览器兼容

七、常见问题与优化建议

7.1 反爬机制

7.2 页面结构变动

7.3 数据完整性

7.4 性能优化

八、总结


🎬 攻城狮7号:个人主页

🔥 个人专栏: 《python爬虫教程》

⛺️ 君子慎独!

 🌈 大家好,欢迎来访我的博客!
⛳️ 此篇文章主要介绍 Selenium 的实战
📚 本期文章收录在《python爬虫教程》,大家有兴趣可以自行查看!
⛺️ 欢迎各位 ✔️ 点赞 👍 收藏 ⭐留言 📝!

前言

        在实际数据采集和电商分析中,很多网站采用了前端渲染和复杂的 Ajax 请求,直接分析接口变得困难。小米商城就是这样一个典型案例。与淘宝类似,小米商城的商品列表和分页都依赖于前端 JavaScript 动态渲染,Ajax 接口参数复杂且可能包含加密校验。对于这种页面,最直接、最稳定的抓取方式就是使用 Selenium 模拟真实用户操作。

        本篇文章将以"空调"为例,详细讲解如何用 Selenium 自动化爬取小米商城的空调商品信息,包括商品名称、价格、图片链接、商品详情链接等,并实现自动翻页抓取。文章内容涵盖环境准备、页面结构分析、Selenium 脚本编写、数据解析、翻页处理、异常处理、可选的 MongoDB 存储、Headless 模式、常见问题与优化建议等,帮助你系统掌握电商前端动态页面的爬取方法。

一、 本文目标

- 利用 Selenium 自动化爬取小米商城空调商品信息

- 用 PyQuery 解析商品名称、价格、图片、链接等数据

- 实现自动翻页抓取多页商品

- 可选:将数据保存到 MongoDB

- 兼容 Headless(无界面)模式

- 具备异常处理和反爬优化思路

二、环境准备

2.1 安装依赖

- Chrome 浏览器(建议最新版)

- ChromeDriver(版本需与 Chrome 主版本一致)

- Python 3.7+

- Selenium

- PyQuery

- (可选)MongoDB

安装 Python 依赖:

pip install selenium pyquery# 可选:pip install pymongo

ChromeDriver 下载地址:( https://googlechromelabs.github.io/chrome-for-testing/ )

注意: ChromeDriver 版本必须和 Chrome 浏览器主版本号一致,否则 Selenium 启动会报错。

2.2 配置 ChromeDriver

- 将 chromedriver.exe 放到 PATH 路径下,或在代码中指定其绝对路径。

- 建议用 ChromeDriver 的"可分离"模式,便于调试。

三、小米商城页面结构分析

以( https://www.mi.com/shop/search?keyword=空调 ) 为例,打开开发者工具,分析商品列表和分页结构。

3.1 商品列表结构

        点击网页元素,按鼠标右键的检查项,快速定位

商品列表在如下结构下:

<ul class="goods-list"><li><a href="商品详情链接"><img src="图片链接" ...><div class="title">商品名称</div><div class="price">价格</div>...</a></li>...</ul>

        实际页面可能有多种 class,如 `.goods-list li`、`.product-list li`、`.goods-item` 等。需根据实际页面调整选择器。

3.2 分页结构

        同样点击网页分页标签元素,按鼠标右键的检查项,快速定位分析

分页栏如下:

<div class="mi-pagenav"><span class="numbers current">1</span><a class="numbers">2</a><a class="numbers">3</a>...</div>

- 当前页为 `<span class="numbers current">1</span>`

- 其它页为 `<a class="numbers">2</a>`

- 需用 Selenium 模拟点击 `<a class="numbers">2</a>` 实现翻页

四、Selenium 自动化爬虫实现

4.1 脚本整体结构

核心流程:

1. 启动 Selenium,打开小米商城空调搜索页

2. 解析当前页商品数据

3. 模拟点击分页按钮,依次抓取多页

4. 解析每页数据并输出

5. 关闭浏览器

4.2 代码实现

from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.chrome.service import Servicefrom selenium.webdriver.chrome.options import Optionsfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECfrom pyquery import PyQuery as pqimport timeKEYWORD = '空调'MAX_PAGE = 3chrome_options = Options()# chrome_options.add_argument('--headless')  # 如需无头模式可取消注释chrome_options.add_argument('--disable-gpu')chrome_options.add_argument('--no-sandbox')chrome_options.add_argument('--disable-dev-shm-usage')chrome_options.add_experimental_option("detach", True)service = Service()browser = webdriver.Chrome(service=service, options=chrome_options)wait = WebDriverWait(browser, 20)def get_products(page):html = browser.page_sourcedoc = pq(html)products = []for item in doc('.goods-list li, .product-list li, .list li, .goods-item, .product-item').items():title = item.find('.title, .name, .pro-title, .text').text()price = item.find('.price, .pro-price, .num').text()img = item.find('img').attr('src') or item.find('img').attr('data-src')link = item.find('a').attr('href')if title and ('空调' in title or '空调' in item.text()):products.append({'title': title,'price': price,'img': img,'link': link})if not products:for a in doc('a').items():text = a.text()if '空调' in text:img = a.find('img').attr('src') or a.find('img').attr('data-src')price = ''parent = a.parent()for p in parent.parents():price = p.find('.price, .pro-price, .num').text()if price:breakproducts.append({'title': text,'price': price,'img': img,'link': a.attr('href')})print(f'第{page}页空调商品:')for p in products:print(p)return productsdef main():browser.get(f'https://www.mi.com/shop/search?keyword={KEYWORD}')for page in range(1, MAX_PAGE + 1):wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'body')))time.sleep(2)get_products(page)if page < MAX_PAGE:try:page_btn = browser.find_element(By.XPATH, f'//div[contains(@class,"mi-pagenav")]//a[@class="numbers" and text()="{page+1}"]')browser.execute_script("arguments[0].click();", page_btn)time.sleep(2)except Exception as e:print(f'点击第{page+1}页失败:', e)breakbrowser.quit()if __name__ == '__main__':main()

运行爬取截图:

五、关键技术详解

5.1 Selenium 启动与配置

- 推荐用 Chrome 浏览器,需保证 ChromeDriver 版本匹配

- 可选用 Headless 模式,适合服务器环境

- `detach` 选项可让浏览器调试时不自动关闭

5.2 页面等待与异步加载

- 小米商城商品列表为异步渲染,需用 WebDriverWait 等待元素加载

- `time.sleep()` 可适当延迟,确保页面渲染完成

5.3 商品数据解析

- 用 PyQuery 解析 HTML,支持 jQuery 风格选择器

- 兼容多种商品卡片结构,适应页面变动

- 兜底方案:遍历所有 a 标签,抓取带"空调"字样的商品

5.4 分页处理

- 不能直接拼接 URL 翻页,需模拟点击分页按钮

- 用 XPath 精确定位 `<a class="numbers">`,并用 JS 执行点击,兼容前端事件绑定

- 每次翻页后需等待页面刷新再抓取数据

5.5 异常处理

- 分页点击失败时自动中断,避免死循环

- 可根据实际需求增加重试机制

5.6 可选:保存到 MongoDB

如需将数据保存到 MongoDB,可参考如下代码:

import pymongoMONGO_URL = 'localhost'MONGO_DB = 'xiaomi'MONGO_COLLECTION = 'ac_products'client = pymongo.MongoClient(MONGO_URL)db = client[MONGO_DB]def save_to_mongo(result):try:if db[MONGO_COLLECTION].insert_one(result):print('存储到 MongoDB 成功')except Exception:print('存储到 MongoDB 失败')

在 `get_products` 中调用 `save_to_mongo(product)` 即可。

六、Headless 模式与浏览器兼容

- Headless 模式适合服务器、云主机等无桌面环境

- 启用方式:

chrome_options.add_argument('--headless')

- 也可用 Firefox、Edge 等浏览器,Selenium 语法基本一致

七、常见问题与优化建议

7.1 反爬机制

- 有些网站如频繁访问可能弹出验证码

- 有些网站需要登录才能进行下一步数据获取,如果有登录步骤,就需要自己通过Selenium自行实现

- 建议适当延迟、降低抓取频率

- 可用代理池、账号池等方式进一步优化

7.2 页面结构变动

- 商品卡片 class 可能变动,需定期检查并调整选择器

- 建议用多种选择器兜底,提升健壮性

7.3 数据完整性

- 某些商品可能缺少价格、图片等字段,需容错处理

- 可用 try/except 或默认值兜底

7.4 性能优化

- Headless 模式+禁用图片加载可提升速度

- 可用多进程/多线程并发抓取不同关键词

八、总结

        本文系统讲解了如何用 Selenium 自动化爬取小米商城空调商品信息,涵盖了环境准备、页面结构分析、自动化脚本实现、数据解析、翻页处理、异常处理、可选的 MongoDB 存储、Headless 模式、常见问题与优化建议等内容。通过这种"可见即可爬"的方式,可以高效应对前端动态渲染和复杂 Ajax 的电商页面,极大提升数据采集的灵活性和稳定性。

        你可以根据实际需求,扩展脚本支持更多商品类型、更多字段、并发抓取、数据存储等功能,打造属于自己的电商数据采集工具。

看到这里了还不给博主点一个:
⛳️ 点赞☀️收藏 ⭐️ 关注

💛 💙 💜 ❤️ 💚💓 💗 💕 💞 💘 💖
再次感谢大家的支持!
你们的点赞就是博主更新最大的动力!

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

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

相关文章

聚类分析的原理、常用算法及其应用

聚类分析的原理、常用算法及其应用 一、聚类分析的基本原理 &#xff08;一&#xff09;什么是聚类分析 聚类分析是一种无监督学习方法&#xff0c;其目标是将数据集中的样本划分为若干个簇&#xff0c;每个簇包含相似的样本。聚类分析的核心思想是通过某种相似性度量&#…

Aware和InitializingBean接口以及@Autowired注解失效分析

Aware 接口用于注入一些与容器相关信息&#xff0c;例如&#xff1a; ​ a. BeanNameAware 注入 Bean 的名字 ​ b. BeanFactoryAware 注入 BeanFactory 容器 ​ c. ApplicationContextAware 注入 ApplicationContext 容器 ​ d. EmbeddedValueResolverAware 注入 解析器&a…

JDK 安装与配置

JDK 全称是 Java SE Development Kit&#xff0c;翻译成中文就是&#xff1a;Java 标准版开发包&#xff0c;是 Sun 公司&#xff08;后被 Oracle 公司收购&#xff09;专门外 Java 开发人员提供的一套用于开发 Java 应用程序的工具包。 JDK 提供了用于编译和运行 Java 应用程序…

防火墙来回路径不一致导致的业务异常

案例拓扑&#xff1a; 拓扑描述&#xff1a; 服务器有2块网卡&#xff0c;内网网卡2.2.2.1/24 网关2.2.254 提供内网用户访问&#xff1b; 外网网卡1.1.1.1/24&#xff0c;外网网关1.1.1.254 80端口映射到公网 这个时候服务器有2条默认路由&#xff0c;分布是0.0.0.0 0.0.0.0 1…

Java面试高频问题(36-37)

三十六、服务网格核心能力与设计模式 服务网格架构分层模型 mermaid graph TB subgraph 数据平面 ASidecar代理 -->拦截流量 BEnvoy B -->协议转换 CHTTP/gRPC B -->策略执行 D熔断/限流 end subgraph 控制平面 E配置中心 -->下发策略 Fistiod F -->证书管理 …

redis数据结构-02(INCR、DECR、APPEND)

字符串操作&#xff1a;INCR、DECR、APPEND Redis 字符串不仅仅是简单的文本&#xff0c;它们还可以表示数字。此功能使我们能够直接对存储在 Redis 中的字符串值执行原子的递增和递减操作。此外&#xff0c;Redis 还提供了一种附加到现有字符串的方法&#xff0c;从而可以轻松…

Spring MVC 中Model, ModelMap, ModelAndView 之间有什么关系和区别?

在 Spring MVC 中&#xff0c;Model, ModelMap, 和 ModelAndView 都是用来在 Controller 和 View 之间传递数据的&#xff0c;但它们在使用方式和功能上有所不同。 它们的核心在于&#xff1a;Spring MVC 需要知道两件事来渲染视图&#xff1a;① 数据 (Model) ② 视图名称 (V…

配置Hadoop集群-免密登录

在 Hadoop 集群中配置免密登录是确保各节点间高效通信的关键步骤。以下是基于 SSH 密钥认证的免密登录配置方案&#xff0c;支持主节点&#xff08;NameNode&#xff09;到所有从节点&#xff08;DataNode&#xff09;的无密码访问&#xff1a; 1. 环境准备 集群规划&#xff…

C++类与对象(二):六个默认构造函数(一)

在学C语言时&#xff0c;实现栈和队列时容易忘记初始化和销毁&#xff0c;就会造成内存泄漏。而在C的类中我们忘记写初始化和销毁函数时&#xff0c;编译器会自动生成构造函数和析构函数&#xff0c;对应的初始化和在对象生命周期结束时清理资源。那是什么是默认构造函数呢&…

嵌入式培训之数据结构学习(一)数据结构的基础概念、线性表

一、基础概念 1、数据结构&#xff1a;相互之间存在一种或多种特定关系的数据元素的集合。&#xff08;特定关系有逻辑关系与线性关系&#xff09; &#xff08;1&#xff09;逻辑结构 集合&#xff0c;所有数据在同一个集合中&#xff0c;关系平等&#xff08;数组&#xff…

Android Exoplayer 实现多个音视频文件混合播放以及音轨切换

在之前的文章ExoPlayer中常见MediaSource子类的区别和使用场景中介绍了Exoplayer中各种子MediaSource的使用场景&#xff0c;这篇我们着重详细介绍下实现多路流混合播放的用法。常见的使用场景有&#xff1a;视频文件电影字幕、正片视频广告视频、背景视频背景音乐等。 初始化…

推特逆向算法,推特爬虫,数据分析,推特关键词搜索

祝大家五一假期快乐&#xff01; 最近推特加了逆向&#xff0c;频繁出现404&#xff0c;无法正常抓取数据&#xff0c;这里给出推特逆向的思路及代码&#xff0c;供大家参考学习&#xff01; 本文将介绍如何使用 Python 模拟请求 Twitter 的 GraphQL 接口&#xff0c;结合 re…

图形化编程平台的破局之道:从工具同质化到生态差异化

一、同质化困局的底层逻辑剖析 在全球图形化编程市场中&#xff0c;工具功能趋同已成为行业共识。据 Statista 2024 年数据显示&#xff0c;主流平台的基础功能重合度高达 78%&#xff0c;核心模块&#xff08;如条件判断、循环结构&#xff09;的实现方式高度相似。这种现象的…

【Rust】枚举和模式匹配

目录 枚举和模式匹配枚举的定义Option 枚举控制流运算符 match简洁控制流 if let 枚举和模式匹配 枚举的定义 结构体给予你将字段和数据聚合在一起的方法&#xff0c;像 Rectangle 结构体有 width 和 height 两个字段。而枚举给予你一个途径去声明某个值是一个集合中的一员。…

应急响应靶机——WhereIS?

用户名及密码&#xff1a;zgsf/zgsf 下载资源还有个解题.exe: 1、攻击者的两个ip地址 2、flag1和flag2 3、后门程序进程名称 4、攻击者的提权方式(输入程序名称即可) 之前的命令&#xff1a; 1、攻击者的两个ip地址 先获得root权限&#xff0c;查看一下历史命令记录&#x…

变量函数实战:高保真APP原型“发票页面”动态交互教程

变量函数是高保真交互原型设计中常见的高级交互功能&#xff0c;能够避免重复复制与手动修改页面元素和逻辑标注&#xff0c;让演示更有真实体验感。本文分享一个高保真APP交互原型页面的实操案例&#xff0c;结合原型设计工具中的变量函数与逻辑判断功能&#xff0c;手把手教你…

量子加密通信:守护信息安全的未来之盾

摘要 在数字化时代&#xff0c;信息安全成为全球关注的焦点。传统加密技术面临着被量子计算破解的风险&#xff0c;而量子加密通信作为一种基于量子力学原理的新型加密技术&#xff0c;提供了理论上无条件安全的通信保障。本文将详细介绍量子加密通信的基本原理、技术实现、应用…

《Vue.js》阅读之响应式数据与副作用函数

Vue.js 《Vue.js设计与实现》&#xff08;霍春阳&#xff09; 适合&#xff1a;从零手写Vue3响应式系统&#xff0c;大厂面试源码题直接覆盖。重点章节&#xff1a;第4章&#xff08;响应式&#xff09;、第5章&#xff08;渲染器&#xff09;、第8章&#xff08;编译器&…

数据处理专题(十三)

学会基本的图像处理技术。‍ OpenCV 基础 实践&#xff1a;使用 OpenCV 进行图像读取、显示和基本处理‍ 03 代码示例 1. 导入必要的库 import cv2import numpy as npimport matplotlib.pyplot as plt 2. 图像读取 # 读取图像image_path path_to_your_image.jpg # 替换…

springboot旅游小程序-计算机毕业设计源码76696

目 录 摘要 1 绪论 1.1研究背景与意义 1.2研究现状 1.3论文结构与章节安排 2 基于微信小程序旅游网站系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统…