使用 Selenium 爬取京东手机销量与评分数据 (1)

在电商数据分析场景中,京东作为头部电商平台,其手机品类的销量、评分数据是洞察市场趋势、分析用户偏好的核心依据。相较于静态网页爬取,京东采用动态渲染技术加载商品数据,传统的 Requests+BeautifulSoup 组合难以获取完整信息,而 Selenium 凭借模拟浏览器行为的特性,能完美解决动态数据爬取问题。本文将详细讲解如何基于 Selenium 实现京东手机销量与评分数据的爬取,并完成数据清洗与初步分析。

一、技术选型与环境准备

1. 核心技术栈

  • Selenium:模拟 Chrome 浏览器操作,加载动态页面并定位元素;
  • ChromeDriver:Chrome 浏览器的驱动程序,实现 Selenium 与浏览器的通信;
  • Pandas:数据清洗、存储与初步分析;
  • BeautifulSoup:辅助解析网页 HTML 结构,提取目标数据。

2. 环境配置

(1)ChromeDriver 配置
  • 查看本地 Chrome 浏览器版本(设置→关于 Chrome);
  • 前往ChromeDriver 官方下载页下载对应版本的驱动;
  • 将 ChromeDriver.exe 放入 Python 安装目录(或配置系统环境变量),确保命令行可直接调用。

二、爬取逻辑设计

1. 爬取目标

以京东 “手机” 关键词搜索结果为数据源,提取以下信息:

  • 商品名称;
  • 商品价格;
  • 商品销量(付款人数);
  • 商品评分;
  • 评论数。

三、完整实现代码

python

运行

import time import pandas as pd from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.options import Options from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from bs4 import BeautifulSoup # 代理配置信息(单独定义,便于维护) proxyHost = "www.16yun.cn" proxyPort = "5445" proxyUser = "16QMSOML" proxyPass = "280651" class JDPhoneSpider: def __init__(self): # 配置Chrome选项,避免弹窗与自动化提示 chrome_options = Options() # 无头模式(可选,注释后可见浏览器操作) # chrome_options.add_argument('--headless') chrome_options.add_argument('--disable-blink-features=AutomationControlled') chrome_options.add_experimental_option('excludeSwitches', ['enable-automation']) chrome_options.add_experimental_option('useAutomationExtension', False) # ========== 核心修改:添加代理配置 ========== # 1. 配置HTTP代理(包含主机和端口) chrome_options.add_argument(f'--proxy-server=http://{proxyHost}:{proxyPort}') # 2. 处理代理账号密码认证(需通过Chrome扩展或DesiredCapabilities,这里用更通用的方式) # 注:Chrome 90+版本需通过selenium的ChromeDevTools协议注入认证信息 self.proxy_auth = (proxyUser, proxyPass) # 初始化浏览器 self.driver = webdriver.Chrome(options=chrome_options) # 注入代理认证(关键:避免代理需要账号密码时访问失败) self._set_proxy_auth() self.driver.execute_script('Object.defineProperty(navigator, "webdriver", {get: () => undefined})') self.driver.implicitly_wait(10) # 隐式等待10秒 self.wait = WebDriverWait(self.driver, 15) # 显式等待对象 self.data_list = [] # 存储爬取的商品数据 def _set_proxy_auth(self): """注入代理账号密码认证,解决带密码的代理访问问题""" try: # 通过Chrome DevTools协议设置代理认证 self.driver.execute_cdp_cmd( 'Network.enable', {} ) self.driver.execute_cdp_cmd( 'Network.setExtraHTTPHeaders', {'headers': {'Proxy-Authorization': f'Basic {self._get_base64_auth()}'}} ) except Exception as e: print(f"代理认证配置警告:{e},部分代理可能无需此步骤") def _get_base64_auth(self): """将代理账号密码转为Base64编码(HTTP Basic认证要求)""" import base64 auth_str = f"{self.proxy_auth[0]}:{self.proxy_auth[1]}" return base64.b64encode(auth_str.encode('utf-8')).decode('utf-8') def get_page_data(self, page_url): """爬取单页商品数据""" self.driver.get(page_url) # 模拟滚动加载(京东动态加载商品,需滚动到底部) for _ in range(3): self.driver.execute_script('window.scrollTo(0, document.body.scrollHeight)') time.sleep(2) # 等待商品列表加载完成 self.wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'gl-item'))) # 解析页面源码 soup = BeautifulSoup(self.driver.page_source, 'lxml') items = soup.find_all('li', class_='gl-item') for item in items: # 提取商品名称 name_tag = item.find('div', class_='p-name').find('em') name = name_tag.get_text().strip() if name_tag else '未知' # 提取商品价格 price_tag = item.find('div', class_='p-price').find('i') price = price_tag.get_text().strip() if price_tag else '0' # 提取销量(付款人数) sales_tag = item.find('div', class_='p-commit').find('a', class_='J_comment') sales = sales_tag.get_text().strip().replace('万+', '0000').replace('+', '') if sales_tag else '0' # 提取评分(部分商品无评分,需做容错) score_tag = item.find('div', class_='p-commit').find('span', class_='score') score = score_tag.get_text().strip() if score_tag else '无评分' # 提取评论数 comment_tag = item.find('div', class_='p-commit').find('strong').find('a') comment_num = comment_tag.get_text().strip() if comment_tag else '0' # 整理数据 self.data_list.append({ '商品名称': name, '价格(元)': price, '销量': sales, '评分': score, '评论数': comment_num }) print(f'当前页爬取完成,累计获取{len(self.data_list)}条数据') def crawl(self, keyword='手机', page_num=3): """核心爬取函数""" base_url = f'https://search.jd.com/Search?keyword={keyword}&enc=utf8&page=' for page in range(1, page_num * 2, 2): # 京东分页URL规则:第1页page=1,第2页page=3,第3页page=5... page_url = base_url + str(page) print(f'正在爬取第{(page+1)//2}页,URL:{page_url}') try: self.get_page_data(page_url) # 翻页间隔,避免请求过快被风控 time.sleep(3) except Exception as e: print(f'第{(page+1)//2}页爬取失败:{str(e)}') continue def save_data(self, filename='jd_phone_data.csv'): """将数据保存为CSV文件""" df = pd.DataFrame(self.data_list) # 数据清洗:价格转为数值型,销量做简单处理 df['价格(元)'] = pd.to_numeric(df['价格(元)'], errors='coerce').fillna(0) df['评论数'] = df['评论数'].str.replace('万', '0000').replace('+', '') df['评论数'] = pd.to_numeric(df['评论数'], errors='coerce').fillna(0) df.to_csv(filename, index=False, encoding='utf-8-sig') print(f'数据已保存至{filename},共{len(df)}条有效数据') def close(self): """关闭浏览器""" self.driver.quit() # 主程序执行 if __name__ == '__main__': spider = JDPhoneSpider() try: # 爬取3页手机数据 spider.crawl(keyword='手机', page_num=3) # 保存数据 spider.save_data() finally: # 确保浏览器关闭 spider.close()

