Featured image of post 當 Selenium 遇到 Cloudflare

當 Selenium 遇到 Cloudflare

記錄使用 selenium 遇到反自動化和預先完成需手動的動作的解決方法。

Chrome is being controlled by automated test software.

簡介

現時越來越多的網站都有反自動化的機制,直接使用 selenium 十分容易觸發反自動化機制。

除此之外,在使用 selenium 開啟瀏覽器,預設開啟的是一個全新的瀏覽器,而且沒有儲存任何 cookies 等信息,終究會有些動作可能需要手動處理(e.g 電話驗證碼輸入),為此整合了一些避過檢測和完成手動動作的方法。

這次遇到的問題是 Cloudflare 的 Turnstile。

直接使用 selenium 打開網站(),即使手動點擊了驗證,仍會一直循環要求驗證。

不使用 selenium 時,從 DevTools 中可以看到成功進入網站後會有特定的 cookie cf_clearance 1,嘗試預先添加該 cookie 2

但並沒有效果

加上 headers

嘗試同時加上 User-Agent 等 headers,一樣沒有效果

1
chrome_options.add_argument("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0")

更改 webdriver 屬性

移除 Chrome is being controlled by automated test software. 的標示:

1
options.add_experimental_option("excludeSwitches", ["enable-automation"])

有部份網站會透過檢查 webdriver 的屬性來識別是否有異常,所以同時透過以下方法移除:

1
chrome_options.add_argument("disable-blink-features=AutomationControlled")

1
2
3
4
5
6
7
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
    "source": """
        Object.defineProperty(navigator, 'webdriver', {
            get: () => undefined
        })
    """
})

無效。

使用 undetected-chromedriver 代替 chromedrive

較常被提及的 undetected-chromedriver 是經過修過的 Chrome driver,可以隱藏 chrome driver 的使用痕跡,從而避免被檢測。

但是,無效。

但當然,有可能是 Cloudflare Turnstile 有所更新而 undetected-chromedriver 未有更新所致,不深入考究。

預先執行需手動的動作

在使用 selenium 開啟瀏覽器,預設開啟的是一個全新的瀏覽器,而且沒有儲存任何 cookies 等信息。

這時可以在 terminal 或 cmd 中透過手動的方式開啟瀏覽器:

MacOS:

1
2
open -a "Google Chrome" --args --remote-debugging-port=9222 --user-data-dir="$HOME/Desktop/Chrome\ Profile"

Windows:

1
"C:\Program Files\Google\Chrome\Application\chrome.exe" --remote-debugging-port=9222 --user-data-dir="%UserProfile%\Desktop\Chrome"

其中 user-data-dir 是 chrome 儲存 profile data 的位置,例如 history、bookmarks 和 cookies 等。

例如手動登入帳號的資料就會儲存在該目錄中。這邊則是透過手動完成 Cloudflare Turnstile 驗證取得 cookie,然後便可以使用 selenium 透過該瀏覽器進入網站:

1
2
3
4
5
6
7
8
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")

driver = webdriver.Chrome(options=options)
driver.get("https://platesmania.com/us/informer")

實例

GitHub - kinwang94/plate-crawler


部份參考和研究資料:

https://blog.csdn.net/sinat_29957455/article/details/122242196

https://blog.csdn.net/yuanziwoxin/article/details/122513693

https://blog.csdn.net/Scott0902/article/details/127024380

https://www.cnblogs.com/lovealways/p/9813059.html

https://zhuanlan.zhihu.com/p/328768200

https://bot.sannysoft.com/


  1. Cloudflare Cookies ↩︎

  2. Working with cookies ↩︎

Built with Hugo | Theme Stack designed by Jimmy