赞
踩
webdriver检测这个问题最明显的就是淘宝登录,当我们使用不加任何隐藏处理的selenium
和pyppeteer
模拟登陆时,淘宝登录时的人机验证将会返回一个错误信息,其实很多其他网站的反爬机制也会检测这一条。所以我们使用selenium
和pyppeteer
这种库时就需要做webdriver的隐藏处理。
网上大多数处理这种问题就是使用js注入,但这种处理方法明显就是掩耳盗铃,认真思考后就会知道这种方案不可行,因为这些js注入都是在打开网页后进行的,网页早已检测到你是通过webdriver进行的网页访问。所以我们隐藏webdriver的方法应该是在打开网页之前,生成浏览器对象后。之前的方案可以通过开启Chrome浏览器的实验性功能参数 excludeSwitches
,但在Chrome浏览器的安全更新后,这个方法失效了,目前可行方法是调用Chrome浏览器CDP的Page.addScriptToEvaluateOnNewDocument
命令,通过这个命令可以让Chrome浏览器打开页面时先执行我们所给的js脚本。具体的讲解可以查阅 这篇文章 。selenium
和pyppeteer
的使用代码如下:
from selenium.webdriver import Chrome
driver = Chrome()
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
})
"""
})
driver.get('https://www.baidu.com')
from pyppeteer import launch
async def main():
browser = await launch(headless=False, userDataDir='F:\\python\\userdata', args=['--disable-infobars'])
page = await browser.newPage()
await page.evaluateOnNewDocument('''() => {
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
})
}
''')
await page.goto('https://www.baidu.com')
当然也可以通过编写Chrome浏览器的插件来达到隐藏webdriver的目的,但是相对于这种方法来说略显麻烦,不过优点在于会更稳定一些,不会受到Chrome更新的影响。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。