Можно ли уменьшить потребление оперативной памяти при использовании Selenium GeckoDriver и Firefox - PullRequest
0 голосов
/ 03 января 2019

Я использую веб-драйвер Selenium и Firefox с python для очистки данных с веб-сайта.

Но в коде мне нужно получить доступ к этому веб-сайту более 10 000 раз, и для этого требуется много оперативной памяти.

Обычно, когда скрипт обращается к этому сайту 2500 раз, он уже использует 4 ГБ или более ОЗУ и перестает работать.

Можно ли уменьшить потребление ОЗУ без закрытия сеанса браузера?

Я спрашиваю, потому что, когда я запускаю скрипт, мне нужно вручную войти на сайт (двухфакторная аутентификация, код не показан ниже), и если я закрою сеанс браузера, мне нужно будет войтиснова на сайте.

for itemLista in lista:
    driver.get("https://mytest.site.com/query/option?opt="+str(itemLista))

    isActivated = driver.find_element_by_xpath('//div/table//tr[2]//td[1]')
    activationDate = driver.find_element_by_xpath('//div/table//tr[2]//td[2]')

    print(str(isActivated.text))
    print(str(activationDate.text))

    indice+=1
    print("numero: "+str(indice))

    file2.write(itemLista+" "+str(isActivated.text)+" "+str(activationDate.text)+"\n")

#close file
file2.close()

Ответы [ 3 ]

0 голосов
/ 04 января 2019

Из вашего вопроса не ясно, какие элементы списка в пределах lista проверяют фактический URL / веб-сайт.

Однако, возможно, не удастся сократить потребление ОЗУ при доступе к веб-сайту более 10 000 раз подряд с использованием подхода, который вы применили.

Решение

Как вы упомянули , когда скрипт обращается к этому сайту 2500 раз или около того, он уже потребляет 4 ГБ или более ОЗУ и перестает работать вы можете заставить счетчик обращаться к сайту 2000 раз в цикле и заново инициализировать WebDriver и Веб-браузер заново после вызова метода driver.quit() в tearDown(){}, чтобы закрыть и уничтожить существующие WebDriver и Веб-клиент экземпляров изящно следующим образом:

driver.quit() // Python

Подробное обсуждение можно найти в Веб-драйвер PhantomJS остается в памяти

Включение процессов GeckoDriver и Firefox по-прежнему не уничтожено и не удалено, возможно, вам потребуется убить процессы из списка задач.

  • Python Solution ( Кроссплатформенная ):

    import os
    import psutil
    
    PROCNAME = "geckodriver" # or chromedriver or iedriverserver
    for proc in psutil.process_iter():
        # check whether the process name matches
        if proc.name() == PROCNAME:
            proc.kill()
    

Подробное обсуждение можно найти в Selenium: как остановить процесс geckodriver, влияющий на память ПК, без вызова driver.quit ()?

0 голосов
/ 04 января 2019

Я узнаю, как избежать утечки памяти.

Я просто использую

time.sleep(2)

после

file2.write(itemLista+" "+str(isActivated.text)+" "+str(activationDate.text)+"\n")

Теперь Firefox работает без большого количества оперативной памяти

Это просто идеально.

Я не знаю точно, почему он остановился, потребляет столько памяти, но я думаю, что он растёт, потому что у него не было времени завершить работу каждого драйвера.получить запрос.

0 голосов
/ 03 января 2019

Как упоминалось в моем комментарии, открывайте и записывайте в свой файл только на каждой итерации вместо того, чтобы держать его открытым в памяти:

# remove the line file2 = open(...) from your code

for itemLista in lista:
    driver.get("https://mytest.site.com/query/option?opt="+str(itemLista))

    isActivated = driver.find_element_by_xpath('//div/table//tr[2]//td[1]')
    activationDate = driver.find_element_by_xpath('//div/table//tr[2]//td[2]')

    print(str(isActivated.text))
    print(str(activationDate.text))

    indice+=1
    print("numero: "+str(indice))

    with open("your file path here", "w") as file2:
        file2.write(itemLista+" "+str(isActivated.text)+" "+str(activationDate.text)+"\n")

Хотя selenium довольно голодный зверь, он не 'не обязательно убивать вашу оперативную память с каждой растущей итерацией.Однако ваш растущий открытый буфер file2 действительно занимает ОЗУ, чем больше вы пишете в него.Только когда он закрыт, он освобождает виртуальную память и записывает физическую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...