对于使用模拟登陆等操作来爬虫的手段,已经很容易被检测了,网上很多教程是说在网站所有js代码执行之前来执行下面几个js代码来到达效果:
js1 = '''() =>{Object.defineProperties(navigator,{ webdriver:{ get: () => false}})}'''
js2 = '''() => {alert(window.navigator.webdriver)}'''
js3 = '''() => {window.navigator.chrome = {runtime: {}, }; }'''
js4 = '''() =>{Object.defineProperty(navigator, 'languages', {get: () => ['en-US', 'en']});}'''
js5 = '''() =>{Object.defineProperty(navigator, 'plugins', {get: () => [1, 2, 3, 4, 5,6],});}'''
确实修改成功了。这种写法就万无一失了吗?并不是这样的,如果此时你在模拟浏览器中通过点击链接、输入网址进入另一个页面,或者开启新的窗口,你会发现,window.navigator.webdriver
这个对象又变成true了,所以这样并非根治。
原理大概如下:在启动Chromedriver之前,为Chrome开启实验性功能参数 excludeSwitches,它的值为 [‘enable-automation’]
from selenium.webdriver import Chrome, ChromeOptions
option = ChromeOptions()
option.add_experimental_option("excludeSwitches", ["enable-automation"])
driver = Chrome(options=option)
然后设置这个参数之后,Chrome浏览器会提示你,叫你“停用开发者模式运行的扩展程序”,这时候你不要点击“停用”,你只需要忽略它或者点击那个叉叉,把它关掉即可。
上面这个方法是能够有效根治这个被检测的问题。
由于Selenium启动的Chrome中,有几十个特征可以被识别,所以在爬虫界已经没有以前那么受欢迎了。模拟浏览器的新秀Puppeteer异军突起,逐渐受到了爬虫界的关注。Puppeteer需要使用JavaScript来控制,如果你是用Python,那么就需要使用Pyppeteer.
如果你使用模拟浏览器爬淘宝,你会发现,无论怎么修改参数,Selenium总是可以立刻被识别。但是如果你使用了本文的方法,用Pyppeteer抓取淘宝,你就会发现另外一个广阔的天地。
写这篇文章的时候(2019-08-15),Pyppeteer的最新版本为0.0.25
此时,你可以在PyCharm中,按住Command键(Windows、Linux用户按住Ctrl键),鼠标左键点击 frompyppeteerimportlaunch中的 launch,自动跳转到Pyppeteer源代码中的 launcher.py文件
把代码往上翻,在第61行左右,找到如下的代码:
AUTOMATION_ARGS = [
'--enable-automation',
'--password-store=basic',
'--use-mock-keychain',
]
将其改成:
AUTOMATION_ARGS = [
# '--enable-automation', # 注释掉可以设置window.nagivator.webdriver为undefined
'--password-store=basic',
'--use-mock-keychain',
]
当你修改的时候,pycharm工具会提示你是否修改源码,选择OK
即可,如果你想以后改回来也可以改回来,不过看官方的开源介绍,下一个版本0.0.26是支持通过传递参数来设置这些值的,所以让我们一起期待下一个版本呗!
python最好用的第三方库资源下载网址
详细讲解aiohttp异步请求及使用,高效率
CSS字体反爬实战,10分钟就能学会;
爬虫:js逆向目前遇到的知识点集合