Cloudflare 和 Chromedriver - cloudflare 区分 chrome 驱动程序和正版 chrome 驱动程序?

Cloudflare and Chromedriver - cloudflare distinguishes between chromedriver and genuine chrome?

我想使用 chrome 驱动程序从 fanfiction.net 中抓取一些故事。 我尝试以下操作:

from selenium import webdriver
import time

path = 'D:\chromedriver\chromedriver.exe'

browser = webdriver.Chrome(path)
url1 = 'https://www.fanfiction.net/s/8832472'
url2 = 'https://www.fanfiction.net/s/5218118'

browser.get(url1)
time.sleep(5)
browser.get(url2)

第一个link打开(有时我要等5秒)。当我想加载第二个 url 时,cloudflare 介入并要我解决验证码 - 这是不可解决的,至少 cloudflare 不承认这一点。 如果我在 chrome 驱动程序中手动输入 links(因此在 GUI 中),也会发生这种情况。但是,如果我在正常 chrome 中做同样的事情,一切都正常(我什至没有在第一个 link 上得到等待时间)——即使在私人模式下,所有的 cookie 都被删除。我可以在几台机器上重现这个。 现在我的问题是:根据我的直觉,chrome 驱动程序只是允许被控制的普通 chrome 浏览器。与普通 chrome 有何不同,Cloudflare 如何区分两者,以及如何将我的 chrome 驱动程序屏蔽为普通 chrome? (我不打算在很短的时间内加载很多页面,所以它不应该看起来像一个机器人)。 我希望我的问题很清楚

这个错误信息...

...表示 Cloudflare 已检测到您作为自动机器人向网站发出的请求,随后拒绝您访问该应用程序。


解决方案

在这些情况下,一个潜在的解决方案是使用 undetected-chromedriver 来初始化 Chrome 浏览上下文 .

undetected-chromedriver 是经过优化的 Selenium Chrome 驱动程序补丁,它不会触发像 Distill Network / Imperva / DataDome / Botprotect.io 这样的反机器人服务。它会自动下载驱动程序二进制文件并对其进行修补。

  • 代码块:

    import undetected_chromedriver as uc
    from selenium import webdriver
    import time
    
    options = webdriver.ChromeOptions() 
    options.add_argument("start-maximized")
    driver = uc.Chrome(options=options)
    url1 = 'https://www.fanfiction.net/s/8832472'
    url2 = 'https://www.fanfiction.net/s/5218118'
    driver.get(url1)
    time.sleep(5)
    driver.get(url2)
    

参考资料

您可以在以下位置找到一些相关的详细讨论:

  • Selenium app redirect to Cloudflare page when hosted on Heroku