• Selenium+Webdriver被检测识别出来的应对方案


    在写爬虫,面对很多js 加载的页面,很多人束手无策,更多的人喜欢用Senlenium+ Webdriver,古语有云:道高一尺魔高一丈。已淘宝为首,众多网站都针对 Selenium的js监测机制, 比如:window.navigator.webdriver,navigator.languages,navigator.plugins.length……

    正常情况下我们用浏览器访问淘宝等网站的 window.navigator.webdriver的值为
    undefined。

    当我们用selenium 的时候, window.navigator.webdriver的值为 true。

    那么如何解决这个问题呢?

    第一种:使用mitmproxy用中间人的方式截取服务器发送来的js,修改js里面函数的参值方式发送给服务器。相当于在browser和server之间做一层中介的拦截。不过此方法要对js非常熟悉的人才好实施。

    第二种方法依旧通过selenium,不过是在服务器在第一次发送js并在本地验证的时候,做好‘第一次’的伪装,从而实现‘第一次登陆’有效。。方法简单,适合小白。

    之前我写过一次用 pyppeteer 加 asyncio 绕过selenium检测的方案,对于新手来说比较麻烦,现在我有了更好的解决方案。

    只需要设置Chromedriver的启动参数即可解决问题。

    在启动Chromedriver之前,为Chrome开启实验性功能参数excludeSwitches,它的值为['enable-automation'],完整代码如下:

    
    from selenium.webdriver import Chrome
    from selenium.webdriver import ChromeOptions
    
    option = ChromeOptions()
    option.add_experimental_option('excludeSwitches', ['enable-automation'])
    driver = Chrome(options=option)

    此时启动的Chrome窗口,在右上角会弹出一个提示,不用管它,不要点击停用按钮。

    再次在开发者工具的Console选项卡中查询window.navigator.webdriver,可以发现这个值已经自动变成undefined了。并且无论你打开新的网页,开启新的窗口还是点击链接进入其他页面,都不会让它变成true

    只支持旧的版本啦,更多信息以及其它方法戳

  • 相关阅读:
    vue2配置sass全局共享变量
    判断对象上是否存在指定key
    python 中统计fasta文件中每条scaffold中碱基的数目
    python 中实现在命令行中传递参数
    使用 gff2bed 将 gff文件转换为bed格式
    linux 中grep命令如何匹配空白字符
    python 中内建函数map的用法
    /usr/bin/ld: cannot find lm
    File "/usr/bin/yum", line 30
    python 中 lambda函数
  • 原文地址:https://www.cnblogs.com/presleyren/p/10771000.html
Copyright © 2020-2023  润新知