针对浏览器的几种反爬虫的机制

Posted by hello vbnmjj on January 9, 2025
我在涉及到浏览器检测,反爬虫的时候,见识到了 disable-blink-features=AutomationControlled:禁用 blink 特征 这个是什么呢?
ChatGPT 说:
disable-blink-features=AutomationControlled 是一个 Chrome 启动选项,主要用于绕过浏览器对自动化工具(如 Selenium、Puppeteer 等)的检测。它作用于浏览器的 Blink 渲染引擎(Chrome 使用的渲染引擎)中的某些特性,具体来说,它与浏览器是否被自动化工具控制相关

为什么需要禁用 `AutomationControlled`?

当你使用 Selenium 或其他浏览器自动化工具时,浏览器会暴露一些可以用来检测自动化行为的特征。例如:

  • navigator.webdriver 属性会被设置为 true,这个属性表示浏览器是在自动化控制下运行的。可以再
  • 浏览器的开发者工具(DevTools)可能显示一些信息,提示当前浏览器正在被自动化工具控制。

这些特征可能会被某些网站的反爬虫系统检测出来,从而阻止你执行自动化操作。

`disable-blink-features=AutomationControlled` 如何工作?

通过设置 disable-blink-features=AutomationControlled,你禁用了浏览器的自动化控制检测功能,使得浏览器表现得更像是一个正常的用户操作,而不是自动化工具。这个选项会影响 Blink 渲染引擎中的一些检测机制,避免 navigator.webdriver 和其他自动化相关特征被暴露。

如何使用?

如果你使用 ChromeDriver 和 Selenium,可以在启动时通过以下方式配置 Chrome 启动选项:

python


复制代码
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

# 配置 ChromeOptions
chrome_options = Options()
chrome_options.add_argument("--disable-blink-features=AutomationControlled")

# 启动浏览器
driver = webdriver.Chrome(options=chrome_options)

# 打开目标页面
driver.get("https://example.com")

其他相关选项

除了 disable-blink-features=AutomationControlled,还有一些其他常见的浏览器启动选项,可以帮助避免反爬虫检测:

  • --headless:无头模式,不打开浏览器窗口。
  • --no-sandbox:禁用沙盒(有时需要在某些环境中使用,比如 CI/CD)。
  • --disable-dev-shm-usage:解决在某些环境中可能出现的共享内存问题。
  • --disable-gpu:禁用 GPU 加速。

总结

disable-blink-features=AutomationControlled 主要是用来隐藏浏览器中的一些自动化控制痕迹,帮助绕过反爬虫机制的检测。这在某些爬虫任务中非常有用,尤其是当目标网站采用了比较复杂的浏览器行为检测时。

接管已经打开的浏览器: 最为推荐的。


先打开一个浏览器,并开放监听端口:

chrome --remote-debugging-port=xxxx --user-data-dir = "d:\selenium"

然后selenium,指定要到这个浏览器开放的调试端口就行了

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_experimental_option("debuggerAddress", "127.0.0.1:xxxx")
driver = webdriver.Chrome(options=options)
driver.get('https://bot.sannysoft.com/')

selenium获取元素源码的几种方式

#1.获取外部源码
browser.get('https://www.baidu.com')
element_a  = browser.find_element('a')
element_a.find_element('a')
#获取element中的源码
a_outer_html = element_a.get_attribute('outerHTML')

#2. 获取内部源码
a_inner_html = element_a.get_attribute('innerHTML')