4 回答

TA貢獻1799條經驗 獲得超9個贊
我在使用 Firefox 時也遇到了同樣的問題。我通過切換到 Chrome 解決了這個問題。
示例代碼:
from selenium import webdriver
url = "<WEBSITE>"
options = webdriver.ChromeOptions()
options.add_argument("--disable-blink-features=AutomationControlled")
driver = webdriver.Chrome(options=options)
driver.get(url)
“--disable-blink-features=AutomationControlled”隱藏“navigator.webdriver”標志。
請參閱Selenium webdriver:修改 navigator.webdriver 標志以防止 selenium 檢測
編輯
您還必須更改 chromedriver 的一些默認變量。
使用 perl 的示例:
perl -pi -e 's/cdc_/dog_/g' /path/to/chromedriver
欲了解更多詳細信息,請查看原始帖子。
請參閱當您將 selenium 與 chromedriver 一起使用時,網站可以檢測到嗎?
編輯2
Cloudflare 不斷調整其算法,因此您可以嘗試使用未檢測到的 chromedriver,而不是手動更改 chromedriver。
unDetected-chromedriver是一個優化的 Selenium Chromedriver 補丁,不應觸發反機器人服務。它會自動下載驅動程序二進制文件并對其進行修補。
這是否有效取決于網站和當前的開發狀態。Cloudflare 似乎跟蹤unDetected-chromedriver的開發。
import undetected_chromedriver as uc
url = "<WEBSITE>"
driver= uc.Chrome()
driver.get(url)

TA貢獻1844條經驗 獲得超8個贊
在 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 代碼以確認您不是機器人。擁有模擬網頁顯示有助于做到這一點。

TA貢獻1871條經驗 獲得超13個贊
嘗試使用 Chrome 數據文件夾
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from webdriver_manager.utils import ChromeType
# Configure browser
options = webdriver.ChromeOptions()
options.add_argument(f"--user-data-dir=C:\\Users\\daria\\AppData\\Local\\Google\\Chrome\\User Data")
options.add_argument("--disable-blink-features=AutomationControlled")
chromedriver = ChromeDriverManager(chrome_type=ChromeType.GOOGLE,
log_level='0',
print_first_line=False).install()
driver = webdriver.Chrome(chromedriver,
options=options,
service_log_path=None)
input ("End?")

TA貢獻1909條經驗 獲得超7個贊
這是因為瀏覽器使用來cloudfare
保護自己免受DDOS (Distributed Denial Of Service) Attacks
. 有兩種方法可以解決這個問題:
使用
time.sleep
- 如果網頁加載需要 5 秒,則只需使用time.sleep(5)
。使用
WebDriverWait
-- 例如,button
帶有id
“sample-btn”的 a 僅出現在該屏幕之后。那么你能做的是:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
btn = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, 'sample-btn'))) #Web driver waits for 10 seconds until element is visible
推薦第2個。但如果第二個不適合你,那就選擇第一個。希望這有幫助!
添加回答
舉報