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

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

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

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