Python中如何解决淘宝反爬问题?
爬虫新人,主要要爬淘宝一些搜索结果和商品的销量。
参考的帖子非常多:
https://intoli.com/blog/making-chrome-headless-undetectable/
https://antoinevastel.com/bot%20detection/2018/01/17/detect-chrome-headless-v2.html
目前已经做的事情:
1.mitmdump 挂脚本,拦截 js ( sufei_data/3.6.8/index.js )替换其中一些检测,比如知名的 f.webdriver,$cdc_asdjflasutopfhvcZLmcfl_
2.mitmdump 在页面 load 时设置了 navigator.language(注意,不是 languages,淘宝的 index.js 检测的没有复数),navigator.webdriver,window.chrome,window.navigator.permissions.query 属性
3.分析了 index.js ,测试了可能鉴定爬虫的特征代码( L = [r, i, a, e, l],B = [m, h, v, d, g];),这几个函数返回值 headless 和非 headless 下都是一致的
结果:
非 headless 下自动登陆大概率(90%)能通过,headless 下似乎一次都过不了。所以这下就郁闷了,不明白究竟是哪里遗漏了呢? headless 和非 headless 还有什么特征不同吗?
Python中如何解决淘宝反爬问题?
最初以为仅仅是滑块轨迹问题,但实际上,用 webdriver 打开 chrome 后,怎么手动都滑不过,后来才知道可能有检测环境之类。 说白也很难,如果特征有 100 个,不同的有 20 个,淘宝采集了 4 个,你没防那就被识破了
搞淘宝反爬?这事儿得拆开看。核心就两点:模拟真人请求和处理动态数据。
直接上干货,一个能跑的基础示例:
import requests
import time
import random
from fake_useragent import UserAgent
# 1. 基础请求头设置
ua = UserAgent()
headers = {
'User-Agent': ua.random,
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
'Accept-Encoding': 'gzip, deflate, br',
'Connection': 'keep-alive',
'Upgrade-Insecure-Requests': '1',
}
# 2. 使用会话维持cookies
session = requests.Session()
# 3. 请求函数(带基础反反爬)
def fetch_page(url):
try:
# 随机延迟,模拟人工操作
time.sleep(random.uniform(1, 3))
# 随机更换User-Agent
headers['User-Agent'] = ua.random
resp = session.get(url, headers=headers, timeout=10)
resp.raise_for_status()
# 检查是否被拦截(简单版)
if "访问受限" in resp.text or "验证" in resp.text:
print("可能触发了反爬验证")
return None
return resp.text
except Exception as e:
print(f"请求失败: {e}")
return None
# 使用示例
if __name__ == "__main__":
# 示例商品页(需要替换为实际URL)
test_url = "https://item.taobao.com/item.htm?id=xxxx"
html = fetch_page(test_url)
if html:
# 这里接解析逻辑
print("获取页面成功,长度:", len(html))
关键点说明:
-
请求头:
User-Agent必须随机换,用fake_useragent库。其他头如Accept-Language也要配得像浏览器。 -
请求节奏:
time.sleep(random.uniform(1, 3))是基本操作,太快必被ban。 -
会话管理:用
requests.Session()保持cookies,有些验证需要会话状态。 -
基础验证:检查返回内容是否包含拦截关键词。
如果要处理更复杂的动态内容(比如数据通过JS加载):
# 可能需要用到Selenium或Playwright
from selenium import webdriver
from selenium.webdriver.common.by import By
options = webdriver.ChromeOptions()
options.add_argument(f'user-agent={ua.random}')
# 可添加无头模式等选项
driver = webdriver.Chrome(options=options)
driver.get(url)
# 等待动态加载
time.sleep(2)
page_source = driver.page_source
driver.quit()
简单总结: 核心就是伪装成浏览器行为,加上合理的请求间隔。
人工登陆,然后记录登陆信息可以吗?
使用 Selenium 中的 user-data-dir 参数。另外,淘宝好像是登陆以后频繁的翻页也会触发验证码。
爬虫不会。但是考虑过爬手机页面么?说不定会没有那么多检测。
你 QQ 多少,联系我 Q312901237
本质不是想登陆,而是想过滑块,因为现在手工记录 cookie 去爬价格(商品详情页),还是时不时要验证
试过现在的版本很容易触发登陆机制,就算登陆了多点几下就要验证,也没有那么多帐号来试,想知道楼主怎么解决这个问题
手机页查过资料,据说也反爬, 刚试了下 fiddler 抓不到,不知道走的是不是二进制协议
扫码登录吧…账密太多验证了
登陆没啥,手工获取 cookie,我的任务每周爬个 3 天就差不多可以了。 问题主要是滑块不好过,非 headless 下大概率过,但这显然不够好
无头有头总归有区别的。如果无头不会真的渲染到屏幕,那 canvas 的行为可能就大不一样。
以前甚至见过用 canvas 字体渲染差异做浏览器指纹的论文…
淘宝的销量只算今天往前推 30 天,LZ 打算怎么算日销量?商品列表的话就算你是正常用户翻个 7-8 页左右也会有验证码,selenium 的话大概 5-6 页会有滑块,再往后会有手机验证码不知你遇到没。详情页不需要登录就有价格啊,我是直接堆 ip
之前也卡在这一块,后面通过比较 low 的方法解决了。
其实是要拿详情页的成交量而不是价格,实时的数据里面和外面有些不同的,包括价格。
手机验证码没遇到。翻页的验证码我是尝试 3 次滑动,没过 kill 掉记录时间,让父进程 x 分钟后拉起接着爬,虽然慢一点好歹也可以爬完。商品搜索列表页封的不严,但商品详情页就很严了,kill 很多次都还弹验证
如果数量不少很多,用 firefox49 + imacros 试试?
怎么 low 的方法?只要不人工就不 low 啊
2 个月前有一个接口可以拿
https://detailskip.taobao.com/service/getData/1/p1/item/detail/sib.htm?itemId=x&modules=dynStock,qrcode,viewer,price,duty,xmpPromotion,delivery,activity,fqg,zjys,couponActivity,soldQuantity,originalPrice,tradeContract&callback=onSibRequestSuccess,
加 cookie 和 referer 就好了,现在封了,要在 cookie 里带一个 x5sec 才能过,不然返回 rgv587 这样的东西。而这个 x5sec 是通过滑块后才能获取,且只有半小时时间。
不是工具问题,而是怎么突破反爬啊
之前也是用 python,结果只要是通过 python 唤起的浏览器就一个劲的验证码。
后面专门拿了一台电脑,挂脚本,使用 AHK 写了一个小脚本。
模拟人工登录,拉取一些订单记录什么的。
获取一些信息,通过浏览器的控制器获取。
淘宝对页面刷新有频率限制,中间间隔几分钟再获取,
貌似频繁的翻页,和访问淘宝页面很容易出验证码,
他的频繁好像是针对的是这个 ip 下,如果 ip 里面有一个人有验证码了,
另外一个同 IP 下的账户也会出验证码。
抓包 app 数据试试,一般 app 更容易
感觉不是频率这么简单吧,我要的数据不是特别多,所以爬的时候很克制了。 不过目前能爬完也是 kill + 等待拉起的方式,过搜索列表页还可以,过商品详情页就很难了,有时一直弹窗要验证
app 的逆向就要破协议了,这个我更加没经验,有什么方法吗
你目前是使用什么方式的呢,
我之前也尝试过很多种工具和语言方法,
有些工具就连登录都过不了,
淘宝里面的检测方法多得很,
也没精力去一个一个研究,
最后就使用脚本类,模拟键盘鼠标,
这个网页端肯定是检测不到的,
目前稳定运行了半年多了。
你这个用按键精灵?感觉更不好稳定吧,如果位置什么的有偏差就做不了啊
我目前是
1.selenium + chrome headless, 爬列表页面,价格等数据有小几率获取,获取不到的记录-1。
2.另外启 selenium + chrome noheadless,随机获取-1 的数据循环重新请求价格,销量。
3.cookie 每天更换一次,chrome noheadless,每天早上 9 点爬虫会更新 cookie,时间不对(不是当天的 cookie )就手动扫码获取 cookie
如果 1 爬完了,2 这里还有大量的-1 记录,我就有点慌了,会不停的手工获取 x5sec 的数据直接抓接口了
淘宝的代码里会检查 webdriver 的标志 需要重新编译改变量名
这些在问题里都提到了,都做过了啊
我也在其他地方遇到一样的滑块验证,只要是 selenium 调用的浏览器都无法划过去,挠头。结果也是用了 的方法干,不太稳定就是
AHK 类似按键吧,位置什么的多一点判断就行,
有些位置比较不好识别我直接使用谷歌的控制台。
之前我也是 selenium + chrome headless,但是始终过不了登录的检测,
只要通过 selenium 启动起来的 chrome,就算手动登录那个滑块也通过不了。
反正之前折腾了一个星期也算是解决了。
中间偶尔位置有偏差的就修修补补了,现在也算能稳定了。
不过还在寻求新的更好的方法。
#19 hhhhhhhhh 阿里的 APP 只会更难,不会更容易。阿里系 APP 通用加密头了解一下
阿西吧, 这样也就必须一台机器前台运行了吧,如果抓取量大了就很慢了。 另外,你是怎么获取数据?
在虚拟机里面运行和前台运行有区别吗? 还有能不能用其他浏览器?
忘了还有这玩意。。。
换 pyqt 或者其他的非 selenium 驱动浏览器方案可以过检测
当然可以,主要是不能确定靠什么检测的,试过 PhantomJS 也是不行
不会 pyqt,不过应该不只是 selenium 的问题,光看 taobao 的 js 就有 chromedriver 的指纹检测
兄弟,你是写 java 还是 python。
win10 和 OS_x 用 puppeteer 亲测自动登录有效
工作很多年了,90%时间写 C++
反爬这东西 你觉得 tb 有多少人在搞
过滑块之前只检测了 navigator.webdriver 这个特征,最近 TB 更新了验证,只改这个特征不行了。然后呢,可以很明确的说过不了滑块并不是因为 selenium 被检测到,而是 webdriver 的某些特征被检测到了(即使非 headless 用手拖也过不了),因为我使用的一款工具底层使用 selenium 但是可以过滑块。
我已经把 淘宝芝麻分,订单明细,售后地址爬了
我也知道,公司安全的负责人也说,你一个人怎么能应付一个团队,不要硬肛,要想别的办法,但什么大淘客还是不行啊,搜不到我要的。 但这爬东西又是公司必须的任务,之前从来没搞过,忧虑了好久,总没彻底去解决。
淘宝也有付费 api,不过 leader 还是希望能神不知鬼不觉的用爬虫比较好
淘宝检测了什么我不确定是不是只在 sufei_data 那个 js 里,从我分析看,至少有检测了 10 个函数,至少 headless 都 pass 了和非 headless 一样的结果。其他的实在看不下去了,都是混淆过的代码,命名 abcdefg,函数各种混着赋值,似乎要人肉维护一个函数调用关系
爬简单,要能稳定长期、全自动化、有效的爬才难啊
我在 mac 上的 chrome,纯手动打开都会反复要求登录,天猫的商品实际价格也出不来,不知道是啥情况?
阿里的反爬太厉害了
阿里的反爬,我特么正常使用也经常不行啊。动不动就要验证。。。
机子支持开几个 android 虚拟机?
扫码登录不能做吗,我就是扫码
要爬淘宝,我内心是拒绝的
请看全文,不仅是登陆,是要长期稳定的爬,且能过各种滑块,目前最终方案在 23F, 放 win 虚拟机跑了
你们就没考虑过淘宝写反爬的也在 V2EX 里面看这贴吗
那能怎么办?讨论爬虫的帖子超级多,可讨论反爬的实在太少了,工作这么久身边也基本没一个人做过这些的
我之前爬过手机端淘宝, m.taobao.com 加密的参数只有一个, 我记得是 md5 加密来着, 还算简单, 知乎有帖子
现在这个也不能爬了,
手机淘宝是二进制的协议吧,要破协议,这个我没经验。而且直接抓接口的方法淘宝随便封更容易,感觉还是模拟人的操作稍微靠谱点
修改 chromedriver 源码以及 mitmdump 挂脚本,拦截 js 的方法我都使用过,noheadless 确实都能大概率过,但是 headless 就一次过不了,也就说只能在 windows 上跑了,暂时也没想到什么好的方法能挂在 liunx 上。先 mark 一下
最近接了一个爬取天猫的任务,也是被各种反爬搞的焦头烂额。我可以有酬买你的源码吗?
linux 不是也有图形界面吗
老哥,加我 wx:16620341036
加我 QQ:690930494
老哥,加我 qq 394115733
老铁,我问一句,你们用了多少个淘宝账号在爬数据?这些账号哪里来的?是账号更容易被封还是 IP 更容易被封?
老铁,脚本类的你们每天能爬多大量级
之前研究过一段,淘宝现在好像没验证了,使用 cookie 随机 useragent 外加随机代理跳过登录,直接爬取信息
有需要爬淘宝 app 需求的可以加我 qq 都能爬 348️⃣531171
用的是 app 接口计算 xsign
一直有验证呀…
楼主问题解决了吗?想跟你交流下。我的微信 no13bus


