Невозможно завершить процесс Chrome и не хватает памяти с помощью ChromeDriver и Chrome через Selenium в Python - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть процесс сканирования, который запускает селен в пользовательском классе, который выглядит следующим образом:

class BrowserInterface:

def __init__(self, base_url, proxy_settings):

    self.base_url = base_url

    self.display = Display(visible=0, size=(1024, 768))
    self.display.start()

    proxy_argument = '--proxy-server={0}'.format(PROXY_URL.format(
        proxy_settings.get('proxy_host'),
        proxy_settings.get('proxy_port')
    ))

    logger.debug(proxy_argument)

    options = webdriver.ChromeOptions()
    options.add_argument('--no-sandbox')
    options.add_argument(proxy_argument)

    selenium_chrome_driver_path = os.path.join(settings.DEFAULT_DRIVER_PATH,
                                               settings.CHROME_DRIVERS[settings.CURRENT_OS])

    self.driver = webdriver.Chrome(executable_path=selenium_chrome_driver_path, chrome_options=options)

def visit(self, url):
    url = urljoin(self.base_url, url)
    self.driver.get(url)

def body(self):
    soup = BeautifulSoup(self.driver.page_source)
    return soup.find("body").text

def quit(self):
    self.driver.quit()
    self.display.stop()

Этот класс BrowserInterface инициализируется в очереди пакета, и в конце вызывается метод quit ().партии.Нет проблем с запуском chrome и получением данных.Проблема в том, что в конце каждого задания, когда вызывается метод quit (), chrome переходит в режим зомби.Когда следующий BrowserInterface инициализируется, он запускает новый экземпляр Chrome.Из-за этого на коробке заканчивается память.Я также попытался запустить команду kill для процесса chrome, но он продолжает работать.Любое направление будет с благодарностью, так как я собираюсь вырваться из-за этого.

Работа в Ubuntu 18.04, Google Chrome 70.0.3538.110, ChromeDriver 2.44, Python3.6.6

Спасибо зазаранее!

1 Ответ

0 голосов
/ 04 декабря 2018

Из ваших испытаний кода очевидно, что вы вызвали self.driver.quit(), который должен был работать безупречно.

Однако из-за зомби процессов хрома , так как окно все еще работает из памяти , вы выбрали правильный подход для выполнения kill , и вы можете добавить следующее решение в методе quit():

from selenium import webdriver
import psutil

driver = webdriver.Chrome()
driver.get('http://google.com/')

PROCNAME = "chrome" # to clean up zombie Chrome browser
#PROCNAME = "chromedriver" # to clean up zombie ChromeDriver
for proc in psutil.process_iter():
    # check whether the process name matches
    if proc.name() == PROCNAME:
        proc.kill()
...