淘宝商品详情与评论爬取实战:一个野生程序员的逆向之旅与避坑指南

前言:为什么我要和淘宝反爬斗智斗勇?
作为一个沉迷于数据挖掘的程序猿,当我试图分析某款网红商品的用户评价时,发现手动复制评论就像用汤匙舀干大海——明明看着淘宝页面人畜无害的"累计评价"按钮,点开却只能看到前 500 条。于是,我踏上了这场与淘宝反爬系统相爱相杀的奇幻漂流...
一、淘宝反爬的四大护法(踩坑实录)
1. 加密参数:永远在变的"_sign"
你以为的请求参数:
productId=123&page=1
实际抓包看到的:
x5secdata=7df5a&_sign=ab3c8d...(40位神秘代码)
实测直接构造请求会被 302 重定向到"亲,访问被拦截"
2. 动态风控:比女朋友还善变的 Cookie
首次访问:
_m_h5_tk=abc123
第 3 次请求:突然变成
_m_h5_tk=def456
第 5 次请求:直接弹出滑动验证码
3. 数据套娃:你以为拿到的是 JSON?
json 复制{ "data": "1a2b3c...(2000 字符加密字符串)", "key": "d4e5f6..." }
需要先解密才能看到真实的评论数据
4. 动态渲染:前端界的俄罗斯套娃
首次加载:20 条明文评论
滑动到底部:突然加载加密的
<div class="encrypted-data">
页面源码里搜"好评率"?不存在的!
二、破局之路:我的技术武器库
阶段 1:抓包侦察兵(Charles+Fiddler)
发现评论接口伪装成
https://h5api.m.taobao.com/h5/**mtop.taobao.detail.getdetail**/
关键参数:
data
需要 UTF-8 编码后 base64 加密请求头必须携带
x-sign
(这个值每小时都在变)
阶段 2:逆向工程师的奇妙冒险(Chrome DevTools)
通过调试发现_sign 生成逻辑:
javascript 复制// 在 app.js 里找到的蛛丝马迹 function generateSign(t, e) { return md5(JSON.stringify(e) + t + "SWQDd6SYVR2z") }
实测需要拼接:请求参数 + 时间戳 + 神秘盐值
阶段 3:动态渲染大作战(Selenium+Puppeteer)
当静态爬取失效时:
python 复制 from selenium.webdriver import ChromeOptions options = ChromeOptions() options.add_argument("--headless") # 无头模式 driver.get(url) WebDriverWait(driver,10).until( EC.presence_of_element_located((By.CSS_SELECTOR, ".rate-grid")) # 用 execute_script 触发滚动加载 driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
三、幸存者指南(血泪经验总结)
IP 轮换策略:单个 IP 每分钟不超过 5 次请求(实测超过就弹验证码)
Cookie 保鲜术:每 30 分钟重新登录获取新 token
拟人化操作:随机滑动轨迹+随机等待时间(0.5-3 秒)
数据解密黑匣子:
python 复制 import execjs with open('taobao_decrypt.js') as f: ctx = execjs.compile(f.read()) decrypted_data = ctx.call('decrypt', encrypted_str)
评论