新闻详情

新闻详情

首页 / 资讯中心 / 详情

Selenium+代理IP绕过京东反爬:商品数据采集实战方案

发布时间:2026/10/2 1:12:57来源:尧图网络
Selenium+代理IP绕过京东反爬:商品数据采集实战方案
相信不少做过电商数据采集的朋友都遇到过这种情况昨天还能正常跑的爬虫脚本今天突然返回一堆乱码或者直接弹出滑块验证。京东在这方面算是国内电商平台里反爬升级比较勤快的了尤其是针对Selenium这类自动化工具的检测从早期的简单UA校验到后来的WebDriver特征识别再到现在的行为轨迹分析和TLS指纹校验基本一年一个大版本。我前阵子刚完成一轮京东商品数据的采集脚本重构整个过程踩了不少坑也总结出一套目前还算稳定的方案。这篇文章就把完整思路和代码分享出来重点讲怎么用Selenium配合代理IP绕过京东最新的反爬机制希望能给正在做同类项目的朋友一些参考。先说清楚这套方案主要用于京东商品价格、标题、评论数等公开数据的采集采集频率控制在较低水平仅用于个人学习和研究。高频采集、商业用途不在讨论范围内也容易触发更严厉的反制措施。1. 京东反爬机制的核心逻辑与破解思路1.1 京东目前的反爬体系到底在检测什么很多人以为京东的反爬就是看访问频率IP访问太快就封其实远没那么简单。我通过反复测试和抓包分析京东现在的反爬体系至少在四个维度同时做校验第一层是基础请求特征检测。包括User-Agent、Accept-Language、Connection头、Cookie完整性等。这部分通过requests库模拟就能过但它是第一道门槛过不了后面全白搭。京东对UA的校验比较严格缺失UA或者UA里带着无头浏览器特征的请求会直接在网关层被拦掉。第二层是浏览器环境指纹检测。这是针对Selenium等自动化工具的核心检测层。京东前端会注入一段JS脚本检测window.navigator.webdriver属性是否为true检测window.chrome对象是否存在检测navigator.plugins数组长度甚至通过Canvas指纹、WebGL渲染信息来判断当前浏览器是否真实。Selenium原生启动的Chrome浏览器这些特征都和有头用户操作的真实浏览器有明显差异。第三层是行为轨迹分析。检测鼠标移动轨迹、滚动行为、点击间隔、页面停留时间是否符合人类操作习惯。机器模拟的鼠标轨迹通常是从A点直线移动到B点速度恒定没有加速减速过程而且点击间隔高度规律。京东会把行为数据打包上传到风控服务器做离线分析所以有时候当时没事过几天才被限制。第四层是IP与账号信誉度评估。数据中心IP、机房IP、共享代理IP的IP段评分通常比较低一旦同一IP段在短时间内发起大量请求会触发频率限制和滑块验证。这个维度没法完全规避只能靠代理IP轮换来降低单IP的压力。1.2 为什么纯requests方案越来越难走通过去采集京东数据用requests模拟HTTP请求带上Cookie和UA基本就能拿到数据。但现在京东的很多商品详情页数据是通过异步接口动态加载的关键数据接口加了签名参数_pdr、_pvid、fingerprint等这些参数由前端JS动态生成依赖浏览器环境计算反向分析成本极高。另外京东H5端的接口返回数据经常带上脱敏后的价格真实价格需要登录后才可见。手机端的部分接口还需要配合设备的唯一标识符。这些限制让纯HTTP方案的开发和维护成本变得非常高而Selenium这种模拟真实浏览器操作的方式至少在环境指纹这一层能过掉大部分检测。1.3 我的整体技术方案选型经过对比测试我最终选定的方案是Selenium 4.x Chrome浏览器的有头模式Headless在京东的场景下几乎必被识别 代理IP池 行为轨迹模拟 合理限速。这里特意说明一下为什么不用Headless模式。Selenium的Headless模式在Chrome 112版本之后虽然和正常浏览器共用同一个二进制但navigator.webdriver检测、window.chrome检测这些特征依然和真实浏览器有差异。实测下来京东只要发现WebDriver特征会直接拒绝加载商品详情数据返回一个空壳页面。用有头模式加最小化窗口配合代理IP是目前性价比最高的方案。2. 环境准备与基础配置2.1 开发环境与依赖库安装我的环境配置如下大家可以根据自己的系统做调整Python 3.9及以上版本Chrome浏览器保持最新版我用的是122.xChromeDriver版本必须和Chrome匹配Selenium 4.x不建议用3.xAPI差别较大requests库用于代理API调用安装Seleniumpip install selenium requestsChromeDriver的下载和安装这里不多说重点提醒一个坑Chrome浏览器的自动更新机制可能导致Driver版本不匹配。我建议在代码里做版本检查或者直接用Selenium ManagerSelenium 4.6以上版本内置它会自动匹配并下载对应版本的ChromeDriver省去手动维护的麻烦。2.2 代理IP的选择与接口对接代理IP这块是重头戏也是决定采集成功率的关键因素。我测试了几种类型的代理数据中心代理IDC代理速度快价格便宜但IP段在风控系统中的评分普遍偏低容易被识别。京东对机房IP的检测比较敏感经常出现请求能发出去、页面也返回了但敏感数据被替换成加密串的情况。建议是作为备选方案不要作为主力。住宅代理Residential Proxy带宽真实、IP段干净检测难度高但价格也高。如果一个项目需要长期跑数据且对成功率要求很高建议用住宅代理。网络规模主流的有国外代理ip服务商如Luminati、Bright Data等也有国内的一些厂商稳定性差别不算太大主要看IP池规模和响应速度。动态短效代理动态IP代理每次请求分配一个新的IPIP只有几分钟甚至几十秒的有效期。这类代理做数据采集最友好不用自己做IP池管理缺点是访问速度不稳定需要做重试机制来兜底。我最终用的是动态短效代理通过一个HTTP API拉取IP间隔30秒拉一次每次拿到5个IP轮换使用。这样既保证了IP的多样性又降低了单IP的请求压力。核心的代理获取和切换逻辑import requests import itertools class ProxyManager: def __init__(self, api_url, interval30): self.api_url api_url self.interval interval self.proxy_list [] self.current_index 0 def fetch_proxies(self): resp requests.get(self.api_url, timeout5) if resp.status_code 200: data resp.json() self.proxy_list data.get(data, []) self.current_index 0 def get_next_proxy(self): if not self.proxy_list: self.fetch_proxies() if not self.proxy_list: return None proxy self.proxy_list[self.current_index % len(self.proxy_list)] self.current_index 1 return proxy3. 核心代码实现与反检测配置3.1 Selenium启动参数的关键配置Selenium启动浏览器的参数设置直接决定了能否通过京东的环境指纹检测。我总结了几个关键参数的配置逻辑from selenium import webdriver from selenium.webdriver.chrome.options import Options def create_driver(proxy): options Options() # 基本配置 options.add_argument(--window-size1920,1080) options.add_argument(--disable-blink-featuresAutomationControlled) options.add_argument(--disable-infobars) options.add_argument(--langzh-CN) # 代理配置 if proxy: options.add_argument(f--proxy-server{proxy}) # 关闭GPU加速减少资源占用 options.add_argument(--disable-gpu) # 使用真实浏览器User-Agent options.add_argument(--user-agentMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36) # 排除自动化控制标志 options.add_experimental_option(excludeSwitches, [enable-automation]) # 禁用自动化扩展 options.add_experimental_option(useAutomationExtension, False) # 设置偏好参数 prefs { profile.default_content_setting_values.notifications: 2, credentials_enable_service: False, profile.password_manager_enabled: False } options.add_experimental_option(prefs, prefs) driver webdriver.Chrome(optionsoptions) # 隐藏webdriver特征 driver.execute_cdp_cmd(Page.addScriptToEvaluateOnNewDocument, { source: Object.defineProperty(navigator, webdriver, { get: () undefined }); Object.defineProperty(navigator, plugins, { get: () [1, 2, 3, 4, 5] }); Object.defineProperty(navigator, languages, { get: () [zh-CN, zh] }); }) return driver这段代码里最核心的有两个部分。第一个是options.add_argument(--disable-blink-featuresAutomationControlled)这个参数能去掉Chrome的自动化控制标志让navigator.webdriver属性不再是默认的true。当然现在京东的检测脚本没那么傻光靠这一个参数已经不够了还需要配合下面这段CDP命令。第二个是driver.execute_cdp_cmd(Page.addScriptToEvaluateOnNewDocument, ...)这段会在每次页面加载之前注入JS脚本从底层navigator对象里覆盖掉webdriver、plugins、languages这些自动化痕迹。实测下来这套组合能让Selenium模拟的浏览器在环境指纹上和真实Chrome几乎一致。3.2 绕过滑块验证与行为模拟即使环境指纹做得再干净如果操作行为像机器一样会被拦。京东的滑块验证出现过几次版本迭代目前我遇到的主要是两种一种是拖动式滑块需要将滑块拖到指定位置一种是点选式验证需要在图中找出目标物体并点击。点选式验证通过Selenium自动处理的难度极高目前没有稳定方案所以尽量在行为模拟上做足功夫避免触发验证。对于拖动式滑块我试过纯坐标拖动也试过模拟人类拖拽轨迹的算法分享一个相对有效的方案import random import time def human_like_drag(driver, slider_element, target_x): 模拟人类拖拽滑块 from selenium.webdriver.common.action_chains import ActionChains # 生成带随机抖动的移动轨迹 steps random.randint(15, 25) current_x 0 action ActionChains(driver) action.click_and_hold(slider_element) for i in range(steps): # 每步移动距离不固定带随机加速度 if i steps * 0.3: # 先快速接近目标位置 step_x random.uniform(target_x / steps * 1.5, target_x / steps * 2) elif i steps * 0.7: # 中段放慢 step_x random.uniform(target_x / steps * 0.5, target_x / steps) else: # 末段微调 step_x random.uniform(target_x / steps * 0.1, target_x / steps * 0.5) # 加上随机的上下偏移 step_y random.uniform(-2, 2) action.move_by_offset(min(step_x, target_x - current_x), step_y) current_x step_x action.pause(random.uniform(0.01, 0.05)) # 在目标位置略微停顿后释放 action.pause(random.uniform(0.1, 0.3)) action.release() action.perform()这个轨迹生成的核心思路是先快速靠近目标再放慢进入最后微调整体曲线符合人类肌肉控制的特点。纯粹的匀速直线拖动会被行为分析模型一眼看穿。不过我这里有个实际经验滑块验证的完整破解周期很长不同账号、不同IP、不同时间段的滑块形态都有差异。如果你只需要采集商品标题、图片、价格等基础数据其实可以考虑绕开滑块用不触发验证的方式获取数据。比如通过手机端H5页面或者直接调用无登录态的数据接口验证概率会低很多。3.3 商品详情页数据提取实现拿到页面之后提取数据的逻辑相对简单但需要注意页面结构的兼容性。京东的商品页前几年改版过几次字段位置有所变动建议用多选择器兜底的方式提取from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC def parse_product_info(driver, url): driver.get(url) # 等待页面核心元素加载完成 WebDriverWait(driver, 15).until( EC.presence_of_element_located((By.CSS_SELECTOR, div.itemInfo-wrap)) ) # 随机延迟模拟人类阅读时间 time.sleep(random.uniform(2, 5)) product {} # 标题提取 try: title_el driver.find_element(By.CSS_SELECTOR, div.itemInfo-wrap .sku-name) product[title] title_el.text.strip() except Exception: product[title] # 商品编号 try: sku_id url.split(/)[-1].replace(.html, ) product[sku_id] sku_id except Exception: product[sku_id] # 价格 - 最多重试3次 price None for _ in range(3): try: price_el driver.find_element(By.CSS_SELECTOR, span.priceJd) price price_el.get_attribute(data-price) if not price: price price_el.text.strip().replace(, ) if price: break except Exception: time.sleep(random.uniform(1, 2)) product[price] price return product这里需要补充说明的是京东商品价格在不同状态下的展示逻辑有差异。未登录状态下部分商品价格会被加密或显示为促销区间登录状态下不同账号可能看到不同的促销价格。如果你采集的价格需要精确到某个级别尽量在登录状态下操作或者结合多个价格源交叉验证。3.4 完整采集主流程把上面的模块串起来完整的采集流程如下import random import time import pandas as pd def crawl_jd_product(keyword, max_pages3): proxy_manager ProxyManager(http://你的代理API地址) proxy_manager.fetch_proxies() # 构建搜索URL base_url fhttps://search.jd.com/Search?keyword{keyword}encutf-8 results [] for page in range(1, max_pages 1): # 每隔一段时间换代理 proxy proxy_manager.get_next_proxy() if not proxy: print(获取代理失败等待重试) time.sleep(5) continue driver None try: driver create_driver(proxy[http]) if page 1: url base_url else: url f{base_url}page{page} driver.get(url) time.sleep(random.uniform(3, 6)) # 滚动页面模拟人类浏览行为 for _ in range(random.randint(3, 6)): driver.execute_script(fwindow.scrollBy(0, {random.randint(300, 800)});) time.sleep(random.uniform(0.5, 1.5)) # 提取商品列表 items driver.find_elements(By.CSS_SELECTOR, li.gl-item) for item in items: try: link item.find_element(By.CSS_SELECTOR, div.p-name a) product_url link.get_attribute(href) title link.text.strip() price_el item.find_element(By.CSS_SELECTOR, div.p-price i) price price_el.text.strip() results.append({ title: title, price: price, url: product_url }) except Exception as e: continue print(f第{page}页采集完成获取{len(items)}条商品累计{len(results)}条数据) except Exception as e: print(f第{page}页采集失败: {e}) finally: if driver: driver.quit() # 页面间随机延时控制请求频率 time.sleep(random.uniform(8, 15)) return pd.DataFrame(results) if __name__ __main__: df crawl_jd_product(机械键盘, max_pages3) df.to_csv(jd_keyboard_products.csv, indexFalse, encodingutf-8-sig) print(f采集完成共保存{len(df)}条数据)搜索列表页的采集逻辑相对稳定核心的风险点在于翻页之后的IP频率限制。我每隔8到15秒才翻一次页每个IP最多跑两到三页两天实测下来基本不会触发滑块验证。4. 常见问题与排查技巧实录4.1 页面返回空壳数据商品信息无法提取这是一个高频问题。表现是页面能加载浏览器的地址栏能看到商品标题但程序里提取不到任何数据页面上大量关键DOM节点被替换成空节点。排查步骤第一确认是不是被京东风控识别了。打开页面前先手动用同样的IP和浏览器访问一次看看能否正常显示数据。如果手动访问也异常说明IP或者浏览器指纹已经被标记换个代理即可。第二检查Cookie状态。部分商品信息在无登录态下会降级展示尤其是价格数据。此时可以清空Cookie后重新访问或者优化登录流程。第三检查页面是否有验证码。如果返回的HTML中包含nc_wrapper相关的DOM节点说明触发了滑块验证或验证码弹窗。4.2 Selenium启动后WebDriver属性无法隐藏这个问题的原因是ChromeDriver版本和注入脚本时机不一致。Page.addScriptToEvaluateOnNewDocument要求在页面加载前注入如果注入时机晚于页面文档解析navigator.webdriver就会被读取到原始值。解决方式有两种第一种把注入代码放在create_driver函数中确保在driver.get()任何URL之前执行。第二种升级到Selenium 4.6以上版本配合最新ChromeDriver稳定性会好很多。4.3 代理IP频繁失效导致请求超时动态短效代理的稳定性取决于服务商。我遇到过代理列表中部分IP端口无法连接的情况需要增加代理验证和自动重试机制def get_valid_proxy(proxy_manager, timeout10): 获取一个可用代理失败自动换下一个 for _ in range(5): proxy proxy_manager.get_next_proxy() if not proxy: return None proxy_url f{proxy[http]} try: test_resp requests.get(https://www.jd.com, proxies{http: proxy_url, https: proxy_url}, timeouttimeout) if test_resp.status_code 200: return proxy except Exception: continue return None这层验证逻辑会增加一点延时但能显著减少因为代理无效导致的浏览器启动又退出。4.4 采集一段时间后触发滑块验证如果采集过程中突然出现滑块验证处理方式有两种第一种立即暂停程序等待滑块验证失效一般5到15分钟会自动消失。第二种切换全新IP和全新浏览器实例重新启动。我这里要特别说一句即使加了代理和指纹隐藏京东对长时间连续性采集行为的识别依然很精准。最佳策略还是控制采集频率把每小时请求量压在一个相对安全的水平。毕竟做数据采集核心是细水长流不是一次性全量拉取。5. 优化与进阶方向5.1 登录态的引入登录后采集能获取到更准确的促销价格、优惠券信息也能有效降低风控等级。但登录操作本身会引入更多变量比如登录验证码、短信验证、设备绑定等。我的建议是如果对价格精度要求不高优先不登录如果一定要登录用独立的账号体系并且单账号的并发请求量一定要控制住。5.2 数据接口直连方案Selenium方案虽然在指纹模拟上更彻底但性能有限每个页面的加载和解析至少需要5到10秒。如果采集规模更大可以考虑中间人代理方案用Selenium只做浏览器环境搭建真实的数据请求通过requests库直连京东的异步接口完成。具体做法是用Selenium访问页面拿到完整Cookie然后退出Selenium用requests配合这些Cookie请求商品详情接口。这样能大幅提升采集速度同时保留Cookie中的真实性验证信息。5.3 分布式采集的架构思路如果采集规模到了每天几十万条级别单机Selenium方案就不太够用了。可以考虑用Redis做一个分布式任务队列多台机器各自运行采集节点任务队列里放商品链接采集结果统一写入数据库。代理IP这块可以单独做一个代理池服务统一管理IP的获取、验证、释放这样多个节点之间的IP不会交叉使用降低了同一个IP段被集中标记的风险。这个架构的复杂度比我上面分享的代码高不少但大的采集项目早晚会走到这一步算是一个方向参考。5.4 爬虫框架的替代思考现在也有不少人转向使用Scrapling这类新一代爬虫框架或者把Selenium仅用于获取Cookie和Token页面解析交给lxml、parsel这些高效的解析库。Selenium在这个链条里的定位越来越像一个“环境模拟器”而不是一个“数据抓取器”。这个思路和我的方案并不冲突实际项目里甚至可以结合着用。先把采集链路跑通后续再根据需求做性能优化。5.5 成本与稳定性的平衡建议最后聊一下长期运营的成本控制。代理IP是整个方案里每时每刻都在消耗的资源选择代理时要重点关注几个指标IP池的可用率能用与提取比例、切换速度、并发支持数。先买小额套餐测试1到2天观察采集成功率和代理用量再决定是否扩容。另外不要把鸡蛋放在一个篮子里。建议至少接入两家代理服务商的API做双保险一家挂了可以自动切换到另一家避免采集中断。回到我个人的实际操作体会京东的反爬体系一直在迭代今天能用的隐蔽手段过几个月可能就失效了。保持对浏览器环境和反爬策略的持续关注比任何一套固定代码都重要。如果你正在规划这个方向的采集项目建议先小批量跑通流程再逐步放量这样遇到风控升级时损失和调整成本都是可控的。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

SpringBoot+Vue+MyBatis人员管理系统开发实战全解析 2026/10/2 2:41:47

SpringBoot+Vue+MyBatis人员管理系统开发实战全解析

这段时间后台收到不少私信,都是冲着“人员管理系统”源码来的。仔细翻了下聊天记录,发现大部分朋友的需求其实都差不多:毕业设计要用、公司内部要做个简单的HR管理后台、或者想练手整合一套主流技术栈。这次拿到的是一个很典型的组合——Spri…

阅读更多 →
Python数据可视化实战:网易云音乐歌单分析系统全拆解 2026/10/2 2:41:47

Python数据可视化实战:网易云音乐歌单分析系统全拆解

简介:一套基于Python数据可视化的网易云音乐歌单分析系统源码及文档说明,面向Python期末大作业、数据分析与可视化课程设计,适合需要快速完成高质量项目的在校学生。系统功能完善,覆盖歌单数据采集、清洗、统计分析及多角度可视化…

阅读更多 →
UMDF2驱动开发实战:从源码拆解到上位机调试 2026/10/2 2:41:47

UMDF2驱动开发实战:从源码拆解到上位机调试

简介:面向Windows驱动开发者的UMDF2驱动程序开发源码包,围绕“UMDF2 Driver1”驱动项目与“MFCApplication1”上位机程序展开,演示用户模式驱动从设备创建、I/O队列管理到与应用程序通过IOCTL通信的完整链路。资源共116个文件,涵盖…

