淘宝反爬求解

2019-01-17 11:53:16 +08:00
 frogex
爬虫新人,主要要爬淘宝一些搜索结果和商品的销量。
参考的帖子非常多:
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 还有什么特征不同吗?
14264 次点击
所在节点    Python
72 条回复
frogex
2019-01-17 12:01:15 +08:00
最初以为仅仅是滑块轨迹问题,但实际上,用 webdriver 打开 chrome 后,怎么手动都滑不过,后来才知道可能有检测环境之类。 说白也很难,如果特征有 100 个,不同的有 20 个,淘宝采集了 4 个,你没防那就被识破了
WaJueJiPrince
2019-01-17 12:58:11 +08:00
人工登陆,然后记录登陆信息可以吗?
使用 Selenium 中的 user-data-dir 参数。另外,淘宝好像是登陆以后频繁的翻页也会触发验证码。
yulgang
2019-01-17 12:58:30 +08:00
@frogex 爬虫不会。但是考虑过爬手机页面么?说不定会没有那么多检测。
a312901237
2019-01-17 13:11:40 +08:00
你 QQ 多少,联系我 Q312901237
frogex
2019-01-17 13:44:55 +08:00
@WaJueJiPrince
本质不是想登陆,而是想过滑块,因为现在手工记录 cookie 去爬价格(商品详情页),还是时不时要验证
autulin
2019-01-17 14:17:28 +08:00
试过现在的版本很容易触发登陆机制,就算登陆了多点几下就要验证,也没有那么多帐号来试,想知道楼主怎么解决这个问题
frogex
2019-01-17 14:17:40 +08:00
@yulgang 手机页查过资料,据说也反爬, 刚试了下 fiddler 抓不到,不知道走的是不是二进制协议
dengtongcai
2019-01-17 14:20:17 +08:00
扫码登录吧…账密太多验证了
frogex
2019-01-17 14:21:21 +08:00
@autulin 登陆没啥,手工获取 cookie,我的任务每周爬个 3 天就差不多可以了。 问题主要是滑块不好过,非 headless 下大概率过,但这显然不够好
momocraft
2019-01-17 14:28:02 +08:00
无头有头总归有区别的。如果无头不会真的渲染到屏幕,那 canvas 的行为可能就大不一样。

以前甚至见过用 canvas 字体渲染差异做浏览器指纹的论文..
zr8657
2019-01-17 14:30:33 +08:00
淘宝的销量只算今天往前推 30 天,LZ 打算怎么算日销量?商品列表的话就算你是正常用户翻个 7-8 页左右也会有验证码,selenium 的话大概 5-6 页会有滑块,再往后会有手机验证码不知你遇到没。详情页不需要登录就有价格啊,我是直接堆 ip
frogex
2019-01-17 14:37:17 +08:00
@momocraft
我主要看了下 taobao 的那个 index.js 会有这么一句
function i() {
if (a())
return !1;
try {
return !!u.createElement("canvas").getContext("webgl")
} catch (n) {
return !1
}
}
function a() {
return "ontouchstart"in u
}
实际上对于 i()的返回值,有头无头都试过了是一样的,所以姑且认为没靠这些检查。
话说这也是个死坑,哪天淘宝又改了这个 js 用别的检测方法也就没用了
5200
2019-01-17 14:37:48 +08:00
之前也卡在这一块,后面通过比较 low 的方法解决了。
frogex
2019-01-17 14:50:48 +08:00
@zr8657
其实是要拿详情页的成交量而不是价格,实时的数据里面和外面有些不同的,包括价格。
手机验证码没遇到。翻页的验证码我是尝试 3 次滑动,没过 kill 掉记录时间,让父进程 x 分钟后拉起接着爬,虽然慢一点好歹也可以爬完。商品搜索列表页封的不严,但商品详情页就很严了,kill 很多次都还弹验证
ioven
2019-01-17 14:52:03 +08:00
如果数量不少很多,用 firefox49 + imacros 试试?
frogex
2019-01-17 14:54:07 +08:00
@5200 怎么 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 是通过滑块后才能获取,且只有半小时时间。
frogex
2019-01-17 14:59:03 +08:00
@ioven 不是工具问题,而是怎么突破反爬啊
5200
2019-01-17 15:00:52 +08:00
@frogex
之前也是用 python,结果只要是通过 python 唤起的浏览器就一个劲的验证码。
后面专门拿了一台电脑,挂脚本,使用 AHK 写了一个小脚本。
模拟人工登录,拉取一些订单记录什么的。
获取一些信息,通过浏览器的控制器获取。
淘宝对页面刷新有频率限制,中间间隔几分钟再获取,
貌似频繁的翻页,和访问淘宝页面很容易出验证码,
他的频繁好像是针对的是这个 ip 下,如果 ip 里面有一个人有验证码了,
另外一个同 IP 下的账户也会出验证码。
ioven
2019-01-17 15:06:34 +08:00
@frogex 抓包 app 数据试试,一般 app 更容易
frogex
2019-01-17 15:11:46 +08:00
@5200 感觉不是频率这么简单吧,我要的数据不是特别多,所以爬的时候很克制了。 不过目前能爬完也是 kill + 等待拉起的方式,过搜索列表页还可以,过商品详情页就很难了,有时一直弹窗要验证

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/527879

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX