电商竞品数据采集实战:商品价格、库存、评论的自动化抓取方案
竞品采集到底在采什么
做电商竞品监控,说到底就是盯着对手三个东西:价格、库存、评论。价格变了你要第一时间知道,库存空了你得赶紧补位,评论里冒出差评了你要研究对手的弱点。这三样数据加起来,就是竞品情报的基本盘。
但真上手采过的人都知道,这三样数据的抓取难度完全不在一个量级。价格相对好采——大部分平台的价格直接写在HTML里。库存就难了——很多平台不直接显示库存数量,你得从"仅剩X件"或"到货通知"这类间接信号推断。评论最难——平台对评论接口的反爬最严,分页深度大,数据结构复杂。
三个维度的采集难点
价格采集
价格是变化最频繁的维度,一个SKU一天可能调价3-5次。采集价格的核心难点有两个:一是动态渲染,部分平台价格通过JS加载,requests拿到的HTML里价格位置是空的;二是多规格SKU,同一商品不同颜色不同配置价格不同,需要遍历所有规格组合。
| 难点 | 原因 | 对策 |
|---|---|---|
| 动态渲染 | 价格通过JS动态加载 | 无头浏览器渲染后提取,或直接请求价格接口 |
| 多规格SKU | 不同规格价格不同 | 遍历所有SKU规格组合分别采集 |
| 价格类型多 | 划线价、促销价、到手价并存 | 三种价格同时采集,记录完整价格链 |
| 反爬严格 | 价格页面高频访问受限 | 短效动态IP高频轮换分散请求 |
库存采集
库存是最难直接获取的维度。大多数平台不公开库存数量,需要从间接信号推断。
库存信号的四种类型:
| 信号类型 | 页面表现 | 库存判断 |
|---|---|---|
| 直接显示 | “仅剩X件” | 精确数量 |
| 按钮状态 | "立即购买"可点 vs “到货通知” | 有货/无货 |
| 购物车限购 | 加入购物车提示"限购X件" | 推断库存量级 |
| 区域差异 | 不同城市显示不同库存 | 用不同城市IP对比采集 |
评论采集
评论是数据量最大、反爬最严的维度。一个热门商品可能有上万条评论,分页可能超过100页。
评论采集的核心挑战:
- 分页深度大:需要自动翻页,控制频率避免触发反爬
- 接口加密:部分平台评论接口参数有签名验证
- 评论类型多:初始评论、追评、图片评论、视频评论结构不同
- 排序差异:默认排序和时间排序返回不同评论,需要分别采集
代理IP方案
国内电商采集
国内电商平台用网帆代理短效动态IP,API请求格式:
http://api.fanproxy.com/?key=abc123&area=110100&isp=电信&count=2&pattern=json&rreg=true&rcity=true&risp=true&rexp=true
area指定城市代码(如110100为北京),isp指定运营商,count控制获取IP数量。网帆代理短效动态IP池规模3000万+,覆盖全国300+城市,IP纯净度99.83%,平均延迟0.03秒,支持1-30分钟灵活轮换。
海外电商采集
海外电商平台用网帆代理动态住宅IP,API请求格式:
http://api.fanproxy.com/?key=abc123&cnt=AS&cty=JP&count=2&pattern=json&rcnt=true&rcty=true&rreg=true&risp=true&rexp=true
cnt指定洲代码(AS亚洲、EU欧洲、NA北美),cty指定国家代码(如JP日本、US美国)。网帆代理动态住宅IP汇聚全球200+国家及地区的9000万+真实家庭住宅节点,可用率99.9%。
注意: 网帆代理海外动态住宅IP产品仅支持在境外网络环境下使用。
轮换策略
| 采集维度 | 推荐产品 | 轮换周期 | 单IP频率上限 | 理由 |
|---|---|---|---|---|
| 商品价格 | 短效动态IP | 1-3分钟 | 5-8次/分钟 | 价格变动快,需高频采集 |
| 库存状态 | 短效动态IP | 5-10分钟 | 8-12次/分钟 | 库存变动相对慢 |
| 商品评论 | 短效动态IP | 5-10分钟 | 3-5次/分钟 | 评论接口反爬严,需降速 |
| 海外平台 | 动态住宅IP | 按会话轮换 | 3-5次/分钟 | 住宅IP信任度高 |
抓取方案设计
价格抓取要点
价格抓取的核心是"拿到正确的数字"。听起来简单,实际操作中有三个坑:
坑一:动态渲染。 部分平台的价格通过JavaScript动态加载,requests拿到的HTML里价格位置是空的。两种解法:一是用无头浏览器(Playwright/Selenium)等待页面渲染完成后提取;二是分析页面的AJAX价格接口,直接请求接口拿JSON数据,绕过HTML解析。第二种方式更快更稳定,但需要逆向分析接口逻辑。
坑二:多价格类型。 一个商品页面上可能同时出现划线价(原价)、促销价、到手价(优惠券后价格)。只采一个价格会导致数据失真——你以为竞品降价了,其实只是优惠券变了。建议三种价格同时采集,记录完整价格链。
坑三:多规格SKU。 同一商品不同规格(颜色、尺寸、配置)价格不同。需要遍历所有SKU规格组合分别采集。部分平台的SKU价格需要点击规格按钮后才动态加载,这种情况下无头浏览器是更可靠的选择。
价格采集核心逻辑:
# 价格采集关键步骤(伪代码)
proxy = get_proxy_from_fanproxy(area="110100", isp="电信")
response = request_via_proxy(url, proxy)
price = extract_price(response, selector=".price-current")
# 同时记录划线价、促销价、到手价
prices = {
"original": extract_price(response, ".price-original"),
"promotion": extract_price(response, ".price-promotion"),
"final": extract_price(response, ".price-final")
}
库存抓取要点
库存抓取的核心是"从间接信号推断"。大多数平台不直接告诉你库存还剩多少,需要从页面文本中提取线索。
库存信号关键词映射:
| 库存状态 | 关键词信号 | 判断逻辑 |
|---|---|---|
| 有货 | “有货”“现货”"立即购买"可点击 | 按钮可点击=有货 |
| 低库存 | “仅剩X件”“库存紧张”“少量” | 提取数字即为库存量 |
| 缺货 | “无货”“缺货”“到货通知” | 按钮不可点击=缺货 |
| 预售 | “预售”“预定”“X月X日发货” | 区分现货与预售库存 |
多城市库存对比: 部分平台不同城市的库存不同。用网帆代理API的area参数指定不同城市代码,分别采集同一商品在不同城市的库存状态,可以推断竞品的区域仓储分布。
评论抓取要点
评论抓取是三个维度中最难的,核心挑战是"在反爬限制下采到足够多的评论"。
分页采集策略:
- 每页采集间隔5-10秒(评论接口反爬最严,必须降速)
- 单IP最多采集2-3页评论后轮换(网帆代理1-3分钟轮换周期配合)
- 连续2页返回空数据时自动停止(已到末页或被限流)
- 同时采集默认排序和时间排序两种评论
验证码应对: 评论采集比价格采集更容易触发验证码。检测到验证码关键词(“验证”“captcha”“人机验证”)时,立即轮换IP并增加延迟。不要尝试自动识别验证码——正确做法是通过IP轮换降低触发频率,从源头减少验证码出现。
评论去重: 同一条评论可能在多次采集中重复获取。用评论内容MD5哈希做唯一索引,重复评论直接丢弃。
反爬应对策略
反爬机制与对策
| 反爬手段 | 触发条件 | 应对方法 |
|---|---|---|
| IP频率限制 | 单IP短时间高频请求 | 代理IP轮换,1-3分钟周期 |
| 验证码拦截 | 请求模式被识别为自动化 | 降低频率+IP轮换+随机延迟 |
| 动态渲染 | 价格/库存通过JS加载 | 无头浏览器或直接请求接口 |
| 行为检测 | 请求间隔过于均匀 | 随机延迟2-8秒+UA池轮换 |
| 接口加密 | 评论接口参数有签名 | 分析接口逻辑或用浏览器渲染 |
请求行为模拟
反爬系统不只看IP,还看请求模式。三个要点:
随机延迟——请求间隔不要固定。用random.uniform(2.0, 8.0)生成2-8秒随机间隔,模拟真实用户的浏览节奏。
UA池轮换——准备5-10个不同的User-Agent,每次请求随机选一个。固定UA是自动化请求的明显特征。
Referer设置——采集评论时设置Referer为商品详情页URL,模拟从商品页点击进入评论区的真实用户行为。
数据存储与去重
存储结构
| 数据表 | 核心字段 | 去重规则 |
|---|---|---|
| 价格表 | product_id, price, price_type, collected_at | product_id + collected_at 唯一 |
| 库存表 | product_id, stock_status, stock_quantity, collected_at | product_id + collected_at 唯一 |
| 评论表 | product_id, content, rating, review_date | content_hash 唯一 |
去重策略
价格去重:同一商品同一时间戳只保留一条记录。如果短时间内多次采集到不同价格,保留最新值(价格确实在变动)。
评论去重:用评论内容MD5哈希做唯一索引。同一条评论在多次采集中重复获取时直接丢弃。
库存去重:同一商品同一时间戳只保留一条记录。库存状态变化时(从"有货"变"缺货")需要记录状态变更时间点。
采集频率建议
| 数据维度 | 推荐频率 | 理由 |
|---|---|---|
| 热销品价格 | 每小时1次 | 价格变动频繁 |
| 常规品价格 | 每4小时1次 | 价格相对稳定 |
| 库存状态 | 每2小时1次 | 库存实时变动 |
| 新品评论 | 每天1次 | 评论持续增长 |
| 历史评论补采 | 每周1次 | 补采遗漏评论 |
采集成功率监控
| 监控指标 | 告警阈值 | 处理方法 |
|---|---|---|
| 价格采集成功率 | <90% | 检查页面结构是否变更,缩短轮换周期 |
| 库存采集成功率 | <85% | 检查库存信号关键词是否变更 |
| 评论采集成功率 | <70% | 降低采集频率,增加IP轮换频率 |
| 验证码触发率 | >5% | 立即降速,缩短轮换周期至1分钟 |
| 平均响应时间 | >3秒 | 检查代理IP质量,更换地域 |
常见问题
采集到的价格和实际页面显示不一致怎么办?
大概率是动态渲染问题。部分平台的价格通过JavaScript动态加载,requests拿到的HTML中价格位置是空的。两种解法:一是用无头浏览器等待渲染完成后提取;二是分析AJAX价格接口直接请求JSON数据。
评论采集到第几页就没有数据了?
各平台评论分页深度不同。有些平台第5页之后返回空数据,有些能到50页。建议连续2页返回空数据时自动停止。网帆代理短效动态IP的1-30分钟灵活轮换可以配合评论分页采集——每个IP采集2-3页后轮换。
采集时频繁遇到验证码怎么办?
说明当前采集频率超过了目标网站的容忍阈值。三个调整方向:一是缩短IP轮换周期(从5分钟降到1-3分钟);二是增加请求间隔随机延迟(从2-5秒增加到5-10秒);三是降低单IP最大请求数(从30次降到15次)。如果调整后仍有验证码,考虑使用隧道代理——云端自动轮换IP,用户无需管理IP列表。
国内电商和海外电商的代理IP怎么选?
国内电商平台用网帆代理短效动态IP,通过API的area参数指定城市、isp参数指定运营商,3000万+IP池覆盖全国300+城市。海外电商平台用动态住宅IP,通过API的cnt参数指定洲、cty参数指定国家,9000万+真实住宅节点覆盖全球200+国家。注意海外代理仅支持在境外网络环境下使用。
采集竞品数据合法吗?
采集公开页面信息属于合法的市场监测行为。但需注意:遵守目标网站robots协议,控制请求频率不影响目标网站正常运行,采集数据仅用于内部竞品分析,不对外公开或转售。
总结
电商竞品数据采集的核心是"分散请求来源 + 智能轮换策略 + 结构化解析"。价格抓取重点是处理动态渲染和多规格SKU;库存抓取依赖页面文本信号分析;评论抓取需要分页采集配合验证码检测和降速策略。
网帆代理短效动态IP(国内,3000万+IP池,300+城市,99.83%纯净度,1-30分钟轮换)和动态住宅IP(海外,9000万+节点,200+国家,99.9%可用率)为采集提供了可靠的代理基础设施。国内API用area/isp参数指定地域和运营商,海外API用cnt/cty参数指定洲和国家。配合合理的轮换策略和反爬应对方案,技术团队可以快速搭建覆盖价格、库存、评论三个维度的竞品监控系统。