📜  阻止网站硒 (1)

📅  最后修改于: 2023-12-03 15:28:50.172000             🧑  作者: Mango

阻止网站硒

当你需要自动化地执行网站操作时,Selenium是一个十分有用的工具,但是有些网站会通过监测Selenium使用的环境来限制你的自动化。本文将介绍一些防止你的Selenium自动化被网站监测到的方法。

1. 修改Selenium默认配置

在启动Selenium时,我们可以修改一些默认配置来避免被监测到:

from selenium import webdriver

options = webdriver.ChromeOptions()
options.add_argument('--disable-blink-features=AutomationControlled')
options.add_argument('--disable-extensions')
options.add_argument('--disable-notifications')
options.add_argument('--disable-popup-blocking')
options.add_argument('--disable-save-password-bubble')
options.add_argument('--disable-infobars')
options.add_argument('--start-maximized')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
options.add_argument('--allow-file-access-from-files')
options.add_argument('--disable-web-security')
options.add_argument('--disable-gpu')

driver = webdriver.Chrome(options=options)

这段代码会禁用一些与Selenium使用有关的浏览器特性,并且以无界面模式启动浏览器。但是,即便如此也不一定能完全避免被监测到,还需要进行一些页面级别的处理。

2. 修改页面

大多数网站都是通过JS来检测是否在使用Selenium,我们可以去掉一些JS代码来避免被监测到。对于这个过程,可以使用Selenium提供的execute_script()方法将一些JS代码注入到页面中。

例如,下面是如何去除一些常见的Selenium特征的代码:

driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})")
driver.execute_script("window.navigator.chrome = {runtime: {},  };")
driver.execute_script("window.navigator.plugins = []")
driver.execute_script("window.navigator.languages = ['zh-CN', 'zh', 'en', 'ja', 'ko']")
driver.execute_script("const newProto = navigator.__proto__")
driver.execute_script("delete newProto.webdriver")
driver.execute_script("navigator.__proto__ = newProto")

这些JS代码会去掉窗口大小、设备像素比率、浏览器插件、语言偏好等特征。但是需要注意的是,这些代码不可能去掉所有的特征,有可能还需要进一步优化。

3. 使用代理

一些网站可以在客户端和服务器之间添加一些代码,来检测客户端的请求是否来自于Selenium。为了避免这种情况,我们可以使用代理来隐藏Selenium的存在。

from selenium import webdriver
from proxy_manager import ProxyManager  # 这里可以使用任何代理IP池的库


options = webdriver.ChromeOptions()
options.add_argument('--disable-blink-features=AutomationControlled')
options.add_argument('--disable-extensions')
options.add_argument('--disable-notifications')
options.add_argument('--disable-popup-blocking')
options.add_argument('--disable-save-password-bubble')
options.add_argument('--disable-infobars')
options.add_argument('--start-maximized')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
options.add_argument('--allow-file-access-from-files')
options.add_argument('--disable-web-security')
options.add_argument('--disable-gpu')
options.add_argument(f'--proxy-server=http://{ProxyManager().get()}') # 这里使用了一个代理IP池库

driver = webdriver.Chrome(options=options)

这段代码会在启动Chrome时使用一个代理IP,这样网站就无法通过IP来检测你是否在使用Selenium了。

总结

Selenium是一个十分强大的工具,但是被网站监测到会给自动化带来很多麻烦。本文介绍了一些避免被监测的方法,但是这只是个开始。实际应用时需要根据具体网站情况进行调优。