我正在使用一个基于网络驱动程序的爬虫从一个中文新闻网站(Toutiao)收集信息。自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
})
"""
})Summery,删除相同的IP、用户代理和navigator.webdriver。为什么网站仍然检测到我的chrome是由webdriver控制的?
更新
该网站通过访问url来获取内容。如果我从主启动的chrome复制并访问url (带有加密的参数)到webdriver控制的chrome,服务器会向webdriver发送当前的信息。
因此,网站在生成url及其加密参数时会明确检测webdriver。
更新2
讨论"Can a website detect when you are using selenium with chromedriver?“并不能解决问题,请注意!
发布于 2020-06-23 04:04:46
我很幸运地使用了下面的木偶操纵者脚本(不完全是无用的,但希望能有用)
'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()
})()
https://stackoverflow.com/questions/60275464
复制相似问题