在使用selenium或者pyppeteer内置的chrmoe浏览器进行爬虫或者模拟操作中,用无头浏览器headless=False会被目标网站检测出使用了webdriver属性,被目标网站判断出为非人工操作,可能会被目标网站提示安全验证或者一直进行报错。


在网上大概了解到一些解决方式,关于无头浏览器webdriver属性检测如何绕过检查,使得模拟浏览器的行为更像真实浏览器一样模拟用户行为。


webdriver检测


正常打开浏览器,在控制台输出window.navigator.webdriver显示信息是false。


chrome无头浏览器指纹检测进行绕过的几种方式_chrome


而如果在用pyppeteer进行模拟浏览登录的话,这个值会是True


chrome无头浏览器指纹检测进行绕过的几种方式_chrome_02


所以模拟浏览器这一项会被目标网站检测到,从而进行反爬了。那么解决这一项,我们可以在代码中注入js,从而进行绕过其检查


await self.page.evaluateOnNewDocument('''() => {
Object.defineProperty(navigator, 'webdriver', {
get: () => false
})
''')

再次进行测试,发现该值已经成功修改。


chrome无头浏览器指纹检测进行绕过的几种方式_chrome_03


在网上了解到,大多数是这个代码,而这个代码在实际测试中发现不管用,所以这种写法可能是错误的

await self.page.evaluate('''() =>{ Object.defineProperties(navigator,{ webdriver:{ get: () => false } }) }''')


chrome检测


正常浏览器在控制台输出window.chrome,是有返回值的


chrome无头浏览器指纹检测进行绕过的几种方式_lua_04


而在实际模拟浏览器的时候,该值为None


chrome无头浏览器指纹检测进行绕过的几种方式_chrome_05


那么在代码中,要加入这串代码


await self.page.evaluateOnNewDocument('''() =>{ window.chrome = { runtime: {},

}; }''')


再次测试,返回值为不为None了,至于为什么这么写,我也不清楚。总之写进去总是好的


chrome无头浏览器指纹检测进行绕过的几种方式_chrome_06


plugins长度检测


正常浏览器在控制台输出window.navigator.plugins 显示结果为


chrome无头浏览器指纹检测进行绕过的几种方式_chrome_07


而在实际模拟浏览器的时候,该值为空,也就是长度为0


chrome无头浏览器指纹检测进行绕过的几种方式_lua_08


在代码中,加入这串代码


await self.page.evaluateOnNewDocument('''() =>{ Object.defineProperty(navigator, 'plugins', { get: () => [1, 2, 3, 4, 5,6], }); }''')


运行后,可以看到返回值了,长度不为0


chrome无头浏览器指纹检测进行绕过的几种方式_lua_09


总之,能不能用上,就不清楚了,加进去总比不加好,至于还有其他什么的浏览器指纹,后面会继续学习,不断优化!