如何正确移除中Pyppeteer的window.navigator.webdriver

发布时间:2021-12-04 19:23:57 作者:柒染
来源:亿速云 阅读:189
# 如何正确移除Pyppeteer中的window.navigator.webdriver

## 引言

在现代Web自动化测试和爬虫开发中,Pyppeteer作为Python版的Puppeteer,因其强大的无头浏览器控制能力而广受欢迎。然而,许多网站会通过检测`window.navigator.webdriver`属性来识别自动化脚本。本文将深入探讨如何有效移除这一特征,使您的Pyppeteer脚本更难被检测。

---

## 一、为什么需要移除webdriver属性

### 1.1 反爬虫机制的工作原理
现代网站常通过以下方式检测自动化工具:
- 检查`navigator.webdriver`属性(Chrome 79+默认设为true)
- 检测浏览器指纹特征
- 监控异常用户行为模式

### 1.2 典型检测场景
```javascript
if(navigator.webdriver){
    console.log("Bot detected!");
    // 触发反爬措施
}

二、Pyppeteer底层原理分析

2.1 Chromium与CDP协议

Pyppeteer通过Chrome DevTools Protocol(CDP)控制浏览器,当启用自动化模式时: - Chrome会自动设置navigator.webdriver=true - 修改部分API行为(如Notification.permission

2.2 默认暴露的特征

通过chrome://version/可见:

Command-line: --enable-automation

三、基础解决方案

3.1 启动参数法(不推荐)

browser = await launch(headless=False, args=['--disable-blink-features=AutomationControlled'])

缺点:仅对部分旧版本有效

3.2 页面评估覆盖法

await page.evaluateOnNewDocument('''() => {
    delete navigator.__proto__.webdriver;
}''')

注意:需要在页面加载前执行


四、高级解决方案

4.1 CDP覆盖法(推荐)

async def stealth_mode(page):
    await page.evaluateOnNewDocument('''() => {
        const originalQuery = window.navigator.permissions.query;
        window.navigator.permissions.query = (parameters) => (
            parameters.name === 'notifications' ?
                Promise.resolve({ state: Notification.permission }) :
                originalQuery(parameters)
        );
        
        Object.defineProperty(navigator, 'webdriver', {
            get: () => false,
        });
    }''')
    
    # 移除自动化标志
    await page._client.send('Page.addScriptToEvaluateOnNewDocument', {
        'source': '''
            Object.defineProperty(navigator, 'webdriver', {
                get: () => undefined,
            });
        '''
    })

4.2 完整指纹伪装方案

from pyppeteer import launch
import random

async def create_stealth_browser():
    browser = await launch(headless=True, args=[
        '--no-sandbox',
        '--disable-setuid-sandbox',
        '--disable-infobars',
        '--window-position=0,0',
        f'--user-agent={generate_random_ua()}',
        '--disable-web-security'
    ])
    
    page = await browser.newPage()
    await stealth_mode(page)  # 调用前面的函数
    
    # 设置视窗大小随机化
    await page.setViewport({
        'width': random.randint(1200, 1920),
        'height': random.randint(800, 1080)
    })
    
    return browser, page

五、验证解决方案有效性

5.1 自动化检测测试网站

5.2 本地验证脚本

async def check_stealth(page):
    result = await page.evaluate('''() => ({
        webdriver: window.navigator.webdriver,
        plugins: navigator.plugins.length,
        languages: navigator.languages,
    })''')
    print("Detection results:", result)

六、常见问题排查

6.1 仍然被检测到的可能原因

  1. 未在page.goto()前执行脚本
  2. 存在其他指纹特征(如WebGL渲染)
  3. 浏览器版本与补丁不匹配

6.2 性能优化建议


七、法律与伦理考量

7.1 合法使用原则

7.2 推荐做法

# 添加合规延迟
await page.waitFor(3000 + random.randint(0,2000)) 

结语

通过本文介绍的技术,您应该能够有效隐藏Pyppeteer的自动化特征。需要注意的是,反检测技术是与网站安全措施持续博弈的过程,建议定期更新检测方案。理想情况下,应结合IP轮换、行为模拟等技术构建完整的反反爬体系。

最后更新:2023年11月 | 作者:助手 | 转载请注明出处 “`

这篇文章包含了: 1. 问题背景和技术原理 2. 分层次的解决方案 3. 验证方法和调试技巧 4. 法律合规建议 5. 完整的代码示例

总字数约1350字,采用Markdown格式,包含代码块、列表、标题层级等标准元素。可根据需要进一步扩展特定章节的细节。

推荐阅读:
  1. python pyppeteer使用笔记
  2. 如何移除docker中的容器

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

pyppeteer

上一篇:怎样进行赋能Jupyter Notebooks

下一篇:如何使用Jupyter Book发布自己的网页版代码书

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》