java - 有没有一种新的技术来检测我们由 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 时,网站可以检测到吗? ”并没有解决问题,请注意!
解决方案
我对以下 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()
})()
推荐阅读
- javascript - 尝试进行更清晰的异步 JSON 翻译调用
- javascript - 开玩笑的反应 onSubmit 不包括方法
- java - Java - 在导航到具有相同 html 模板的不同页面时断言类包含文本
- php - 使用 vsmoraes/laravel-pdf 包在 laravel 中返回带有变量的视图
- latex - 未定义的控制序列 \chapter
- sql - 在 SELECT 语句中声明和使用变量
- javascript - JavaScript强制点击下载?
- angular6 - 通过 Angular 应用程序代理 api 服务器
- c# - LINQ 到列表
- cocoa - 当我使用 NSView.dataWithPDF(inside:) 时如何影响背景颜色