Selenium抓取京东商品信息实战:登录、翻页与反爬要点全解析

发布时间:2026/10/2 2:58:07

Selenium抓取京东商品信息实战:登录、翻页与反爬要点全解析 简介面向需要采集京东商品数据的爬虫学习者这份实操型资源演示了如何借助浏览器驱动模拟真实用户操作解决动态加载、翻页遍历与反爬限制等常见问题对于电商页面这类交互频繁的场景尤其适用。压缩包共 2 个文件含一个脚本文件和一个文本结果文件整体仅 2KB脚本模块清晰文本文件为抓取结果样例便于对照验证。已有 245 人学习下载。读者可从中获取商品名称、价格、评价等元素的定位方式以及显式等待、分页点击的处理技巧还能看到通过延时、切换用户标识等手段降低封禁风险的完整思路。基于这份简洁骨架可直接修改商品链接或选择器复用于其他商品也可扩展至多品类采集、价格监控或数据清洗任务适合作为入门爬虫开发的参考资料。1. 用 Selenium 爬京东商品信息先把“能不能跑”换成“能跑多久”拿到“selenium爬取京东商品信息.zip”这套包的人多半带着一个具体诉求把搜索页里的商品名、价格、店铺、链接批量落进表格。我前前后后写过不下十版抓京东的采集脚本结论很直接真正的门槛不在 selenium 怎么写而在登录态、DOM 结构和风控这三道坎。这篇按能落地的方式拆开讲先说明为什么选 selenium 而不是 requests再给一套最小可复现的脚本最后把新手最容易翻车的五个点位逐个拆掉。适合刚接触爬取、想把采集脚本做成能长期维护的工程的开发者也适合只要一份能跑的模板、回头自己改字段的人。2. 为什么选 Selenium先看清京东商品页的数据入口与三个选型条件2.1 京东商品列表的数据入口DOM、懒加载与可见性京东搜索列表页的核心数据挂在ul.gl-warp下的li.gl-item里商品名、价格、店铺、链接都集中在一个 li 内。单看结构用 Requests 直接解析也不是不行问题出在懒加载和动态渲染页面首屏只输出前几个商品滚动到中段才会请求下一批价格字段往往由 JS 在页面加载完成后写入raw HTML 里经常是个空标签。这两个特性决定了 Requests 加正则的方案在京东上很不牢靠。Selenium 打开的是真实浏览器内核滚动、点击、等待都有明确结果。你用find_element拿到的元素已经是浏览器重排之后的 DOM懒加载触发后追加的商品也能通过后续查找被检索到。这让 Selenium 成为抓取京东商品信息最容易起步的方案。代价同样明显速度慢内存占用高每开一个浏览器实例就要几百 MB。但如果你的诉求是“把某几个关键词的搜索结果抓下来”几十页的量级完全在 Selenium 的舒适区内没必要一上来就上多线程、分布式那套重型方案。2.2 选型Selenium、Requests 还是接口直连方案能拿到什么拿不到什么什么时候选它Requests 直接请求链接静态 HTMLJS 渲染后的价格、懒加载商品只用来探测页面结构接口直连结构化数据速度快签名参数难构造需要逆向数据量几万条以上且有逆向经验Selenium完整渲染后的 DOM交互可控速度慢资源占用高大多数个人采集任务的首选怎么判断自己适合哪条路按三个条件依次问。第一要不要登录态只看公开价格和销量其实不用登录要抓 Plus 专享价或促销字段就需要。第二页面数据是不是 JS 渲染的是就直奔 Selenium。第三数据量有没有到几万条以上到了才值得研究接口直连。接口直连不是几行requests.get能搞定的——京东接口链接里的签名参数、时间戳、设备指纹一应俱全没有逆向经验的人开这个坑大概率会卡在第一步。我的建议是先把 Selenium 跑顺产出一份小数据验证业务方向再决定要不要往接口迁移。2.3 环境准备先解压 zip再装全家桶含伪加密判断拿到压缩包第一步不是写代码是确认里面东西齐不齐。先解压unzip selenium爬取京东商品信息.zip -d jd_crawler cd jd_crawler python -m venv .venv source .venv/bin/activate # Windows 用 .venv\Scripts\activate pip install selenium webdriver-managerwebdriver-manager会自动下载与 Chrome 匹配的驱动省掉手动找版本的一环。如果你在公司内网装不了这个包就手动去浏览器驱动站点下载对应版本放到 PATH 里原理是一样的。解压时如果提示文件损坏或要密码先别急着找破解工具很可能是 zip 伪加密。用zipinfo -v看压缩条目里的 encryption 标志位如果显示0x01而压缩方法仍是普通 deflate基本可以确定是伪加密修改标志位后就能正常解压具体操作放在后面 4.3 讲。包里有 README 或 requirements.txt 时先读它。很多作者会在里面写明 Selenium 版本要求和已知坑没有也没关系按上面的命令装完跑下面的脚本即可。3. 最小可复现的抓取脚本从扫码登录到 CSV 落盘3.1 登录态这一关先扫码登录再复用它京东搜索页匿名也能访问但价格和促销字段经常和登录态绑定带登录态去抓也能降低误杀概率。所以我习惯先把登录态做出来再做抓取。第一次运行下面脚本手动扫码一次登录态会落盘到本地目录# login_once.py from selenium import webdriver from selenium.webdriver.chrome.options import Options options Options() # 关键参数指定用户数据目录登录信息cookie/localStorage会持久化 options.add_argument(--user-data-dir./jd_login_profile) driver webdriver.Chrome(optionsoptions) driver.get(https://www.jd.com) input(扫码登录完成后按回车继续……) driver.get(https://www.jd.com) print(登录态已保存到 ./jd_login_profile) driver.quit()这段代码做的事情很简单启动 Chrome打开京东首页扫码后回车关闭浏览器。关键在于--user-data-dir指向了一个本地目录chrome 会把这一份登录态的 cookie、localStorage 全部写进该目录。之后的采集脚本只要带上同一个参数启动就等于带着登录态访问。参数说明./jd_login_profile是相对路径建议改成绝对路径避免后续脚本从不同目录启动时找不着。这个目录不要用你日常浏览的 chrome 默认配置否则会把常用浏览器环境搞乱。3.2 搜索与翻页核心抓取循环怎么写登录搞定后进入主循环。下面的脚本按关键词搜索逐页抓取商品标题、价格、店铺然后点击下一页# fetch_jd.py import time import random from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.options import Options from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC KEYWORD 机械键盘 TOTAL_PAGES 10 def fetch_page(driver, page): # 京东搜索列表商品主体是 ul.gl-warp 下的 li.gl-item类名随时可能改 items driver.find_elements(By.CSS_SELECTOR, li.gl-item) rows [] for item in items: # 标题在 .p-name em 里注意部分商品标题会包含换行符 name_el item.find_element(By.CSS_SELECTOR, .p-name em) # 价格在 .p-price strong i活动价可能不在这个位置 price_el item.find_element(By.CSS_SELECTOR, .p-price strong i) try: shop_el item.find_element(By.CSS_SELECTOR, .p-shop span) shop shop_el.text.strip() except Exception: shop # 部分商品无店铺信息 rows.append({ title: name_el.text.strip(), price: price_el.text.strip(), shop: shop, }) return rows options Options() options.add_argument(--user-data-dir./jd_login_profile) options.add_argument(--window-size1400,900) driver webdriver.Chrome(optionsoptions) driver.get(fhttps://search.jd.com/Search?keyword{KEYWORD}encutf-8) for page in range(1, TOTAL_PAGES 1): rows fetch_page(driver, page) print(fpage {page}: {len(rows)} items) if page TOTAL_PAGES: # 每次翻页前随机停 2.5~4.5 秒模拟人手点击节奏 time.sleep(random.uniform(2.5, 4.5)) # 用显式等待等“下一页”按钮可点击而不是固定 sleep next_btn WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.CSS_SELECTOR, a.pn-next)) ) next_btn.click() time.sleep(random.uniform(1.0, 2.0)) # 等待列表区渲染 driver.quit()这里有两个容易踩的细节。第一翻页用的a.pn-next是京东翻页区“下一页”的通用选择器但页面结构调整时它也会变找不到时就先打开搜索页右键检查翻页区域的 HTML 再改选择器别盲改代码。第二点击下一页后新一页的商品列表不会立即渲染完需要一个随机短等待。这个等待不是越多越好哪怕只等 3 秒也比点完立刻抓数据要可靠得多。参数说明TOTAL_PAGES建议从 2 开始试跑通再加页数一上来跑几十页遇到验证码的概率会高很多。window-size设置为 1400x900是为了更接近普通用户的视口尺寸有些页面会按视口宽度决定渲染多少商品。3.3 字段提取与落盘CSV 去重和价格清洗抓到的数据不能直接入库先做两件事去重和清洗。京东搜索页翻页时偶尔会把上一页的最后一个商品重复带过来另外价格字段里可能出现“¥”“暂无报价”这类非数字内容。# save_rows.py import csv from pathlib import Path def clean_price(raw_price): 清洗价格去掉货币符号空值转 0 if not raw_price: return 0 return raw_price.replace(¥, ).strip() def save_rows(out_path, rows, seen): rows 里的每条记录写入 CSVtitleprice 去重 fieldnames [title, price, shop, url] file_exists Path(out_path).exists() with open(out_path, a, newline, encodingutf-8-sig) as f: writer csv.DictWriter(f, fieldnamesfieldnames) if not file_exists: writer.writeheader() for row in rows: key row[title] str(row[price]) if key in seen: continue seen.add(key) writer.writerow(row)编码用utf-8-sig而不是utf-8是给 Excel 用户留的后路——带 BOM 的 CSV 被 Excel 打开时中文不乱码。去重键用“标题价格”简单直接如果你抓了 URL 字段可以换成 URL准确度更高。清洗价格时注意“到手价”和“页面价”可能混在一起这一步只做格式清洗不做口径统一口径问题放到第 4 章的 4.4 讲。字段落盘以后建议每页结束就调一次save_rows不要攒到全部跑完再统一写。爬虫随时可能崩每页落盘相当于给自己买了份后悔药。3.4 反爬基线把 python selenium 的采集节奏调成人的样子很多人以为反爬对抗要靠隐蔽浏览器指纹其实对中小型采集任务来说最重要的只有一条别让请求节奏暴露你是程序。固定 sleep 1 秒是最容易被识别的行为模式。正常人看一页商品至少要扫几秒不会每页都是精确的整数间隔。我一般把页面间隔设为 2.5 到 4.5 秒之间的随机值每翻 5 页再额外停 15 秒左右当作“看完去喝水”的时间。你不需要把参数调得很玄学关键是让分布看起来有自然波动。还有一个常见误用一上来就开 headless 无头模式。无头模式确实省资源但它在页面行为上经常漏马脚验证码弹出来的概率比有头模式高不少。除非你已经有充分的排除项验证否则尽量保持浏览器窗口可见。参数我的基线值说明页面间隔2.5~4.5 秒随机低于 1.5 秒必然触发限流批次停顿每 5 页停 15 秒模拟阅读长列表后的停顿连续失败次数3 次即停机重启脚本前先人工确认页面状态这套参数是基线不是金标准。有人固定 sleep 1 秒跑两小时没事有人随机间隔照样被拦影响因素很多。我的底线是失败后先减速而不是先重试。采集是长跑前 20 分钟跑得再快第 30 分钟被拦下来整体收益还是零。4. 踩坑排查五个让新手翻车的点与现场处理4.1 元素明明在页面上却报 NoSuchElementException现象手动打开浏览器能看到商品标题和价格但find_element一直报NoSuchElementException重试 n 次无效。原因一般有三个页面结构改了、懒加载没触发、元素在 iframe 里。京东搜索列表改版后.p-name em这个路径经常会失效另外商品列表是滚动懒加载的直接查找时元素还没渲染进 DOM。解决先确认结构再触发加载。把driver.page_source前 2000 字符打印出来看 li 元素还在不在类名有没有变。确认结构没变后先滚动再查找scroll_script arguments[0].scrollIntoView(); driver.execute_script(scroll_script, target_element) time.sleep(0.8)这个操作把目标元素滚入视口懒加载区域的内容会被触发渲染然后再执行查找很多“找不到”就能解决。至于 iframe京东主流程里少见一旦遇到先driver.switch_to.frame(frame_name)再找元素。4.2 登录态丢失一翻页就回登录页现象扫码登录后第一页抓取正常翻到第二页或第三页页面突然跳回登录页后续抓到的全是空数据。原因user-data-dir 没复用或者浏览器版本不一致导致 session 失效。有些人在每次启动时新建了临时用户目录等于每次都是新访客京东自然要求重新登录。解决确认每次启动 Chrome 都带同一个--user-data-dir绝对路径。另外把登录后的 cookie 导出存成 JSON一旦发现被踢可以重新注入 cookie避免再次扫码import json from selenium.webdriver.common.by import By cookies driver.get_cookies() with open(jd_cookies.json, w, encodingutf-8) as f: json.dump(cookies, f, ensure_asciiFalse, indent2)重新注入时用driver.add_cookie()逐个加入注意先访问一次京东域名再注入否则浏览器会拒绝写入。4.3 zip 解压报错伪加密与压缩方法的双重陷阱现象解压“selenium爬取京东商品信息.zip”时报文件损坏或者提示输入密码但你根本没设置过密码。原因zip 伪加密。它只是把压缩条目的 encryption 标志位从0x00改成0x01文件本身并没有真正加密。Python 的zipfile模块看到标志位就认为加密直接拒绝解压。解决先用zipinfo -v看具体条目确认是不是伪加密zipinfo -v selenium爬取京东商品信息.zip看输出里的encryption字段。如果是0x01伪加密且压缩方法仍是deflate用十六进制编辑器把对应条目的标志位改回0x00就能正常解压全程不需要密码。如果文件是真正加密的那只能靠密码普通数据就别折腾暴力破解了直接找原始来源更省时间。4.4 价格对不上账页面价、Plus 价与到手价现象抓到的价格和手机上看到的完全不一样同一个商品脚本里是 399详情页里是 359领券后是 329。原因京东列表页展示的往往是“当前展示价”不是最终到手价。Plus 专享价、满减、优惠券、白条立减这些逻辑全部在详情页或结算链路里生效列表页的 DOM 里只有基础价。解决把抓到的价格当“参考价”处理。需要精确价格时对每条商品补充访问详情页用详情页的价格选择器单独抓一遍再做一版“详情页核价”。注意详情页价格也有异步加载访问后要等span.price出现再提取别用固定 sleep。如果你只是做竞品分析列表页价格够用了但要写清楚口径别混用。4.5 爬着爬着列表变空白频率被限制后的刹车现象跑到第 30 页左右商品列表区域变成空的没有报错页面顶部导航正常只有商品区不渲染。原因大概率是短时间请求次数过多被风控临时限流。这是黑匣子没有明确的错误码页面上也不会有提示只会给你一个残缺的空列表。解决立即停手不要原地重试。等 30 分钟以上再把页面间隔从 3 秒调到 6 秒起步。同时给抓取循环加一个“页面商品数校验”如果一页抓到的商品数少于正常值的一半自动中断脚本并留下日志避免后续几百页全是空数据。这一步是整套脚本里最值得加的防护逻辑哪怕多写几行代码也值。5. 验证采集结果抽检比例、字段完整率与断点续爬5.1 用三条抽样规则判断数据能不能入库采集完成先别急着分析用三条规则快速体检。第一条分层抽样从每一页里随机抽 1 条共抽 3% 左右人工核对标题、价格、店铺、链接四要素。第二条统计空值价格为空或为 0 的条目占比超过 1%说明价格选择器已经失效整批数据需要重新抓取。第三条重复率按“标题价格”去重后计算重复比例超过 2%大概率是翻页逻辑出了问题导致同一页被抓了多次。三条都通过这份数据才算具备入库条件。5.2 断点续爬把进度写进文件停电也不从头开始长任务最怕跑到一半中断。我习惯在每页结束时把当前进度写进 JSON重启脚本时先读进度跳过往过的页import json from pathlib import Path PROGRESS_FILE Path(progress.json) def load_progress(): if PROGRESS_FILE.exists(): return json.loads(PROGRESS_FILE.read_text(encodingutf-8)) return {page: 0} def save_progress(progress): PROGRESS_FILE.write_text( json.dumps(progress, ensure_asciiFalse, indent2), encodingutf-8 )主循环里每处理完一页调用一次save_progress重启时用start_page load_progress()[page] 1继续。这套机制比 Excel 断点记录牢靠得多也方便你随时停掉脚本去处理验证码处理完再续跑。有一次我同一天跑了两轮采集第一轮缺了价格字段第二轮补抓时没做进度记录结果多抓了一万多条重复数据最后靠去重才发现时间白花了。从那以后我把“能跑多久”看得比“能跑多快”更重。希望这些实战细节帮到你至少让你第一次跑采集时少走几段弯路。本文还有配套的精品资源点击获取
延伸阅读

