求助:Python中使用pyppeteer执行JS仍然被检测到WebDriver怎么办?

执行的 JS:

js1 = '''() =>{ Object.defineProperties(navigator,{ webdriver:{ get: () => false } }) }'''

js2 = '''() => { alert ( window.navigator.webdriver ) }'''

弹出的结果的确为 false

可是在登陆时仍然被网站检测到了,验证码一直无法通过,正常浏览器访问则可以通过

用检测工具也的确检测到了 WebDriver: 1560308022(1).png

我在网上搜到的资料,别人貌似都成功了,请问我该如何做?


求助:Python中使用pyppeteer执行JS仍然被检测到WebDriver怎么办?

5 回复

刚刚解决了😂

因为有页面的跳转,我将执行 JS 的语句放到页面跳转后执行就可以了

所以要记得如果有页面跳转的话之前执行的 JS 就不生效了😂


遇到这个问题确实挺烦的。pyppeteer虽然能模拟真实浏览器,但一些网站会通过检测navigator.webdriver等属性来识别自动化工具。我常用的方法是注入JS来覆盖这些检测点。

下面是一个完整的示例,它创建了一个隐藏WebDriver特征的浏览器实例:

import asyncio
from pyppeteer import launch

async def stealth_browser():
    browser = await launch(
        headless=False,  # 有些网站对无头模式检测严格
        args=[
            '--disable-blink-features=AutomationControlled',
            '--disable-infobars',
            '--window-size=1920,1080',
            '--no-sandbox'
        ]
    )
    
    page = await browser.newPage()
    
    # 关键:执行JS来覆盖WebDriver特征
    await page.evaluateOnNewDocument('''
        () => {
            // 覆盖webdriver标志
            Object.defineProperty(navigator, 'webdriver', {
                get: () => undefined
            });
            
            // 覆盖chrome对象中的某些属性
            window.chrome = {
                runtime: {},
                // 添加其他chrome属性...
            };
            
            // 处理plugins长度
            Object.defineProperty(navigator, 'plugins', {
                get: () => [1, 2, 3, 4, 5]
            });
            
            // 处理languages
            Object.defineProperty(navigator, 'languages', {
                get: () => ['zh-CN', 'zh', 'en']
            });
        }
    ''')
    
    # 设置User-Agent(可选)
    await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36')
    
    return browser, page

async def main():
    browser, page = await stealth_browser()
    try:
        await page.goto('https://你的目标网站.com')
        # 这里可以添加你的操作代码
        await asyncio.sleep(5)
    finally:
        await browser.close()

if __name__ == '__main__':
    asyncio.run(main())

核心思路是在页面加载前通过evaluateOnNewDocument注入JS,直接修改浏览器环境的属性。重点覆盖navigator.webdriver,有些网站还会检查window.chromenavigator.plugins。另外,关闭AutomationControlled特性也有帮助。

如果还不行,可以试试用pyppeteer-stealth这个包,它封装了更多反检测策略。不过自己动手修改通常更灵活。

总结:直接覆盖浏览器环境的检测属性最有效。

加个 page 回调就可以了

是放在 goto 之后执行吗? 我的还是被检测到了, 你用的 chrome/driver 是什么版本的呀?

是在 goto 后执行

75.0.3770.142/75.0.3770.140

回到顶部