爬取电商价格前须检查robots.txt和条款,优先用官方API;动态页面用Playwright而非requests;价格字段需按平台类型结构化存储;增量采集、防重入库、详记日志以应对频繁改版与限流。

抓取前先确认目标网站是否允许爬虫
直接写脚本前,必须检查 robots.txt 和网站 Terms of Service ——很多电商页面明确禁止价格爬取,甚至会封 IP 或触发法律风险。比如京东、淘宝的 robots.txt 里通常有 Disallow: /price/ 或 Disallow: /search 这类规则;拼多多部分接口返回 403 Forbidden 且带 X-Blocked: true 响应头,不是反爬没绕过,而是服务端主动拒绝。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 用
requests.get("https://example.com/robots.txt")先看规则 - 加
headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"}模拟浏览器,但别依赖这个绕过风控 - 优先查是否有公开 API(如京东开放平台、天猫商家后台),比硬爬更稳定
- 若必须爬,单域名请求间隔至少
2秒,避免被识别为扫描行为
动态渲染页面得用 Playwright 而不是 requests
现在主流电商价格都由 JavaScript 动态加载,requests 拿到的 HTML 里根本没有真实价格,只会看到占位符或空标签。比如淘宝商品页的 span.price 在源码里是空的,实际靠 fetch 请求后端接口再渲染。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 用
playwright启动无头 Chromium,等div.price元素出现再提取:page.wait_for_selector("div.price", timeout=10000) - 别用 Selenium——启动慢、内存占用高,Playwright 的
page.goto(url, wait_until="networkidle")更可靠 - 遇到滑块验证(如京东),不要强行破解,换代理或跳过该 SKU,否则整个任务链会卡住
- 截取价格时注意单位:有些页面显示“¥199”,有些是“199.00”,统一转成
float前先用re.search(r"[\d.]+", text)提纯
结构化存储时字段设计要兼容多平台差异
不同平台价格字段含义不同:京东有“PLUS会员价”和“普通价”,拼多多有“多人团价”和“单人价”,抖音小店还带“直播间专属价”。如果全塞进一个 price 字段,后续分析会错乱。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 数据库表或 CSV 至少保留:
platform、sku_id、price_type(值为 "normal"/"member"/"group")、price_value、timestamp - 避免用嵌套 JSON 存价格历史——查询某平台某 SKU 的最低价会变慢,改成追加记录更利于时间序列分析
- 抓取失败时别丢弃整条数据,存入
status字段(如"timeout"、"404"、"price_not_found"),方便后续补抓
定时运行得处理异常中断和重复采集
用 crontab 或 APScheduler 定时跑脚本,但网络波动、目标改版、DNS 故障都会导致某次采集不完整。如果每次全量覆盖,就丢失了价格波动过程。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 每次运行前查最新
timestamp,只抓取WHERE timestamp > last_run_time的增量数据 - 脚本开头加
try...except KeyboardInterrupt:捕获Ctrl+C,确保退出前把已抓数据 flush 到文件或 DB - 用
sqlite3做轻量存储时,建表加UNIQUE(platform, sku_id, price_type, date(date))防止同天重复入库 - 日志必须记清楚:哪条 URL 抓了多久、返回状态码、提取到几个价格——没日志根本没法定位是页面改了还是代理挂了
价格变动看似简单,真正难的是让脚本能扛住目标网站三天一次的 DOM 结构调整、一周一次的 JS 加密升级,还有运营活动期间的临时限流。留好日志、设好重试阈值、接受部分失败,比追求 100% 成功率更实际。


















