求助:Python中使用pyppeteer执行JS仍然被检测到WebDriver怎么办?
执行的 JS:
js1 = '''() =>{ Object.defineProperties(navigator,{ webdriver:{ get: () => false } }) }'''
js2 = '''() => { alert ( window.navigator.webdriver ) }'''
弹出的结果的确为 false
可是在登陆时仍然被网站检测到了,验证码一直无法通过,正常浏览器访问则可以通过
用检测工具也的确检测到了 WebDriver:

我在网上搜到的资料,别人貌似都成功了,请问我该如何做?
求助:Python中使用pyppeteer执行JS仍然被检测到WebDriver怎么办?
刚刚解决了😂
因为有页面的跳转,我将执行 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.chrome或navigator.plugins。另外,关闭AutomationControlled特性也有帮助。
如果还不行,可以试试用pyppeteer-stealth这个包,它封装了更多反检测策略。不过自己动手修改通常更灵活。
总结:直接覆盖浏览器环境的检测属性最有效。
加个 page 回调就可以了
是放在 goto 之后执行吗? 我的还是被检测到了, 你用的 chrome/driver 是什么版本的呀?
是在 goto 后执行
75.0.3770.142/75.0.3770.140