四、代码核心解析

1. 浏览器配置

  • 关闭<font style="color:rgb(31, 35, 41);background-color:rgba(0, 0, 0, 0);">webdriver</font>特征检测:通过<font style="color:rgb(31, 35, 41);background-color:rgba(0, 0, 0, 0);">execute_script</font>修改<font style="color:rgb(31, 35, 41);background-color:rgba(0, 0, 0, 0);">navigator.webdriver</font>属性,避免京东识别出自动化程序;
  • 隐式等待 + 显式等待结合:隐式等待处理全局元素加载,显式等待确保商品列表加载完成后再解析,避免数据缺失。

2. 动态数据加载处理

京东商品列表采用滚动加载机制,通过<font style="color:rgb(31, 35, 41);background-color:rgba(0, 0, 0, 0);">window.scrollTo</font>模拟鼠标滚动,配合<font style="color:rgb(31, 35, 41);background-color:rgba(0, 0, 0, 0);">time.sleep</font>等待数据加载,确保能获取完整的商品信息。

3. 数据提取与容错

  • 针对 “无评分”“销量为空” 等异常情况,通过<font style="color:rgb(31, 35, 41);background-color:rgba(0, 0, 0, 0);">if-else</font>做容错处理,避免程序崩溃;
  • 使用 BeautifulSoup 解析页面,通过 class 定位元素,适配京东网页结构。

4. 数据清洗与存储

  • 将价格、评论数转为数值型,方便后续分析;
  • 保存为 UTF-8 编码的 CSV 文件,避免中文乱码问题。

五、爬取注意事项

  1. 反爬机制规避
    • 控制请求频率(设置<font style="color:rgb(31, 35, 41);background-color:rgba(0, 0, 0, 0);">time.sleep</font>),避免短时间内大量请求;
    • 不使用高并发爬取,单线程爬取少量数据(如 10 页内)更安全;
    • 可添加随机 User-Agent,进一步降低被风控的概率。
  2. 网页结构变更:京东网页 class 名称可能随版本更新变化,若爬取失败,需通过浏览器开发者工具(F12)重新定位元素的 class 或 XPath。
  3. 合法合规性:本代码仅用于学习研究,爬取数据不得用于商业用途,需遵守京东平台的 robots 协议及相关法律法规。

