為什么Python Selenium網頁爬蟲在多線程并發執行時偶爾會報錯?

為什么Python Selenium網頁爬蟲在多線程并發執行時偶爾會報錯?

python Selenium網頁爬蟲線程并發執行偶爾報錯原因及解決方法

本文分析了使用Python和Selenium進行網頁爬蟲,并將動態html保存為PDF文件時,多線程并發執行偶爾報錯,而單線程執行卻正常運行的問題。

問題描述

項目需求需要將動態HTML頁面轉換為PDF。我們使用Python和Selenium,通過page.printToPdf命令獲取PDF數據并保存。為了提高效率,采用了多線程并發執行。然而,多線程環境下偶爾出現錯誤,單線程執行則一切正常。

問題代碼及錯誤信息

以下代碼片段用于測試:

from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.chrome.service import Service # ... other imports ...  def test():     service_obj = Service(r"d:workchromedriver-win64chromedriver.exe")     options_obj = Options()     options_obj.binary_location = r"d:workchrome-win64chrome.exe"     options_obj.add_argument('--no-sandbox')     options_obj.add_argument('--disable-gpu')     # options_obj.add_argument("--remote-debugging-port=9225")  # problematic line     options_obj.add_argument("--incognito")     # ... other options ...     driver = webdriver.Chrome(options=options_obj, service=service_obj)     print(driver.session_id)     driver.get("https://www.baidu.com")     driver.quit()  if __name__ == '__main__':     threads = [threading.Thread(target=test) for _ in range(3)]     for t in threads:         t.start()

錯誤信息如下:

立即學習Python免費學習筆記(深入)”;

Exception in thread Thread-2: Traceback (most recent call last):   ... selenium.common.exceptions.WebDriverException: Message: disconnected: unable to receive message from renderer   (Session info: chrome=120.0.6099.71)

原因分析與解決方案

問題根源在于(已注釋掉的)options_obj.add_argument(“–remote-debugging-port=9225”) 這行代碼。它指定了Chrome的遠程調試端口為9225。多線程并發執行時,多個線程試圖同時使用該端口,導致端口沖突,引發WebDriverException。

解決方案:

  1. 移除遠程調試端口參數: 直接刪除 options_obj.add_argument(“–remote-debugging-port=9225”) 這行代碼,避免端口沖突。這是最簡單直接的解決方法

  2. 為每個線程分配不同的端口: 如果需要使用遠程調試功能,可以為每個線程分配不同的端口:

def test(port):     options_obj.add_argument(f"--remote-debugging-port={port}")     # ... rest of the code ...  if __name__ == '__main__':     ports = [9225, 9226, 9227]     threads = [threading.Thread(target=test, args=(port,)) for port in ports]     for t in threads:         t.start()

通過以上方法,可以有效解決多線程并發執行時出現的端口沖突問題,確保Selenium爬蟲的穩定運行。 建議優先采用第一種方法,除非有明確需要使用遠程調試功能。 此外,考慮使用更高級的并發控制機制,例如進程池,以更好地管理資源并提高效率。

以上就是

? 版權聲明
THE END
喜歡就支持一下吧
點贊6 分享