通过Python使用Selenium进行多处理时,Chrome在几个小时后崩溃

通过Python使用Selenium进行多处理时,Chrome在几个小时后崩溃,python,selenium,google-chrome,multiprocessing,selenium-chromedriver,Python,Selenium,Google Chrome,Multiprocessing,Selenium Chromedriver,这是经过几个小时的刮取后的错误回溯: 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.py from selenium.common.exceptions import * from selenium.we

这是经过几个小时的刮取后的错误回溯:

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.py
from selenium.common.exceptions import *
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
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 = "/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()
Chrome,ChromeDriver设置,Selenium版本

ChromeDriver 79.0.3945.36 (3582db32b33893869b8c1339e8f4d9ed1816f143-refs/branch-heads/3945@{#614})
Google Chrome 79.0.3945.79
Selenium Version: 4.0.0a3

我想知道为什么chrome正在关闭,但其他进程正在工作?

我接受了您的代码,对其进行了一些修改,以适应我的测试环境,下面是执行结果:

  • 代码块:

    • multiprocess.py:

    • scrape.py:

  • 控制台输出:

    Downloads
    The Selenium Browser Automation Project :: Documentation for Selenium
    Total Time Processed: --- 10.248600006103516 seconds ---
    

结论 很明显,你的程序在逻辑上是完美的


这个用例 正如您所提到的,经过几个小时的刮削后,这个错误出现了,我怀疑这是由于以下事实。话虽如此,如果可以序列化对底层驱动程序实例的访问,则可以在多个线程中共享引用。这是不可取的。但是,您始终可以为每个线程实例化一个实例

理想情况下,线程安全的问题不在代码中,而在实际的浏览器绑定中。他们都假设一次只有一个命令(例如,像真正的用户一样)。但另一方面,您可以为每个线程实例化一个WebDriver实例,它将启动多个浏览选项卡/窗口。到目前为止,您的程序似乎是完美的


现在,不同的线程可以在同一个Webdriver上运行,但是测试结果并不是您所期望的。背后的原因是,当您使用多线程在不同的选项卡/窗口上运行不同的测试时,需要一点线程安全编码,否则您将执行诸如
单击()
发送密钥()之类的操作
将转到打开的选项卡/窗口,该选项卡/窗口当前具有焦点,无论您希望运行哪个线程。这基本上意味着所有测试都将在同一个选项卡/窗口上同时运行,该选项卡/窗口的焦点是而不是在预期的选项卡/窗口上。

现在,我正在使用这个线程模块为每个线程实例化一个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

它真的比一次执行一个驱动程序更快。如何检查chrome和chromedriver的二进制版本?我需要在headless模式下运行,因为它将在linux服务器上运行。我已经设置了您的代码,并且在本地运行良好。你在docker中遇到问题了吗?我没有使用docker,只是selenium python、chrome和ChromeDriver可能已经尝试过了,正如你所看到的,我正在传递——在add_参数中没有沙盒,我只是不知道为什么chrome会崩溃如果我只共享一个webdriver实例,这会影响我的抓取处理吗?每个窗口都有不同的工作人员吗?@BenjiePerez底线是webdriver不是线程安全的。现在,一切都取决于您将采取哪些措施以及如何实施这些措施来序列化对底层webdriver实例的访问。我明白了,感谢您提供有关webdriver行为的信息。@BenjiePerez很高兴能够帮助您!!!关于StackOverflow,我们用最好的答案表示感谢,并对有助于解决您问题的答案进行投票。我的问题是如何在pool.close()之后退出此实例化webdriver?因为在我的工作人员使用之后,它仍然在我的服务器中休眠。
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 ---
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