六、数据应用示例

爬取完成后,可通过 Pandas 做简单分析:

python

运行

import pandas as pd # 读取数据 df = pd.read_csv('jd_phone_data.csv') # 1. 筛选评分≥4.8的商品 high_score_phones = df[df['评分'] != '无评分'][df[df['评分'] != '无评分']['评分'].astype(float) ≥ 4.8] # 2. 统计价格区间分布 price_range = pd.cut(df['价格(元)'], bins=[0, 1000, 2000, 3000, 5000, 10000], labels=['千元内', '1-2千', '2-3千', '3-5千', '5千以上']) price_dist = price_range.value_counts() print(price_dist)

总结

  1. Selenium 是解决动态网页爬取的核心工具,通过模拟浏览器行为可获取京东动态加载的商品数据;
  2. 爬取过程中需重点处理动态加载、反爬机制、数据容错三大问题,确保数据完整性与程序稳定性;
  3. 爬取后的数据分析需基于 Pandas 完成数据清洗,才能挖掘出有价值的市场信息,同时需遵守平台规则与法律规定。

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

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

相关文章

算法题 递增顺序搜索树

递增顺序搜索树 问题描述 给你一个二叉搜索树&#xff08;BST&#xff09;的根节点 root&#xff0c;请将其重新排列为一棵只有右子节点的递增顺序搜索树。 要求&#xff1a; 树中每个节点没有左子节点只有右子节点节点按照中序遍历的顺序排列 返回新树的根节点。 示例&#xf…

inline内联函数双重语义

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、先理清&#xff1a;inline的两个核心作用&#xff08;容易混淆&#xff09;二、头文件中写类成员函数的两种场景场景1&#xff1a;类体内部直接写函数实现&a…

导师严选2026 AI论文网站TOP10:本科生毕业论文写作全攻略

导师严选2026 AI论文网站TOP10&#xff1a;本科生毕业论文写作全攻略 2026年AI论文写作工具测评&#xff1a;为何需要一份权威榜单&#xff1f; 在人工智能技术不断渗透学术领域的今天&#xff0c;AI论文写作工具已成为本科生完成毕业论文的重要辅助。然而&#xff0c;面对市场…

容器开篇复制弱智问题答案

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录一、QVector/QMap 是否属于 STL&#xff1f;二、std::string&#xff1a;是否属于 STL&#xff1f;是否是容器&#xff1f;1. 是否属于 STL&#xff1f;2. 是否是容器…

AI+设计:用预置镜像快速构建创意辅助工具

AI设计&#xff1a;用预置镜像快速构建创意辅助工具 为什么设计工作室需要AI创意辅助工具 在设计行业&#xff0c;创意产出往往需要耗费大量时间和人力成本。传统设计流程中&#xff0c;从构思到成品需要反复修改&#xff0c;效率较低。而AI技术的出现&#xff0c;特别是图像生…

LLM动态调药糖尿病副作用砍半

&#x1f4dd; 博客主页&#xff1a;Jax的CSDN主页 LLM动态调药&#xff1a;糖尿病副作用减少50%的临床实践与未来展望目录LLM动态调药&#xff1a;糖尿病副作用减少50%的临床实践与未来展望 引言&#xff1a;糖尿病管理的痛点与技术拐点 一、糖尿病副作用的根源&#xff1a;为…

算法题 水果成篮

水果成篮 问题描述 你正在探访一家农场&#xff0c;农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示&#xff0c;其中 fruits[i] 是第 i 棵树产生的水果种类。 你有两个篮子&#xff0c;每个篮子只能装单一类型的水果&#xff0c;但你可以选择任意两棵树开始收集…

零成本体验:免费GPU资源+预装镜像玩转AI绘画

零成本体验&#xff1a;免费GPU资源预装镜像玩转AI绘画 作为一名对AI绘画感兴趣的大学生&#xff0c;你是否曾因高昂的GPU云服务费用和复杂的本地部署流程而望而却步&#xff1f;本文将介绍如何利用免费GPU资源和预装镜像&#xff0c;零门槛体验Stable Diffusion等AI绘画技术&a…

科哥手把手教学:1小时掌握Z-Image-Turbo二次开发

科哥手把手教学&#xff1a;1小时掌握Z-Image-Turbo二次开发 作为一名全栈开发者&#xff0c;当我接到集成Z-Image-Turbo的任务时&#xff0c;内心是有些忐忑的。虽然我对传统开发流程轻车熟路&#xff0c;但AI模型开发领域对我来说还是一片未知的领域。幸运的是&#xff0c;经…

技术创业者必看:低成本搭建AI图像生成SaaS

