首页 > 解决方案 > 有没有一种新的技术来检测我们由 webdriver 控制的 chrome?

问题描述

我正在使用基于 Webdriver 的爬虫从中国新闻网站(今日头条)收集信息。自 2020 年以来美联储。16、我发现网站没有响应webdriver程序控制的chrome的任何数据,但是chrome手动启动正常(如下图所示)。

左边是手动启动的chrome,右边是webdriver控制的chrome。

在此处输入图像描述

两个 chrome 在同一个 IP 上工作,我为这两个 chrome 定义了相同的用户代理。此外,我使用以下代码(来自DebanjanB)删除“navigator.webdriver”(如上图所示,代码成功):

options = webdriver.ChromeOptions() 
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)
driver = webdriver.Chrome(options=options, executable_path=r'./chromedriver')
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
  "source": """
    Object.defineProperty(navigator, 'webdriver', {
      get: () => undefined
    })
  """
})

总结一下,删除了相同的 IP、用户代理和“navigator.webdriver”。为什么网站仍然检测到我的 chrome 是由 webdriver 控制的?

更新

网站通过访问 url 来获取内容。如果我从手动启动 chrome 复制并访问 url(带有加密参数)到 webdriver 控制的 chrome,服务器将向 webdriver 发送正确的信息。

因此,网站在生成 url 及其加密参数时肯定会检测到 webdriver。

更新 2

讨论“当您使用 chromedriver 使用 selenium 时,网站可以检测到吗? ”并没有解决问题,请注意!

标签: javapythongoogle-chromeselenium-webdriver

解决方案


我对以下 puppeteer 脚本很幸运(不完全是无头的,但希望可以使用)

'use strict'
/* Get puppeteer api */
const puppeteer = require('puppeteer')
const { TimeoutError } = require('puppeteer/Errors')
const ElementHandle = require('puppeteer/lib/JSHandle').ElementHandle
;(async () => {
    console.log('start')
    const browser = await puppeteer.launch({
        headless: false,
        defaultViewport: null,
        //product: "firefox",
        //userDataDir: '/Users/bartic/Library/Application Support/Chromium',
        ignoreHTTPSErrors: true,
        args: [
            '--disable-infobars',
            `--window-size=1900,1000`,
            `--window-position=100,0`,
        ],
        pipe: false,
        devtools: true
    })
    console.log('browser created')
    // Pass the Webdriver Test
    const page = await browser.newPage()
    await page.evaluateOnNewDocument(() => {
      delete navigator.__proto__.webdriver;
    });
    await page.goto('https://www.toutiao.com/')
    console.log('on page')
    await page.waitForNavigation()
})()


推荐阅读