有没有办法在Python中使用geckodriver使你的Selenium脚本不被检测到?
我正在使用Selenium进行爬取。是否需要采取任何保护措施以避免网站检测到Selenium?
有没有办法在Python中使用geckodriver使你的Selenium脚本不被检测到?
我正在使用Selenium进行爬取。是否需要采取任何保护措施以避免网站检测到Selenium?
有不同的方法来避免网站检测到Selenium的使用。
当使用Selenium时,默认情况下navigator.webdriver的值会被设置为true。这个变量将在Chrome和Firefox中存在。为了避免检测,应该将此变量设置为“undefined”。
还可以使用代理服务器来避免检测。
一些网站能够利用您的浏览器状态来确定是否使用了Selenium。您可以设置Selenium使用自定义浏览器配置文件来避免这种情况。
下面的代码同时使用了这三种方法。
profile = webdriver.FirefoxProfile('C:\\Users\\You\\AppData\\Roaming\\Mozilla\\Firefox\\Profiles\\something.default-release')
PROXY_HOST = "12.12.12.123"
PROXY_PORT = "1234"
profile.set_preference("network.proxy.type", 1)
profile.set_preference("network.proxy.http", PROXY_HOST)
profile.set_preference("network.proxy.http_port", int(PROXY_PORT))
profile.set_preference("dom.webdriver.enabled", False)
profile.set_preference('useAutomationExtension', False)
profile.update_preferences()
desired = DesiredCapabilities.FIREFOX
driver = webdriver.Firefox(firefox_profile=profile, desired_capabilities=desired)
运行代码后,您将能够手动检查Selenium运行的浏览器是否具有您的Firefox历史记录和扩展程序。您还可以在devtools控制台中键入“navigator.webdriver”来检查它是否未定义。
selenium driven Firefox / GeckoDriver被检测到的事实,并不取决于任何特定的 GeckoDriver 或 Firefox 版本。 网站本身可以检测网络流量并识别浏览器客户端,即Web浏览器是 WebDriver控制。
根据最新的WebDriver接口
编辑草案和 WebDriver - W3C Living Document 文档,当用户代理处于远程控制下,即通过Selenium控制时,最初设置为 false的
webdriver-active 标志设置为true。
现在, NavigatorAutomationInformation 界面不应暴露在 WorkerNavigator 上。
所以,
webdriver
Returns true if webdriver-active flag is set, false otherwise.
然而,
navigator.webdriver
Defines a standard way for co-operating user agents to inform the document that it is controlled by WebDriver, for example so that alternate code paths can be triggered during automation.
因此,结论是:
Selenium会被识别出来
然而,以下是一些通用方法,可以避免在网络爬虫时被检测到:
- 网站可以通过您的监视器尺寸来确定您的脚本/程序,因此建议不要使用传统的Viewport。
- 如果您需要向网站发送多个请求,则需要在每个请求中不断更改用户代理。在这里,您可以找到有关如何在Selenium中更改Google Chrome用户代理的详细讨论?
- 为了模拟类似人类的行为,您可能需要减慢脚本执行速度,甚至超过WebDriverWait和expected_conditions,引入
time.sleep(secs)
。在这里,您可以找到有关如何在Python中为Webdriver睡眠毫秒的详细讨论
已经有成千上万的讨论要求禁用navigator.webdriver == true的选项吗?,而@whimboo
在他的评论中得出结论:
这是因为WebDriver规范在Navigator对象上定义了该属性,在启用webdriver运行测试时必须将其设置为true:
https://w3c.github.io/webdriver/#interface
实现必须符合此要求。 因此,我们不会提供规避它的方法。
通过以上讨论,可以得出以下结论:
Selenium 会自我识别
并且无法隐藏浏览器是由 WebDriver 驱动的这一事实。
然而,一些用户提出了可以隐藏 Mozilla Firefox 浏览器是 WebDriver 控制的方法,通过使用 Firefox Profiles 和 Proxies,如下所示:
from selenium.webdriver import Firefox
from selenium import webdriver
from selenium.webdriver.firefox.service import Service
from selenium.webdriver.firefox.options import Options
profile_path = r'C:\Users\Admin\AppData\Roaming\Mozilla\Firefox\Profiles\s8543x41.default-release'
options=Options()
options.set_preference('profile', profile_path)
options.set_preference('network.proxy.type', 1)
options.set_preference('network.proxy.socks', '127.0.0.1')
options.set_preference('network.proxy.socks_port', 9050)
options.set_preference('network.proxy.socks_remote_dns', False)
service = Service('C:\\BrowserDrivers\\geckodriver.exe')
driver = Firefox(service=service, options=options)
driver.get("https://www.google.com")
driver.quit()
观察发现,在某些特定的操作系统变体中,以下几种不同的设置/配置可以绕过机器人检测:
selenium4 兼容代码块
from selenium import webdriver
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.chrome.service import Service
options = Options()
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('excludeSwitches', ['enable-logging'])
options.add_experimental_option('useAutomationExtension', False)
options.add_argument('--disable-blink-features=AutomationControlled')
s = Service('C:\\BrowserDrivers\\geckodriver.exe')
driver = webdriver.Chrome(service=s, options=options)
一个可能的解决方案是使用tor浏览器,如下所示:
from selenium.webdriver import Firefox
from selenium import webdriver
from selenium.webdriver.firefox.service import Service
from selenium.webdriver.firefox.options import Options
import os
torexe = os.popen(r'C:\Users\username\Desktop\Tor Browser\Browser\TorBrowser\Tor\tor.exe')
profile_path = r'C:\Users\username\Desktop\Tor Browser\Browser\TorBrowser\Data\Browser\profile.default'
firefox_options=Options()
firefox_options.set_preference('profile', profile_path)
firefox_options.set_preference('network.proxy.type', 1)
firefox_options.set_preference('network.proxy.socks', '127.0.0.1')
firefox_options.set_preference('network.proxy.socks_port', 9050)
firefox_options.set_preference("network.proxy.socks_remote_dns", False)
firefox_options.binary_location = r'C:\Users\username\Desktop\Tor Browser\Browser\firefox.exe'
service = Service('C:\\BrowserDrivers\\geckodriver.exe')
driver = webdriver.Firefox(service=service, options=firefox_options)
driver.get("https://www.tiktok.com/")
AttributeError:'Options'对象没有属性'add_experimental_option'
;是否有支持此功能的不同版本的Selenium?使用第三种方法(“潜在解决方案”),我发现TikTok对于Tor只是无条件地返回“访问被拒绝”。 - Kodiologistpopen
行是一个空操作。感谢您一直以来的支持。 - Kodiologistnavigator.webdriver
返回true
符合规范。 chromedriver
有选项--disable-blink-features=AutomationControlled
来禁用它,但Mozilla已经拒绝添加相应的选项。在Firefox 88之前,可以通过dom.webdriver.enabled
来禁用,但这不再是受支持的首选项。 useAutomationExtension
在其他地方发布,但似乎也只适用于Chrome。selenium-wire
}}修改响应来覆盖navigator.webdriver
的值,如{{link5:此答案}}中所述。例如,通过注入以下脚本:Object.defineProperty(navigator, "webdriver", { get: () => false });
undetected-chromedriver
的功能,该功能目前没有Firefox版本。