在写爬虫,面对不少js 加载的页面,不少人一筹莫展,更多的人喜欢用Senlenium+ Webdriver,古语有云:道高一尺魔高一丈。已淘宝为首,众多网站都针对 Selenium的js监测机制, 好比:window.navigator.webdriver,navigator.languages,navigator.plugins.length……web
正常状况下咱们用浏览器访问淘宝等网站的 window.navigator.webdriver的值为
undefined。 浏览器
当咱们用selenium 的时候, window.navigator.webdriver的值为 true。服务器
那么如何解决这个问题呢? async
第一种:使用mitmproxy用中间人的方式截取服务器发送来的js,修改js里面函数的参值方式发送给服务器。至关于在browser和server之间作一层中介的拦截。不过此方法要对js很是熟悉的人才好实施。函数
第二种方法依旧经过selenium,不过是在服务器在第一次发送js并在本地验证的时候,作好‘第一次’的假装,从而实现‘第一次登录’有效。。方法简单,适合小白。工具
以前我写过一次用 pyppeteer 加 asyncio 绕过selenium检测的方案,对于新手来讲比较麻烦,如今我有了更好的解决方案。网站
只须要设置Chromedriver的启动参数便可解决问题。code
在启动Chromedriver以前,为Chrome开启实验性功能参数excludeSwitches
,它的值为['enable-automation']
,完整代码以下:server
from selenium.webdriver import Chrome from selenium.webdriver import ChromeOptions option = ChromeOptions() option.add_experimental_option('excludeSwitches', ['enable-automation']) driver = Chrome(options=option)
此时启动的Chrome窗口,在右上角会弹出一个提示,不用管它,不要点击停用
按钮。ci
再次在开发者工具的Console选项卡中查询window.navigator.webdriver
,能够发现这个值已经自动变成undefined
了。而且不管你打开新的网页,开启新的窗口仍是点击连接进入其余页面,都不会让它变成true
。运行效果以下图所示。