V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
frogex
V2EX  ›  Python

淘宝反爬求解

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

    以前甚至见过用 canvas 字体渲染差异做浏览器指纹的论文..
    zr8657
        11
    zr8657  
       2019-01-17 14:30:33 +08:00
    淘宝的销量只算今天往前推 30 天,LZ 打算怎么算日销量?商品列表的话就算你是正常用户翻个 7-8 页左右也会有验证码,selenium 的话大概 5-6 页会有滑块,再往后会有手机验证码不知你遇到没。详情页不需要登录就有价格啊,我是直接堆 ip
    frogex
        12
    frogex  
    OP
       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
        13
    5200  
       2019-01-17 14:37:48 +08:00
    之前也卡在这一块,后面通过比较 low 的方法解决了。
    frogex
        14
    frogex  
    OP
       2019-01-17 14:50:48 +08:00
    @zr8657
    其实是要拿详情页的成交量而不是价格,实时的数据里面和外面有些不同的,包括价格。
    手机验证码没遇到。翻页的验证码我是尝试 3 次滑动,没过 kill 掉记录时间,让父进程 x 分钟后拉起接着爬,虽然慢一点好歹也可以爬完。商品搜索列表页封的不严,但商品详情页就很严了,kill 很多次都还弹验证
    ioven
        15
    ioven  
       2019-01-17 14:52:03 +08:00
    如果数量不少很多,用 firefox49 + imacros 试试?
    frogex
        16
    frogex  
    OP
       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
        17
    frogex  
    OP
       2019-01-17 14:59:03 +08:00
    @ioven 不是工具问题,而是怎么突破反爬啊
    5200
        18
    5200  
       2019-01-17 15:00:52 +08:00
    @frogex
    之前也是用 python,结果只要是通过 python 唤起的浏览器就一个劲的验证码。
    后面专门拿了一台电脑,挂脚本,使用 AHK 写了一个小脚本。
    模拟人工登录,拉取一些订单记录什么的。
    获取一些信息,通过浏览器的控制器获取。
    淘宝对页面刷新有频率限制,中间间隔几分钟再获取,
    貌似频繁的翻页,和访问淘宝页面很容易出验证码,
    他的频繁好像是针对的是这个 ip 下,如果 ip 里面有一个人有验证码了,
    另外一个同 IP 下的账户也会出验证码。
    ioven
        19
    ioven  
       2019-01-17 15:06:34 +08:00
    @frogex 抓包 app 数据试试,一般 app 更容易
    frogex
        20
    frogex  
    OP
       2019-01-17 15:11:46 +08:00
    @5200 感觉不是频率这么简单吧,我要的数据不是特别多,所以爬的时候很克制了。 不过目前能爬完也是 kill + 等待拉起的方式,过搜索列表页还可以,过商品详情页就很难了,有时一直弹窗要验证
    frogex
        21
    frogex  
    OP
       2019-01-17 15:15:24 +08:00
    @ioven app 的逆向就要破协议了,这个我更加没经验,有什么方法吗
    5200
        22
    5200  
       2019-01-17 15:23:22 +08:00
    @frogex 你目前是使用什么方式的呢,
    我之前也尝试过很多种工具和语言方法,
    有些工具就连登录都过不了,
    淘宝里面的检测方法多得很,
    也没精力去一个一个研究,
    最后就使用脚本类,模拟键盘鼠标,
    这个网页端肯定是检测不到的,
    目前稳定运行了半年多了。
    frogex
        23
    frogex  
    OP
       2019-01-17 15:50:24 +08:00   ❤️ 1
    @5200
    你这个用按键精灵?感觉更不好稳定吧,如果位置什么的有偏差就做不了啊
    我目前是
    1.selenium + chrome headless, 爬列表页面,价格等数据有小几率获取,获取不到的记录-1。
    2.另外启 selenium + chrome noheadless,随机获取-1 的数据循环重新请求价格,销量。
    3.cookie 每天更换一次,chrome noheadless,每天早上 9 点爬虫会更新 cookie,时间不对(不是当天的 cookie )就手动扫码获取 cookie

    如果 1 爬完了,2 这里还有大量的-1 记录,我就有点慌了,会不停的手工获取 x5sec 的数据直接抓接口了
    murmur
        24
    murmur  
       2019-01-17 15:50:59 +08:00
    淘宝的代码里会检查 webdriver 的标志 需要重新编译改变量名
    frogex
        25
    frogex  
    OP
       2019-01-17 15:56:12 +08:00
    @murmur
    这些在问题里都提到了,都做过了啊
    farverfull
        26
    farverfull  
       2019-01-17 16:44:16 +08:00
    我也在其他地方遇到一样的滑块验证,只要是 selenium 调用的浏览器都无法划过去,挠头。结果也是用了 @5200 的方法干,不太稳定就是
    5200
        27
    5200  
       2019-01-17 17:14:18 +08:00   ❤️ 1
    @frogex AHK 类似按键吧,位置什么的多一点判断就行,
    有些位置比较不好识别我直接使用谷歌的控制台。
    之前我也是 selenium + chrome headless,但是始终过不了登录的检测,
    只要通过 selenium 启动起来的 chrome,就算手动登录那个滑块也通过不了。
    反正之前折腾了一个星期也算是解决了。
    中间偶尔位置有偏差的就修修补补了,现在也算能稳定了。
    不过还在寻求新的更好的方法。
    locoz
        28
    locoz  
       2019-01-17 17:41:15 +08:00
    @ioven #19 hhhhhhhhh 阿里的 APP 只会更难,不会更容易。阿里系 APP 通用加密头了解一下
    frogex
        29
    frogex  
    OP
       2019-01-17 19:25:59 +08:00
    @5200
    阿西吧, 这样也就必须一台机器前台运行了吧,如果抓取量大了就很慢了。 另外,你是怎么获取数据?
    yangsi
        30
    yangsi  
       2019-01-18 04:36:25 +08:00 via iPhone
    在虚拟机里面运行和前台运行有区别吗? 还有能不能用其他浏览器?
    ioven
        31
    ioven  
       2019-01-18 08:22:47 +08:00
    @locoz 忘了还有这玩意。。。
    yumenlong
        32
    yumenlong  
       2019-01-18 09:16:57 +08:00
    换 pyqt 或者其他的非 selenium 驱动浏览器方案可以过检测
    frogex
        33
    frogex  
    OP
       2019-01-18 09:34:41 +08:00
    @yangsi
    当然可以,主要是不能确定靠什么检测的,试过 PhantomJS 也是不行
    frogex
        34
    frogex  
    OP
       2019-01-18 09:35:43 +08:00
    @yumenlong
    不会 pyqt,不过应该不只是 selenium 的问题,光看 taobao 的 js 就有 chromedriver 的指纹检测
    yinaqu
        35
    yinaqu  
       2019-01-18 09:43:44 +08:00
    兄弟,你是写 java 还是 python。
    lkwfive
        36
    lkwfive  
       2019-01-18 09:57:57 +08:00
    win10 和 OS_x 用 puppeteer 亲测自动登录有效
    frogex
        37
    frogex  
    OP
       2019-01-18 10:02:59 +08:00
    @yinaqu
    工作很多年了,90%时间写 C++
    frogex
        38
    frogex  
    OP
       2019-01-18 10:08:23 +08:00
    @lkwfive
    没试过这个,有空试下吧,不过用什么工具 taobao 应该还是都会检测的
    soulmine
        39
    soulmine  
       2019-01-18 10:12:03 +08:00
    反爬这东西 你觉得 tb 有多少人在搞
    yinaqu
        40
    yinaqu  
       2019-01-18 10:29:24 +08:00
    @frogex 过滑块之前只检测了 navigator.webdriver 这个特征,最近 TB 更新了验证,只改这个特征不行了。然后呢,可以很明确的说过不了滑块并不是因为 selenium 被检测到,而是 webdriver 的某些特征被检测到了(即使非 headless 用手拖也过不了),因为我使用的一款工具底层使用 selenium 但是可以过滑块。
    dengtongcai
        41
    dengtongcai  
       2019-01-18 10:37:21 +08:00
    我已经把 淘宝芝麻分,订单明细,售后地址爬了
    frogex
        42
    frogex  
    OP
       2019-01-18 11:32:06 +08:00
    @soulmine
    我也知道,公司安全的负责人也说,你一个人怎么能应付一个团队,不要硬肛,要想别的办法,但什么大淘客还是不行啊,搜不到我要的。 但这爬东西又是公司必须的任务,之前从来没搞过,忧虑了好久,总没彻底去解决。

    淘宝也有付费 api,不过 leader 还是希望能神不知鬼不觉的用爬虫比较好
    frogex
        43
    frogex  
    OP
       2019-01-18 11:34:41 +08:00
    @yinaqu
    淘宝检测了什么我不确定是不是只在 sufei_data 那个 js 里,从我分析看,至少有检测了 10 个函数,至少 headless 都 pass 了和非 headless 一样的结果。其他的实在看不下去了,都是混淆过的代码,命名 abcdefg,函数各种混着赋值,似乎要人肉维护一个函数调用关系
    frogex
        44
    frogex  
    OP
       2019-01-18 11:35:34 +08:00
    @dengtongcai
    爬简单,要能稳定长期、全自动化、有效的爬才难啊
    winglight2016
        45
    winglight2016  
       2019-01-18 11:45:50 +08:00
    我在 mac 上的 chrome,纯手动打开都会反复要求登录,天猫的商品实际价格也出不来,不知道是啥情况?
    beforeuwait
        46
    beforeuwait  
       2019-01-18 11:57:01 +08:00
    阿里的反爬太厉害了
    yanzixuan
        47
    yanzixuan  
       2019-01-18 12:22:27 +08:00
    阿里的反爬,我特么正常使用也经常不行啊。动不动就要验证。。。
    ctro15547
        48
    ctro15547  
       2019-01-18 13:01:16 +08:00
    机子支持开几个 android 虚拟机?
    dengtongcai
        49
    dengtongcai  
       2019-01-18 13:10:52 +08:00
    @frogex 扫码登录不能做吗,我就是扫码
    NonClockworkChen
        50
    NonClockworkChen  
       2019-01-18 13:23:38 +08:00
    要爬淘宝,我内心是拒绝的
    frogex
        51
    frogex  
    OP
       2019-01-18 16:21:03 +08:00
    @dengtongcai
    请看全文,不仅是登陆,是要长期稳定的爬,且能过各种滑块,目前最终方案在 23F, 放 win 虚拟机跑了
    IWSR
        52
    IWSR  
       2019-01-18 17:40:33 +08:00
    你们就没考虑过淘宝写反爬的也在 V2EX 里面看这贴吗
    frogex
        53
    frogex  
    OP
       2019-01-19 10:50:03 +08:00
    @IWSR
    那能怎么办?讨论爬虫的帖子超级多,可讨论反爬的实在太少了,工作这么久身边也基本没一个人做过这些的
    xiao38245
        54
    xiao38245  
       2019-01-19 11:56:50 +08:00
    我之前爬过手机端淘宝, m.taobao.com 加密的参数只有一个, 我记得是 md5 加密来着, 还算简单, 知乎有帖子
    iamdaguduizhang
        55
    iamdaguduizhang  
       2019-01-19 15:21:49 +08:00
    iamdaguduizhang
        56
    iamdaguduizhang  
       2019-01-19 15:23:08 +08:00
    现在这个也不能爬了,
    frogex
        57
    frogex  
    OP
       2019-01-19 15:46:52 +08:00
    @xiao38245
    手机淘宝是二进制的协议吧,要破协议,这个我没经验。而且直接抓接口的方法淘宝随便封更容易,感觉还是模拟人的操作稍微靠谱点
    wc110302
        58
    wc110302  
       2019-01-21 18:59:34 +08:00
    修改 chromedriver 源码以及 mitmdump 挂脚本,拦截 js 的方法我都使用过,noheadless 确实都能大概率过,但是 headless 就一次过不了,也就说只能在 windows 上跑了,暂时也没想到什么好的方法能挂在 liunx 上。先 mark 一下
    keyakizaka46
        59
    keyakizaka46  
       2019-01-21 20:15:57 +08:00
    @frogex 最近接了一个爬取天猫的任务,也是被各种反爬搞的焦头烂额。我可以有酬买你的源码吗?
    yinaqu
        60
    yinaqu  
       2019-01-22 18:04:40 +08:00
    @wc110302 linux 不是也有图形界面吗
    mrcomer
        61
    mrcomer  
       2019-01-23 21:47:26 +08:00
    @frogex 老哥,加我 wx:16620341036
    iamdaguduizhang
        62
    iamdaguduizhang  
       2019-01-24 14:53:57 +08:00
    @keyakizaka46 我有可以爬取淘宝 h5 的代码,可以用
    keyakizaka46
        63
    keyakizaka46  
       2019-01-24 16:21:33 +08:00
    @iamdaguduizhang 加我 QQ:690930494
    okface
        64
    okface  
       2019-01-26 17:23:48 +08:00
    @iamdaguduizhang 老哥,加我 qq 394115733
    okface
        65
    okface  
       2019-01-26 18:09:03 +08:00
    @frogex 老铁,我问一句,你们用了多少个淘宝账号在爬数据?这些账号哪里来的?是账号更容易被封还是 IP 更容易被封?
    okface
        66
    okface  
       2019-01-28 21:15:34 +08:00
    @5200 老铁,脚本类的你们每天能爬多大量级
    love9918
        67
    love9918  
       2019-02-12 10:31:28 +08:00
    之前研究过一段,淘宝现在好像没验证了,使用 cookie 随机 useragent 外加随机代理跳过登录,直接爬取信息
    thursday
        68
    thursday  
       2019-02-28 19:28:07 +08:00
    有需要爬淘宝 app 需求的可以加我 qq 都能爬 348️⃣531171
    thursday
        69
    thursday  
       2019-02-28 19:30:05 +08:00
    用的是 app 接口计算 xsign
    515576745
        70
    515576745  
       2019-03-09 16:37:04 +08:00
    @love9918 一直有验证呀...
    lxk11153
        71
    lxk11153  
       2020-03-16 22:29:18 +08:00
    @frogex #16 x5sec 的问题好难,而且不同地方貌似检测级别不一样,比如登录好像低一点(登录时滑动通过了)
    然后进页面,页面请求 api,返回个错误需要 x5sec 然后弹框让你滑动,页面是显示滑动通过的,然后页面再次请求 api 又告诉你还需要滑[滑稽]。。。懵了
    no13bus
        72
    no13bus  
       2020-07-10 15:07:57 +08:00
    楼主问题解决了吗?想跟你交流下。我的微信 no13bus
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1813 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 16:21 · PVG 00:21 · LAX 08:21 · JFK 11:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.