阅读更多 →
LeetCode Python题解实战:从环境配置到高频题型避坑指南 2026/10/2 2:41:47

LeetCode Python题解实战:从环境配置到高频题型避坑指南

简介:该资源收录LeetCode题库的Python完整解答,覆盖数组、链表、树、动态规划、回溯、图论等核心算法专题,适合正在备战技术面试、希望系统梳理算法知识体系的中级及以上Python开发者。包内共1160个文件,主体为579个.py源码与580个…

阅读更多 →
猕猴桃检测数据集VOC与YOLO双格式详解:解压校验训练避坑指南 2026/10/2 2:41:34

猕猴桃检测数据集VOC与YOLO双格式详解:解压校验训练避坑指南

简介:这是一份面向目标检测与深度学习实践者的猕猴桃检测数据集,采用Pascal VOC与YOLO双格式标注,可直接用于模型训练、评估与农业视觉场景验证。资源包共2000个文件,主要包含VOC格式XML标注文件与YOLO格式TXT标注文件&#xff0c…

阅读更多 →
CNN人脸表情识别源码实战:从环境配置到推理部署的避坑指南 2026/10/2 2:41:34

CNN人脸表情识别源码实战:从环境配置到推理部署的避坑指南

简介:这份资源是面向深度学习入门者与计算机视觉方向学习者的面部表情识别系统完整项目源码,基于卷积神经网络实现,可用于课程设计、毕业设计或算法练手。项目采用fer2013人脸数据集,覆盖图像获取、预处理、特征提取与分类判别等完…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