更多相关文章

2026/10/2 2:58:06

PyCharm跑神经网络二分类:环境配置到模型调优全指南

简介:这是一份基于PyCharm开发的神经网络二分类项目文件,面向初学深度学习与Python的开发者,演示了图像类别判定的完整流程。项目以猫狗二分类数据为基础,通过搭建神经网络完成训练与预测,适合用于理解逻辑回归、Sigmo…

2026/10/2 2:53:06

GMSK仿真全链路解析:原理、MATLAB实现与误码率避坑

简介:一份基于MATLAB的GMSK调制解调仿真报告,面向无线通信、信号处理方向的在校学生、课程设计人员及工程师,用于理解GMSK原理并掌握仿真实现方法。报告以GSM系统为背景,系统讲述GMSK作为连续相位调制的特点,重点分析高…

2026/10/2 2:53:06

软件工程论文排版总被打回?智能排版把格式整理从两天缩到一小时

写过软件工程毕业论文的人都懂那种绝望:代码截图对不齐、图表编号全乱、页眉奇偶页不同、参考文献格式被导师打回三次。内容早就写完了,排版却耗掉整整两天,而且每次改动正文,编号又得全部重来一遍。软工论文尤其惨——光是代码清…

2026/10/2 7:03:16

CANoe 10.0安装避坑指南:从授权配置到路径选择的完整步骤

