Temu 作为一个增长迅猛的购物平台,其商品价格、库存等信息,对许多做运营分析的小伙伴来说非常有参考价值。
我在写这个小工具的时候,踩了很多坑,特别记录下来,希望对你有用。
初版代码:想当然的“直接来一下”
不少人第一反应是用 Python 的网络请求模块直接拉接口,比如我一开始就这么写了:
import requestslink = "https://www.temu.com/api/product/detail?product_id=1234567890"
r = requests.get(link)
print(r.json())
出现什么问题?
- 请求基本秒挂;
- 直接提示
403 Forbidden
; - 甚至会出现跳登录页面的情况;
- 本地运行几次后就一直 timeout。
显然,Temu 在外层设了一些机制,并不欢迎“这种访问方式”。
第一步修复:补充一些“模拟环境”
从浏览器 F12 工具里找了下真实请求,发现有几个关键要素必须补上,包括“访问者标识”、“来源页面”、“身份凭证”。
import requestslink = "https://www.temu.com/api/product/detail?product_id=1234567890"req_headers = {"User-Agent": "Mozilla/5.0 ... Safari/537.36","Referer": "https://www.temu.com/","Accept": "application/json",
}req_cookies = {"xxx": "浏览器里抓到的值"
}r = requests.get(link, headers=req_headers, cookies=req_cookies)
print(r.json())
结果:可以拉到一部分数据了,但频繁执行还是不稳定。
第二步修复:换一个“网络通道”
Temu 有一定的访问频率限制,如果请求太频繁或者来自单一入口,还是容易被“关注”。于是我引入了一个中转方案 —— 把访问流量走一个中间服务,这样可以稍微“模糊一下身份”。
假设你有一个类似下面的中间配置项(具体请自己按需处理,别乱用):
#爬虫代理配置(参考亿牛云爬虫代理 www.16yun.cn)
proxy_host = "proxy.16yun.cn"
proxy_port = "50000"
proxy_user = "16YUN"
proxy_pwd = "16IP"
那么就可以配置网络入口方式为:
proxies = {"http": f"http://{proxy_user}:{proxy_pwd}@{proxy_host}:{proxy_port}","https": f"http://{proxy_user}:{proxy_pwd}@{proxy_host}:{proxy_port}",
}
然后把这个加进请求里:
r = requests.get(link, headers=req_headers, cookies=req_cookies, proxies=proxies, timeout=10)
此时就稳定多了,可以较高频率获取目标信息。
数据保存与动态监测
我希望能够按时间记录每次获取到的价格,于是加了一段简单的存储逻辑,用 CSV 写入:
import csv
from datetime import datetimedef record_price(pid, price_val):with open("temu_trace.csv", "a", newline="") as f:writer = csv.writer(f)writer.writerow([pid, price_val, datetime.now().strftime("%Y-%m-%d %H:%M:%S")])
调用方式如下:
product_id = "1234567890"
price = r.json().get("product_info", {}).get("price")
record_price(product_id, price)
总结:踩过的雷,留个记号
问题表现 | 背后原因 | 修复建议 |
---|---|---|
请求无响应/403 | 请求太“裸” | 加 headers + cookies 模拟浏览器 |
请求频繁后被拦 | 流量识别机制触发 | 设置中转访问(代理入口) |
报错中断运行 | 异常未处理 | 加 try-except 保底容错 |
后记
很多人以为“写个脚本”就是 get()
一下的事,但现实平台做了很多“隐形防护”。能否顺利拿到数据,取决于你是否愿意细心模拟出“人”的访问痕迹。
如果你也在做类似的事情,不妨参考我的踩坑历程