如何绕过 Selenium 中的 Cloudflare 机器人保护

问题描述 投票:0回答:6

我需要从网站上获取一些信息只是为了教育目的,但是由于保护,我无法发送请求。我得到典型的“检查您的浏览器”页面首先显示,然后我被重复重定向。 我如何在 python selenium 中绕过这种保护?

python selenium selenium-chromedriver cloudflare
6个回答
11
投票

这个问题我很久以前就遇到过,后来我解决了。使用下面的代码并享受:)

options = webdriver.ChromeOptions()
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)
options.add_argument("--disable-blink-features=AutomationControlled")
driver = webdriver.Chrome(options=options, executable_path=r"webdriver\chromedriver.exe")

/////////编辑/////////////// 现在这个方法行不通了!


6
投票

使用 unDetected_chromedriver pip 包。这是一个非常简单的假客户端包。

import undetected_chromedriver


def init_webdriver():
    driver = undetected_chromedriver.Chrome()

    driver.get(url)

    content = driver.page_content

    driver.close()
    driver.quit()

您也可以在后台运行它

import undetected_chromedriver
from selenium import webdriver



def init_webdriver():
    options = webdriver.ChromeOptions()
    options.add_argument("--headless")
    driver = undetected_chromedriver.Chrome(options)

    driver.get(url)

    content = driver.page_content

    driver.close()
    driver.quit()

我于 2022 年 6 月 28 日测试了它。效果非常好。


3
投票

回复有点晚了,难怪开发人员仍然反复面临这个问题。我正在使用 Java v17 和 Gradle v7.4.2。 我的解决方案与上面解释的解决方案相关,但代码是用 Java 编写的。

@Before
public void setup() {
    WebDriverManager.chromedriver().setup();
    ChromeOptions options = new ChromeOptions();
    // Bypass Cloudflare checks
    options.setExperimentalOption("useAutomationExtension", false);
    options.addArguments("--disable-blink-features=AutomationControlled");
    driver = new ChromeDriver(options);
    driver.manage().window().maximize();
}

请参阅 Selenium ChromeOptions 文档了解更多详细信息。

快乐编码。


2
投票

截至 2022 年 3 月:

嗨,我在 Docker Linux 镜像上使用 headless Selenium 时遇到了同样的问题。

我通过在调用网络驱动程序之前创建一个虚拟显示器来解决这个问题:

from pyvirtualdisplay import Display
display = Display(visible=0, size=(800, 800))  
display.start()

不要忘记安装 pyvirtualdisplay 和 xvfb:

pip install pyvirtualdisplay
sudo apt-get install xvfb

而且你必须删除ChromeDriver中的“无头”选项,这是我使用的完整代码:

    #Display in order to avoid CloudFare bot detection
    display = Display(visible=0, size=(800, 800))  
    display.start()
  
    options = webdriver.ChromeOptions()
    options.add_argument('--no-sandbox')
    options.add_argument('start-maximized')
    options.add_argument('enable-automation')
    options.add_argument('--disable-infobars')
    options.add_argument('--disable-dev-shm-usage')
    options.add_argument('--disable-browser-side-navigation')
    options.add_argument("--remote-debugging-port=9222")
    # options.add_argument("--headless")
    options.add_argument('--disable-gpu')
    options.add_argument("--log-level=3")
    driver = webdriver.Chrome(ChromeDriverManager().install(), chrome_options=options)

由于它在我的本地计算机上无需无头即可正常工作,因此我认为模拟真实的显示器也可以完成这项工作。 我不太明白为什么,但据我了解,CloudFare 尝试执行 JavaScript 代码以确认您不是机器人。拥有模拟网页显示有助于做到这一点。


0
投票

我并不是提供新的答案,只是分享我最新的经验供其他人参考。我知道这个空间是动态的,但截至 2023 年 11 月 26 日,以下内容似乎对我有用。我正在尝试抓取一个受欢迎的房地产网站,因为我正在寻找可供出租的房产。如果我使用 Edge 驱动程序打开,我会收到常见的 CloudFlare 机器人检测消息和复选框验证码,它会不断循环:

“site.com 需要检查您的连接安全性”

如果我使用 unDetected_chromedriver 打开,它会在不被检测到的情况下运行:

from selenium import webdriver
import undetected_chromedriver as uc

my_options = webdriver.ChromeOptions()
my_options.add_argument( '--log-level=3' )
my_options.add_argument( '--no-sandbox' )
my_options.add_argument( '--disable-dev-shm-usage' )
my_options.add_argument( '--disable-blink-features=AutomationControlled' )
my_options.add_argument( 'user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36' )
my_options.add_argument( '--no-first-run' ) # this might be specific to undetected_chromedriver.v2 only
my_options.add_argument( '--no-service-autorun' ) # this might be specific to undetected_chromedriver.v2 only
my_options.add_argument( '--password-store=basic' ) # this might be specific to undetected_chromedriver.v2 only
#my_options.add_experimental_option( 'useAutomationExtension', False )
#my_options.add_experimental_option( 'excludeSwitches', ( 'enable-automation', ) )
my_options.add_argument( '--start-maximized' )
my_options.add_argument( '--blink-settings=imagesEnabled=false' )
my_options.headless = False
my_options.page_load_strategy = 'normal'

my_driver = uc.Chrome( options = my_options, version_main = 109 )
my_driver.get( 'about:blank' )
my_driver.execute_script( "Object.defineProperty(navigator, 'webdriver', {get: () => undefined})" )
my_driver.get( ..............

注意:这两个注释行不是 type-o,即使它们被注释了它也能工作

版本控制:Windows 7x64、Python 3.8.10、Chrome x64 109.0.5414.120、未检测到的 chromedriver 3.5.4


-2
投票

2021 年 7 月解决方案

只需在 chrome 选项中添加用户代理参数并将用户代理设置为任意值

ops = Options() ua='cat' ops.add_argument('--user-agent=%s' % ua) driver=uc.Chrome(executable_path=r"C:\chromedriver.exe",chrome_options=ops)

© www.soinside.com 2019 - 2024. All rights reserved.