简介:CANoe 10.0 的安装步骤指南,面向汽车电子、工控系统与工业自动化等领域的开发测试工程师,帮助他们避开安装过程中常见的系统权限、组件缺失及 License 配置等问题。资源包为单个 PDF 文件,共 1 个文件,大小仅 187…

2026/10/2 7:03:16

9.99万的艾尼氪V:合资品牌的破局点,在电车后市场?

一位去年入手某款10万级纯电轿车的车主最近算了一笔账:买车时比同级别燃油车省了近两万元,刚开满两年,电池健康度掉到了70%以下,咨询官方更换电池,报价接近六万元,相当于车价的一多半。当初为了省钱选了低价…

2026/10/2 7:03:16

WorkBuddy + ima 搭建个人知识库:从资料散落到达标可复现

WorkBuddy ima 搭建个人知识库:从资料散落到达标可复现(防幻觉实战) 摘要:个人知识库最常见的问题不是“不会建库”,而是资料散在微信、PDF、会议纪要、网页收藏里,真正要用时翻不到;AI 问答又…

2026/10/2 6:58:16

Vue国际化处理-i18n

Vue3 vue-i18n 国际化项目完整总结一、项目目标实现网站中英文切换,全局所有组件文字同步更新,不需要刷新页面;语言翻译文本抽离独立文件,方便维护,适合多页面(首页、文章列表、商品列表、详情页&#xff…

2026/10/1 5:21:14

东莞市品牌网站建设报价常见报错与解决

东莞品牌网站建设报价单背后:一份保姆级建站教程避坑实录 网站做好了没人访问,这大概是很多老板最头疼的事。花了大几万做的品牌站,上线后流量惨淡,比路边摊还冷清。别急着骂外包公司,很多“东莞品牌网站建设报价”里藏着不少猫腻,比如用模板站冒充定制…

2026/10/1 17:09:46

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/10/1 10:48:55

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/10/2 0:02:57

PWN入门:从栈溢出原理到ROP链实战

1. 这不是“学PWN”,是重新理解你每天敲的每一行C代码我第一次在CTF赛场上写出能控制程序流的exp时,手抖得连gdb的c命令都输错三次。那道题只有23行C代码,一个gets()调用,一个printf(),一个return——它甚至没开NX&…

2026/10/2 0:02:57

Windows下cudaMallocHost显存占用之谜:WDDM与TCC模式差异及优化方案

1. 一个反直觉的显存占用现象第一次在 Windows 上看到cudaMallocHost把显存吃掉的时候,我的反应是打开任务管理器反复确认了三遍。明明调用的是主机端锁页内存分配,按 CUDA 文档的说法,这块内存应该落在系统 RAM 里,跟 GPU 的显存…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