技术创业者必看&#xff1a;低成本搭建AI图像生成SaaS 为什么选择AI图像生成SaaS&#xff1f; 作为一名技术创业者&#xff0c;你可能已经注意到AI图像生成技术的巨大潜力。从营销海报到产品设计&#xff0c;Stable Diffusion等开源模型正在改变内容创作的方式。但传统部署方案…

API开发速成:基于预配置Z-Image-Turbo环境快速构建图像生成服务

API开发速成&#xff1a;基于预配置Z-Image-Turbo环境快速构建图像生成服务 作为一名后端工程师&#xff0c;当你接到任务要将Z-Image-Turbo集成到公司系统时&#xff0c;可能会对AI模型部署感到陌生。本文将介绍如何利用预配置的Z-Image-Turbo环境快速构建图像生成API服务&…

等保二级与三级深度解析及对比分析

在数字化时代,网络安全等级保护制度已成为企业保障信息安全的重要合规手段。等保二级和三级作为常见的保护级别,在适用场景、技术要求和管理措施等方面存在显著差异。本文将对等保二级和三级进行详细解析,并对比分析两者的核心差异,为企业选择合适的等保级别提供参考。 一…

产品经理必备:10分钟了解AI图像生成技术

产品经理必备&#xff1a;10分钟了解AI图像生成技术 作为一名非技术背景的产品经理&#xff0c;你可能经常听到"Stable Diffusion"、"AI绘图"这些热词&#xff0c;但面对复杂的安装配置和GPU需求&#xff0c;往往无从下手。本文将带你快速理解AI图像生成的…

亲测好用!9款AI论文软件测评:本科生毕业论文全攻略

亲测好用&#xff01;9款AI论文软件测评&#xff1a;本科生毕业论文全攻略 AI论文软件测评&#xff1a;为什么你需要一份靠谱的工具推荐 随着人工智能技术的不断进步&#xff0c;越来越多的本科生开始借助AI工具辅助毕业论文写作。然而&#xff0c;面对市场上琳琅满目的AI论文软…

揭秘Z-Image-Turbo超快推理:预配置镜像+云端GPU实战指南

揭秘Z-Image-Turbo超快推理&#xff1a;预配置镜像云端GPU实战指南 如果你正在寻找一种能够快速生成高质量图像的AI解决方案&#xff0c;Z-Image-Turbo绝对值得关注。这款由阿里巴巴通义MAI团队开发的图像生成模型&#xff0c;通过创新的8步蒸馏技术&#xff0c;在保持照片级质…

STM32嵌入式:如何使用VSCode EIDE来获取flash块数据并转换成可视化的数据 来判断源头数据是否错误

STM32嵌入式&#xff1a;如何使用VSCode EIDE来获取flash块数据并转换成可视化的数据 来判断源头数据是否错误 VSCode 里 EIDE 本身没有像 Keil 那样“直接导出 Flash 到文件”的按钮。但你已经在用 EIDE Cortex-Debug 调试&#xff0c;所以可以用调试后端&#xff08;OpenOCD…

算法题 最小差值 I

908. 最小差值 I 问题描述 给你一个整数数组 nums 和一个整数 k。你可以选择数组中的任一元素并将其替换为 [num - k, num k] 范围内的任意整数。 在应用此操作至多一次后&#xff0c;求数组中最大值和最小值之间的最小可能差值。 示例&#xff1a; 输入: nums [1], k 0 输出…

告别CUDA报错:预装镜像带你轻松玩转Z-Image-Turbo

告别CUDA报错&#xff1a;预装镜像带你轻松玩转Z-Image-Turbo 作为一名计算机专业的学生&#xff0c;在课程项目中需要使用AI生成图像时&#xff0c;你是否曾被各种依赖包冲突和CUDA版本问题困扰得焦头烂额&#xff1f;本文将介绍如何通过预装好的Z-Image-Turbo镜像&#xff0c…

玩转AI绘画:周末用云端GPU打造个人艺术展

玩转AI绘画&#xff1a;周末用云端GPU打造个人艺术展 作为一名艺术爱好者&#xff0c;你是否曾想过举办一场属于自己的AI艺术展&#xff1f;借助Stable Diffusion等开源AI绘画工具&#xff0c;现在完全可以在云端GPU环境下快速生成高质量的艺术作品。本文将手把手教你如何利用预…

简析:一种名为 ObjectSense 的编程语言

让我们通过以下三个维度来了解它&#xff1a;1. 语言本质与起源 基础平台&#xff1a;它是一种基于 Vim Script (VimL) 进行面向对象封装的脚本编程语言。核心特性&#xff1a;高度精炼&#xff0c;核心代码仅在千行之内。设计初衷&#xff1a;旨在让开发者能像写 Python 一样简…