影刀RPA深度实战:京东商品数据批量采集与SKU价格抓取完整方案

发布时间:2026/10/14 0:46:41
影刀RPA深度实战:京东商品数据批量采集与SKU价格抓取完整方案 影刀RPA深度实战京东商品数据批量采集与SKU价格抓取完整方案作者林焱标签#影刀RPA #京东采集 #SKU抓取 #价格监控 #电商数据 #爬虫替代开篇为什么京东采集比淘宝难三倍去年我给一个3C卖家做竞品价格监控用惯了淘宝思路去搞京东连续踩了一周的坑才摸清门道。京东的难点不在于页面结构而在于它的动态渲染机制和登录态强依赖——很多价格根本不是写在HTML里的是JS执行后才渲染出来的。更烦的是SKU切换同一个商品点不同的颜色/规格URL不变但价格变了传统爬虫根本感知不到这个变化。影刀胜在它能真实驱动浏览器SKU切换、价格等待、登录保持都能处理。这篇我把完整方案拆给你看。一、准备工作环境配置与登录态保持1.1 浏览器环境选择京东对Selenium指纹检测很严强烈建议用影刀内置的Chrome而不是系统Chrome。影刀的浏览器做了指纹混淆处理实测检测率低得多。配置步骤打开影刀 → 新建流程 → 选择Web自动化浏览器设置里勾选使用内置浏览器启动参数加上--disable-blink-featuresAutomationControlled关键不加这个京东登录会触发验证码1.2 登录态保持方案这是我踩得最深的坑京东每隔约2小时会刷新session如果你的采集任务超过这个时长中途会静默登出数据开始出错但流程不报错。解决方案——用Cookie持久化# 影刀Python代码块保存并复用京东登录Cookie# 首次登录后执行此代码保存Cookie到本地文件importjsonimportosdefsave_jd_cookies(page): page: 影刀传入的页面对象 保存当前登录态Cookie到本地供后续复用 cookiespage.get_cookies()# 获取所有Cookie# 只保留京东主域Cookie过滤掉无用的第三方Cookiejd_cookies[cforcincookiesif.jd.cominc.get(domain,)]cookie_pathrC:\RPA_Data\jd_cookies.jsonos.makedirs(os.path.dirname(cookie_path),exist_okTrue)withopen(cookie_path,w,encodingutf-8)asf:json.dump(jd_cookies,f,ensure_asciiFalse,indent2)print(fCookie已保存共{len(jd_cookies)}条)returnTruedefload_jd_cookies(page): 加载已保存的Cookie实现免登录 注意需要先访问jd.com任意页面后再注入Cookie cookie_pathrC:\RPA_Data\jd_cookies.jsonifnotos.path.exists(cookie_path):print(Cookie文件不存在需要手动登录)returnFalsewithopen(cookie_path,r,encodingutf-8)asf:cookiesjson.load(f)# 检查Cookie是否过期京东的pt_pin和pt_key是关键登录标识has_pt_pinany(c.get(name)pt_pinforcincookies)has_pt_keyany(c.get(name)pt_keyforcincookies)ifnot(has_pt_pinandhas_pt_key):print(关键登录Cookie缺失需重新登录)returnFalsepage.add_cookies(cookies)# 注入Cookiepage.reload()# 刷新页面使Cookie生效returnTrue操作步骤影刀流程开头加一个执行Python代码节点粘贴load_jd_cookies函数并调用加一个条件判断如果返回False走手动登录分支如果True跳过登录直接开始采集1.3 验证登录状态不要假设Cookie有效就真的有效加一个验证步骤defverify_jd_login(page): 访问个人中心页面验证登录状态 返回True表示已登录False表示未登录 page.goto(https://home.jd.com/)# 等待页面加载完成page.wait_for_load_state(networkidle)# 检查是否存在登录后的用户名元素# XPath说明.user-info 是京东个人中心页登录后显示用户名的容器try:username_elempage.wait_for_selector(.user-info .nickname,timeout5000# 5秒超时)usernameusername_elem.inner_text()print(f当前登录用户{username})returnTrueexcept:print(未检测到登录状态)returnFalse二、核心采集商品基础信息2.1 商品列表页采集以搜索结果页为例影刀拖拽操作配合XPath场景从京东搜索蓝牙耳机采集前100个商品的ID、名称、价格、店铺。# 采集京东搜索结果列表# 目标页面https://search.jd.com/Search?keyword蓝牙耳机defcollect_jd_search_results(page,keyword,max_pages5): 采集搜索结果页的商品列表 XPath说明 - //li[classgl-item] : 商品列表每个条目的容器 - .//div[classp-img]/a : 商品图片链接href包含商品ID - .//div[classp-name]/a/em : 商品标题 - .//div[classp-price]/strong/i : 价格数字部分 - .//div[classp-shop]/span/a : 店铺名称 results[]base_urlfhttps://search.jd.com/Search?keyword{keyword}encutf-8forpage_numinrange(1,max_pages1):# 京东搜索翻页page参数奇数翻页规则1,3,5...urlf{base_url}page{page_num*2-1}page.goto(url)# 等待商品列表加载——关键京东用懒加载必须滚动才能触发page.wait_for_selector(#J_goodsList .gl-item,timeout10000)# 滚动到底部触发懒加载否则后半部分商品不显示page.evaluate(window.scrollTo(0, document.body.scrollHeight))page.wait_for_timeout(1500)# 等待懒加载完成page.evaluate(window.scrollTo(0, document.body.scrollHeight))page.wait_for_timeout(1000)# 获取所有商品条目itemspage.query_selector_all(#J_goodsList .gl-item)foriteminitems:try:# 提取商品ID从data-sku属性获取比从URL解析更可靠sku_iditem.get_attribute(data-sku)# 商品名称name_elemitem.query_selector(.p-name a em)namename_elem.inner_text()ifname_elemelse# 价格——注意价格是动态渲染的需要等待price_elemitem.query_selector(.p-price strong i)priceprice_elem.inner_text()ifprice_elemelse0# 店铺信息shop_elemitem.query_selector(.p-shop span a)shopshop_elem.inner_text()ifshop_elemelse京东自营# 评论数comment_elemitem.query_selector(.p-commit strong a)commentscomment_elem.inner_text()ifcomment_elemelse0results.append({sku_id:sku_id,name:name.strip(),price:float(price.replace(,,)),shop:shop.strip(),comments:comments,page:page_num,url:fhttps://item.jd.com/{sku_id}.html})exceptExceptionase:print(f解析商品失败{e})continueprint(f第{page_num}页采集完成当前共{len(results)}条)# 翻页间隔模拟人工操作避免触发风控page.wait_for_timeout(2000page_num*500)returnresults2.2 商品详情页采集含PC/APP差异处理我之前做3C品类监控时遇到的坑京东部分商品特别是大件家电强制跳转到APPPC端只显示请用APP查看这种情况需要在URL后面加参数强制PC显示。defcollect_jd_detail(page,sku_id): 采集商品详情页完整信息 注意事项 1. 部分商品会重定向到 https://item.m.jd.com/ 移动版需要强制PC访问 2. 价格通过API接口获取比页面抓取更稳定 3. SKU信息藏在页面内嵌的JavaScript变量里 # 强制访问PC版商品详情防止移动端重定向detail_urlfhttps://item.jd.com/{sku_id}.html# 设置User-Agent为PC浏览器影刀支持在请求头里设置page.goto(detail_url)page.wait_for_load_state(domcontentloaded)# 检查是否被重定向到移动端current_urlpage.urlifitem.m.jd.comincurrent_url:# 强制回到PC端page.goto(detail_url?forcePC1)page.wait_for_load_state(domcontentloaded)# 从页面内嵌JS变量提取SKU信息比XPath更可靠# 京东把商品详细信息存在window.pageConfig对象里sku_infopage.evaluate( () { try { // window.pageConfig.product 包含商品基础信息 // window.pageConfig.product.skus 包含所有SKU变体 return { product_id: window.pageConfig.product.wareId, cat_id: window.pageConfig.product.cat.join(,), shop_id: window.pageConfig.shop.shopId, skus: window.pageConfig.product.skus || [] }; } catch(e) { return null; } } )# 获取商品基本信息title_elempage.query_selector(.sku-name)titletitle_elem.inner_text()iftitle_elemelsereturn{sku_id:sku_id,title:title.strip(),sku_info:sku_info,url:page.url}三、SKU变体采集最复杂部分3.1 SKU变体逻辑说明京东SKU变体的核心难点点击不同规格时价格通过AJAX异步更新URL不变。普通截图类方法完全抓不到变化。正确方案拦截网络请求defcollect_all_skus(page,sku_id): 采集商品所有SKU变体的价格 原理监听京东价格查询API的响应 京东价格API格式 https://p.3.cn/prices/mgets?skuIdsJ_{sku_id}type1 返回格式[{id:J_xxx,p:价格,m:原价,op:...}] all_sku_prices{}# 先从页面JS变量获取所有SKU ID列表sku_listpage.evaluate( () { // colorSize是京东存储颜色/尺码规格的JS变量 if (window.colorSize) { return window.colorSize.map(item item.skuId); } // 备选方案从商品规格选择器获取 const skuItems document.querySelectorAll([data-sku]); return Array.from(skuItems).map(el el.getAttribute(data-sku)); } )ifnotsku_list:print(fSKU{sku_id}无变体规格)return{}print(f共发现{len(sku_list)}个SKU变体{sku_list})# 批量查询价格京东价格API支持批量查询效率更高# 每次最多查50个SKUbatch_size50foriinrange(0,len(sku_list),batch_size):batchsku_list[i:ibatch_size]sku_ids_paramskuIds.join([fJ_{s}forsinbatch])price_urlfhttps://p.3.cn/prices/mgets?skuIdsJ_{sku_ids_param}type1# 用影刀的HTTP请求节点发送比页面导航更快importurllib.requestimportjson requrllib.request.Request(price_url,headers{Referer:fhttps://item.jd.com/{sku_id}.html,User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36})withurllib.request.urlopen(req,timeout10)asresp:price_datajson.loads(resp.read().decode(utf-8))foriteminprice_data:sku_keyitem[id].replace(J_,)all_sku_prices[sku_key]{price:float(item.get(p,0)),# 现售价market_price:float(item.get(m,0)),# 原价/划线价op:item.get(op,)# 限时特价}page.wait_for_timeout(500)# 避免请求过于频繁returnall_sku_prices3.2 规格属性与SKU的对应关系defmap_sku_attributes(page): 提取SKU变体的规格属性映射 例如SKU 100012345678 对应 颜色黑色, 内存128G XPath说明 - .//div[idspec-list] : 规格选择区域的容器 - .//div[data-type选择版本] : 具体规格类型颜色/内存等 - .//li[data-sku...] : 每个规格选项data-sku关联具体SKU sku_attr_mappage.evaluate( () { const result {}; // 遍历所有规格选择区域 const specAreas document.querySelectorAll(.J-skin-main .dd); specAreas.forEach(area { // 规格名称颜色、内存等 const specName area.previousElementSibling?.innerText?.trim() || ; // 该规格下的所有选项 const items area.querySelectorAll(li[data-sku]); items.forEach(item { const skuId item.getAttribute(data-sku); const attrValue item.getAttribute(title) || item.innerText.trim(); if (!result[skuId]) result[skuId] {}; result[skuId][specName] attrValue; }); }); return result; } )returnsku_attr_map四、评价数据采集4.1 评价翻页的陷阱我之前遇到的坑京东评价页显示共500页但实际只能翻到第100页后面的请求返回空数据。更坑的是第100页之后京东会悄悄返回第1页的数据导致你以为还在采集新数据实际上在重复。defcollect_jd_reviews(page,sku_id,max_pages100): 采集商品评价通过API接口而非页面截图 京东评价API https://club.jd.com/comment/productPageComments.action 参数说明 - productId: 商品ID注意不是SKU ID有时不同 - pageSize: 每页评价数量最大10 - pageNum: 页码从0开始 - score: 评分筛选0全部1-5星级 - sortType: 排序5最新6最有用 importurllib.requestimportjson reviews[]page_num0seen_review_idsset()# 去重集合防止京东返回重复数据whilepage_nummax_pages:api_url(fhttps://club.jd.com/comment/productPageComments.actionf?productId{sku_id}pageSize10pageNum{page_num}fscore0sortType5page0pageSize10isShadowSku0)requrllib.request.Request(api_url,headers{Referer:fhttps://item.jd.com/{sku_id}.html,User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36,Accept:application/json})try:withurllib.request.urlopen(req,timeout10)asresp:datajson.loads(resp.read().decode(utf-8))exceptExceptionase:print(f评价API请求失败页码{page_num}{e})breakcomment_listdata.get(comments,[])ifnotcomment_list:print(f第{page_num}页无数据停止采集)break# 检测是否在返回重复数据京东翻页限制的标志first_idcomment_list[0].get(id,)iffirst_idinseen_review_idsandpage_num5:print(f检测到重复数据评价采集在第{page_num}页停止京东翻页限制)breakforcommentincomment_list:review_idcomment.get(id,)ifreview_idinseen_review_ids:continueseen_review_ids.add(review_id)reviews.append({id:review_id,score:comment.get(score,0),# 评分1-5content:comment.get(content,),# 评价内容nickname:comment.get(nickname,),creation_time:comment.get(creationTime,),sku_name:comment.get(productColor,),# 购买的规格useful_vote:comment.get(usefulVoteCount,0),reply_count:comment.get(replyCount,0)})page_num1# 评价采集间隔要更长京东评价接口限频更严page.wait_for_timeout(1000page_num*100)print(f评价采集完成共{len(reviews)}条)returnreviews五、数据存储与导出importcsvimportosfromdatetimeimportdatetimedefsave_to_csv(data_list,filenameNone): 将采集数据保存为CSV 支持自动生成带时间戳的文件名 ifnotfilename:timestampdatetime.now().strftime(%Y%m%d_%H%M%S)filenamefC:/RPA_Data/jd_data_{timestamp}.csvos.makedirs(os.path.dirname(filename),exist_okTrue)ifnotdata_list:print(无数据可保存)return# 自动从第一条数据推断字段名fieldnameslist(data_list[0].keys())withopen(filename,w,newline,encodingutf-8-sig)asf:# utf-8-sig带BOM的UTF-8Excel直接打开不乱码writercsv.DictWriter(f,fieldnamesfieldnames)writer.writeheader()writer.writerows(data_list)print(f已保存{len(data_list)}条数据到{filename})returnfilename六、常见问题速查现象原因解决方式搜索结果只有60条实际有几百条京东懒加载未触发后半部分商品未渲染添加多次scrollTo操作后再提取每次滚动后等待1.5秒价格显示–或0商品已下架或登录后才显示会员价格检查登录状态对下架商品做标记跳过采集100个商品后流程卡住京东触发风控弹出验证码弹窗添加验证码检测节点检测.verification-wrap是否存在存在则暂停并告警SKU切换后价格不更新等待时间不足价格AJAX未完成在点击SKU后添加wait_for_response监听p.3.cn域名的响应评价采集到第50页全是重复数据京东评价翻页上限约50-100页用seen_review_ids集合去重并检测到重复时主动停止Cookie注入后仍需重新登录注入Cookie前未访问jd.com使域名生效先page.goto(https://www.jd.com)再注入Cookie再刷新七、推荐资源影刀官方文档→ 网页自动化 → 等待元素章节学好等待是京东采集成功的关键Chrome DevTools→ Network标签 → 筛选XHR → 找p.3.cn价格接口和club.jd.com评价接口JSON Viewer插件Chrome扩展格式化查看京东API返回的JSON便于分析字段含义影刀社区→ 搜索京东有不少同行分享的XPath库可以直接复用最后说一句京东的反爬策略一直在更新本文的XPath和API截至2024年底可用建议收藏后定期回来看看评论区是否有更新。遇到问题欢迎评论我尽量回复。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询