selenium 跟 undetected chromedriver 幾乎是一樣的東西,使用方法也一樣,主要差別的是否容易被檢測的出來是程式(機器人)在操作瀏覽器。
Q: 什麼時候用 nodriver 更好?
A: 建議,直接用 nodriver 即可。
selenium
官網:
https://www.selenium.dev/documentation/webdriver
github:
https://github.com/SeleniumHQ/selenium
官方簡介:
A browser automation framework and ecosystem.
undetected chromedriver
官網:
https://github.com/ultrafunkamsterdam/undetected-chromedriver/
官方簡介:
Custom Selenium Chromedriver | Zero-Config | Passes ALL bot mitigation systems (like Distil / Imperva/ Datadadome / CloudFlare IUAM)
在使用 selenium 去控制 chrome extension 的時候, selenium 是只接受 zip 的檔案格式,而 undetected chromedriver 去載入 chrome extension 只能接受非壓縮的格式。
非壓縮檔的好處,是方便 python 程式與 chrome extension 的 javascript 溝通,zip 也是可以,需要多一個打包 zip 的動作,才能把檔案動態放進 zip 檔。
nodriver
官網:
https://github.com/ultrafunkamsterdam/nodriver
官方簡介:
Successor of Undetected-Chromedriver. Providing a blazing fast framework for web automation, webscraping, bots and any other creative ideas which are normally hindered by annoying anti bot systems like Captcha / CloudFlare / Imperva / hCaptcha
nodriver 和 selenium 是類似的工具,但寫法完全不相容,nodriver 是目前少數可以不被 CloudFlare 檢查出來的網頁自動化工具。
nodriver 不需要使用 chrome webdriver, 即可控制 chrome 瀏覽器。但限制只能控制 chrome 瀏覽器。selenium 優點是可以用到 edge / brave / chrome, 也有支援 firefox 和 safari 瀏覽器。
完整性來說,nodriver 很多地方沒有 selenium 完整,但大多情況下算是夠用。
穩定性來說,目前可能還在初期的 beta 階段,穩定性較 selenium 差,可能在特定的操作下,會讓瀏覽器掛掉,或使用超級多的記憶體之類的,大致上,算好用,穩定性可以接受。
nodriver 可以比 selenium 還控制到更多chrome 的細部參數,因為nodriver可以存取到更多 chrome 低層的資訊。
目前 (2024-10-10) nodriver v0.37 還有一些神奇的缺點, 例如:同一個視窗下,開啟二個分頁,先把分頁1 存放在變數A,人工手動關閉分頁1之後,在程式碼存取變數A 就會讓程式掛掉。
DrissionPage
官網:
https://github.com/g1879/DrissionPage/
官方簡介:
基於python的網頁自動化工具。既能控制瀏覽器,也能收發數據包。可兼顧瀏覽器自動化的便利性和requests的高效率。功能強大,內置無數人性化設計和便捷功能。語法簡潔而優雅,代碼量少。
DrissionPage 類似 nodriver, 但操作的語法也和 nodriver 不相容,寫法和 selenium 也完全不相容,DrissionPage 也是目前少數可以不被 CloudFlare 檢查出來的網頁自動化工具。
Javascript / jQuery
使用 jQuery / javascript 來自動化網頁操作,大多會寫成 chrome extension.
Chrome 官方學習資源:
https://developer.chrome.com/extensions
Case Study
以對某一個按鈕自動點擊來說:
jQuery:
$('selector').click()
或
$('selector').trigger("click");
selenium / undetected chromedriver:
element = driver.find_element(By.CSS_SELECTOR, your_selector)
element.click()
nodriver:
element = await tab.query_selector(your_selector)
await element.click()
更詳細說明:
要怎麼讓 chrome extension 裡的 javascript/jquery 的 click 可以比照真人去點擊?
https://stackoverflow.max-everyday.com/2024/10/chrome-extension-javascript-click-with-event-which/