亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

通過 Python 使用 Selenium 進行多處理時,Chrome 在幾個小時后崩潰

通過 Python 使用 Selenium 進行多處理時,Chrome 在幾個小時后崩潰

九州編程 2022-07-26 10:29:59
這是幾個小時抓取后的錯誤回溯:The process started from chrome location /usr/bin/google-chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed.這是我的 selenium python 設置:#scrape.pyfrom selenium.common.exceptions import *from selenium.webdriver.common.by import Byfrom selenium.webdriver.support import expected_conditions as ECfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.chrome.options import Optionsdef run_scrape(link):    chrome_options = Options()    chrome_options.add_argument('--no-sandbox')    chrome_options.add_argument("--headless")    chrome_options.add_argument('--disable-dev-shm-usage')    chrome_options.add_argument("--lang=en")    chrome_options.add_argument("--start-maximized")    chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])    chrome_options.add_experimental_option('useAutomationExtension', False)    chrome_options.add_argument("user-agent=Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36")    chrome_options.binary_location = "/usr/bin/google-chrome"    browser = webdriver.Chrome(executable_path=r'/usr/local/bin/chromedriver', options=chrome_options)    browser.get(<link passed here>)    try:        #scrape process    except:        #other stuffs    browser.quit()#multiprocess.pyimport time,from multiprocessing import Poolfrom scrape import *if __name__ == '__main__':    start_time = time.time()    #links = list of links to be scraped    pool = Pool(20)    results = pool.map(run_scrape, links)    pool.close()    print("Total Time Processed: "+"--- %s seconds ---" % (time.time() - start_time))Chrome、ChromeDriver 設置、Selenium 版本ChromeDriver 79.0.3945.36 (3582db32b33893869b8c1339e8f4d9ed1816f143-refs/branch-heads/3945@{#614})Google Chrome 79.0.3945.79Selenium Version: 4.0.0a3我想知道為什么 chrome 正在關閉但其他進程正在工作?
查看完整描述

2 回答

?
慕萊塢森

TA貢獻1810條經驗 獲得超4個贊

我拿了你的代碼,稍微修改了一下以適應我的測試環境,這里是執行結果:


代碼塊:


multiprocess.py:


import time

from multiprocessing import Pool

from multiprocessingPool.scrape import run_scrape


if __name__ == '__main__':

    start_time = time.time()

    links = ["https://selenium.dev/downloads/", "https://selenium.dev/documentation/en/"] 

    pool = Pool(2)

    results = pool.map(run_scrape, links)

    pool.close()

    print("Total Time Processed: "+"--- %s seconds ---" % (time.time() - start_time)) 

scrape.py:


from selenium import webdriver

from selenium.common.exceptions import NoSuchElementException, TimeoutException

from selenium.webdriver.common.by import By

from selenium.webdriver.chrome.options import Options


def run_scrape(link):

    chrome_options = Options()

    chrome_options.add_argument('--no-sandbox')

    chrome_options.add_argument("--headless")

    chrome_options.add_argument('--disable-dev-shm-usage')

    chrome_options.add_argument("--lang=en")

    chrome_options.add_argument("--start-maximized")

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

    chrome_options.add_experimental_option('useAutomationExtension', False)

    chrome_options.add_argument("user-agent=Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36")

    chrome_options.binary_location=r'C:\Program Files (x86)\Google\Chrome\Application\chrome.exe'

    browser = webdriver.Chrome(executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe', options=chrome_options)

    browser.get(link)

    try:

        print(browser.title)

    except (NoSuchElementException, TimeoutException):

        print("Error")

    browser.quit()

控制臺輸出:


Downloads

The Selenium Browser Automation Project :: Documentation for Selenium

Total Time Processed: --- 10.248600006103516 seconds ---

結論

很明顯,您的程序在邏輯上是完美無缺的。


這個用例

正如您在幾個小時的抓取后提到的這個錯誤表面,我懷疑這是因為WebDriver 不是線程安全的。話雖如此,如果您可以序列化對底層驅動程序實例的訪問,則可以在多個線程中共享一個引用。這是不可取的。但是您總是可以為每個線程實例化一個WebDriver實例。


理想情況下,線程安全問題不在您的代碼中,而在實際的瀏覽器綁定中。他們都假設一次只會有一個命令(例如,像一個真實的用戶)。但另一方面,您始終可以為每個線程實例化一個WebDriver實例,該實例將啟動多個瀏覽選項卡/窗口。到目前為止,您的程序似乎很完美。


現在,不同的線程可以在同一個Webdriver上運行,但是測試的結果不會是你所期望的。背后的原因是,當您使用多線程在不同的選項卡/窗口上運行不同的測試時,需要一點線程安全編碼,否則您將執行的操作就像click()或send_keys()將轉到當前打開的選項卡/窗口一樣無論您希望運行的線程如何,都將成為焦點。這實質上意味著所有測試將在具有焦點但不在預期的選項卡/窗口上的同一選項卡/窗口上同時運行。


查看完整回答
反對 回復 2022-07-26
?
HUX布斯

TA貢獻1876條經驗 獲得超6個贊

現在我使用這個線程模塊為每個線程實例化一個 Webdriver


import threading

threadLocal = threading.local()


def get_driver():

    browser = getattr(threadLocal, 'browser', None)

    if browser is None:

        chrome_options = Options()

        chrome_options.add_argument('--no-sandbox')

        chrome_options.add_argument("--headless")

        chrome_options.add_argument('--disable-dev-shm-usage')

        chrome_options.add_argument("--lang=en")

        chrome_options.add_argument("--start-maximized")

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

        chrome_options.add_experimental_option('useAutomationExtension', False)

        chrome_options.add_argument("user-agent=Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36")

        chrome_options.binary_location = "/usr/bin/google-chrome"

        browser = webdriver.Chrome(executable_path=r'/usr/local/bin/chromedriver', options=chrome_options)

        setattr(threadLocal, 'browser', browser)

    return browser

它確實幫助我比一次執行一個驅動程序更快。


查看完整回答
反對 回復 2022-07-26
  • 2 回答
  • 0 關注
  • 75 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號