Возможно ли уменьшить потребление оперативной памяти при использовании Selenium GeckoDriver и Firefox

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

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

Обычно, когда скрипт обращается к этому сайту 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 ответа

Решение

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

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

time.sleep(2)

после

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

Теперь Firefox работает без много оперативной памяти

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

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

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

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

Решение

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

driver.quit() // Python

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

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

  • Решение Python (кроссплатформенное):

    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()?

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

# 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 действительно занимает оперативную память, чем больше вы пишете в нее. Только когда он закрыт, он освободит виртуальную память и запишет физическую.

Другие вопросы по тегам