如何通过 Python 使用 GeckoDriver 和 Firefox 使 Selenium 脚本无法检测?

Posted

技术标签:

【中文标题】如何通过 Python 使用 GeckoDriver 和 Firefox 使 Selenium 脚本无法检测?【英文标题】:How can I make a Selenium script undetectable using GeckoDriver and Firefox through Python? 【发布时间】:2020-03-11 08:53:40 【问题描述】:

有没有办法使用 geckodriver 使您的 Selenium 脚本在 Python 中无法检测到?

我正在使用 Selenium 进行抓取。是否需要使用任何保护措施使网站无法检测到 Selenium?

【问题讨论】:

意义?您是否从网页中获取块? @HjSin 是的网站阻止了我,并在 1 到 2 分钟后一次又一次地给我验证码,他给了我验证码和其他 @HjSin 我认为该网站正在检测我 您在使用哪个网站? 如果一个网站被阻止,这意味着它不允许机器人。 【参考方案1】:

有不同的方法可以避免网站检测到 Selenium 的使用。

    使用 Selenium 时,navigator.webdriver 的值默认设置为 true。该变量将出现在 Chrome 和 Firefox 中。此变量应设置为“未定义”以避免检测。

    也可以使用代理服务器来避免检测。

    某些网站能够使用您浏览器的状态来确定您是否在使用 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”以检查它是否未定义。

【讨论】:

这是迄今为止唯一对我有用的解决方案。非常感谢分享! 我应该使用“DesiredCapabilities”尝试哪些示例? 这个解决方案对我有用,即使没有代理。唯一的一个问题是 Firfox 在打开配置文件期间挂起。所以我改变了第一个代码行:profile = webdriver.FirefoxProfile() @CST 您能否在 python selenium 中为 Google Chrome 浏览器编写相同的内容?那真的很有帮助。 我试过这个,它适用于 78.15.0esr 等旧版本的 Firefox,但现在我的浏览器更新到 91.3.0esr,它没有。 :( 我不断收到“禁止请求”【参考方案2】:

selenium 驱动的 Firefox / GeckoDriver 被检测到这一事实并不依赖于任何特定的 GeckoDriverFirefox 版本。 网站本身可以检测网络流量,并可以将浏览器客户端,即Web浏览器识别为WebDriver控制

根据WebDriver - W3C Living Document 最新编辑草稿中WebDriver Interface 的文档,webdriver-active 标志 最初设置为 false,当用户代理处于远程控制下时设置为true,即通过Selenium控制时。

现在 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。 如果您需要向一个网站发送多个请求,您需要不断更改每个请求的用户代理。在这里你可以找到关于Way to change Google Chrome user agent in Selenium?的详细讨论 要模拟 类人 行为,您可能需要减慢脚本执行速度,甚至超出WebDriverWait 和expected_conditions 诱导time.sleep(secs)。在这里你可以找到关于How to sleep webdriver in python for milliseconds的详细讨论

【讨论】:

我不确定我是否理解这一点。这面旗帜暴露在哪里?在http请求中?用户代理字符串的一部分?可以改吗? @d-b 该站点可以运行客户端 javascript,它评估变量并公开浏览器设置。为每个访问者运行,但对于合法用户活动来说不是问题。

以上是关于如何通过 Python 使用 GeckoDriver 和 Firefox 使 Selenium 脚本无法检测?的主要内容,如果未能解决你的问题,请参考以下文章

chromeIEFirefox驱动下载地址

如何通过[重复]使用Python组

我如何使用python通过https下载pdf文件

python - 如何通过输入将字符串单独转换为使用Python的数组?

如何通过使用python连接两个列表来创建一个列表

如何使用 Python 通过 SSL 连接到远程 PostgreSQL 数据库