能做,但必须面对反爬、动态渲染、验证码和法律风险这四座大山,单纯靠 requests + beautifulsoup 几乎必然失败;电商价格多由 js 动态注入或 ajax 获取,需复现浏览器行为定位真实接口,配合代理、风控规避与轻量存储方案。

直接说结论:能做,但必须面对反爬、动态渲染、验证码和法律风险这四座大山,单纯靠 requests + BeautifulSoup 几乎必然失败。
为什么不能只用 requests 抓取电商页面?
主流电商平台(京东、淘宝、拼多多)的定价数据基本不通过静态 HTML 直接暴露。页面加载后,价格往往由 JavaScript 动态注入,或通过 AJAX 请求从接口拉取。用 requests 获取到的源码里,price 字段常为空、占位符(如 •••)或加密字符串。
- 典型现象:
response.text里搜不到"¥299",但浏览器开发者工具 Network 标签页能看到/api/product/detail返回了真实价格 - 真实请求需携带
cookie、user-agent、referer,还可能校验sign或timestamp - 部分接口返回数据是 AES 加密或前端 JS 解密的,直接解析 JSON 会得到乱码
怎么定位真实价格接口并模拟请求?
核心动作不是“爬页面”,而是“复现浏览器行为”。打开 Chrome DevTools → Network → XHR → 刷新商品页,过滤关键词如 price、sku、item,找到返回价格字段的请求。
- 右键该请求 → Copy → Copy as cURL(bash),再用在线工具转成 Python
requests代码,比手动拼 headers 可靠得多 - 注意检查请求头里的
X-Requested-With、Sec-Fetch-*等字段,缺失可能导致 403 - 若接口带参数如
callback=xxx或_=<timestamp></timestamp>,必须动态生成,硬编码会失效 - 返回值可能是 JSONP,需先去掉
callback(…)外壳再json.loads
遇到滑块/点选验证码怎么办?
一旦触发风控,常规自动化就停摆。没有万能解法,只有分级应对策略:
- 低频采集(如每小时单商品 1 次)+ 随机
User-Agent+ 代理 IP 轮换,可绕过大部分基础检测 - 真遇到验证码,优先考虑放弃:用
selenium自动化人工打码成本高、不稳定;接入第三方打码平台(如极验、云打码)要付费且有调用延迟 - 更现实的替代方案:查平台是否开放官方 API(如京东联盟 API 提供部分商品价格),或订阅其 RSS/邮件降价提醒(虽不实时但合法)
本地存储与变动判定怎么做才实用?
别一上来就搞数据库。用 sqlite3 文件存最轻量,配合时间戳和价格哈希做去重即可。
- 表结构只需三列:
sku_id TEXT(商品唯一标识)、price REAL、updated_at TIMESTAMP - 每次抓取后,用
SELECT price FROM prices WHERE sku_id = ? ORDER BY updated_at DESC LIMIT 1查上一次价格,对比再决定是否写入新记录 - 避免用商品标题当主键——竞品可能改标题但 SKU 不变;也别依赖页面 URL,它可能 302 跳转或带无效参数
- 写入前加
try/except sqlite3.IntegrityError,防止并发写入冲突
真正卡住项目的从来不是代码怎么写,而是你能否持续拿到稳定响应——IP 被封、接口字段改名、前端加密逻辑更新,这些都会让脚本某天突然全量失效。留好日志,把每次请求的 HTTP 状态码、响应长度、关键字段是否存在都记下来,出问题时才能快速定位是反爬升级了,还是竞品自己改版了。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











