在使用selenium或者pyppeteer内置的chrmoe浏览器进行爬虫或者模拟操作中,用无头浏览器headless=False
会被目标网站检测出使用了webdriver属性,被目标网站判断出为非人工操作,可能会被目标网站提示安全验证或者一直进行报错。
在网上大概了解到一些解决方式,关于无头浏览器webdriver属性检测如何绕过检查,使得模拟浏览器的行为更像真实浏览器一样模拟用户行为。
webdriver检测
正常打开浏览器,在控制台输出window.navigator.webdriver
显示信息是false。
而如果在用pyppeteer进行模拟浏览登录的话,这个值会是True
所以模拟浏览器这一项会被目标网站检测到,从而进行反爬了。那么解决这一项,我们可以在代码中注入js,从而进行绕过其检查
await self.page.evaluateOnNewDocument('''() => {
Object.defineProperty(navigator, 'webdriver', {
get: () => false
})
''')
再次进行测试,发现该值已经成功修改。
在网上了解到,大多数是这个代码,而这个代码在实际测试中发现不管用,所以这种写法可能是错误的
await self.page.evaluate('''() =>{ Object.defineProperties(navigator,{ webdriver:{ get: () => false } }) }''')
chrome检测
正常浏览器在控制台输出window.chrome
,是有返回值的
而在实际模拟浏览器的时候,该值为None
那么在代码中,要加入这串代码
await self.page.evaluateOnNewDocument('''() =>{ window.chrome = { runtime: {},
}; }''')
再次测试,返回值为不为None了,至于为什么这么写,我也不清楚。总之写进去总是好的
plugins长度检测
正常浏览器在控制台输出window.navigator.plugins
显示结果为
而在实际模拟浏览器的时候,该值为空,也就是长度为0
在代码中,加入这串代码
await self.page.evaluateOnNewDocument('''() =>{ Object.defineProperty(navigator, 'plugins', { get: () => [1, 2, 3, 4, 5,6], }); }''')
运行后,可以看到返回值了,长度不为0
总之,能不能用上,就不清楚了,加进去总比不加好,至于还有其他什么的浏览器指纹,后面会继续学习,不断优化!