使用Selenium GeckoDriver和Firefox时是否可以减少内存RAM消耗

问题描述 投票:0回答:3

我使用Selenium和Firefox webdriver与python从网站上抓取数据。

但是在代码中,我需要访问这个网站超过10k次,并且它需要消耗大量的RAM才能做到这一点。

通常,当脚本访问此站点2500次时,它已经消耗了4GB或更多的RAM并停止工作。

是否可以在不关闭浏览器会话的情况下减少内存RAM消耗?

我问这是因为当我启动脚本时,我需要在站点上手动记录(双因素身份验证,代码未在下面显示),如果我关闭浏览器会话,我将需要再次登录该站点。

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()
python selenium selenium-webdriver memory-management webdriver
3个回答
1
投票

从您的问题中不清楚lista中的列表项目来检查实际的URL /网站。

但是,使用您已采用的方法连接访问网站的次数超过10k时,可能无法减少RAM消耗。

正如你提到的那样,当脚本访问这个站点2500次左右时,它已经消耗了4GB或更多的RAM并且它停止工作你可能会导致一个计数器在循环中访问该站点2000次并重新初始化WebDriver和Web浏览器之后在driver.quit()方法中调用tearDown(){}来优雅地关闭和销毁现有的WebDriver和Web Client实例,如下所示:

driver.quit() // Python

你可以在PhantomJS web driver stays in memory找到详细的讨论

如果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 : How to stop geckodriver process impacting PC memory, without calling driver.quit()?找到详细的讨论


1
投票

我发现如何避免内存泄漏。

我只是用

time.sleep(2)

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

现在firefox正在工作而不会消耗大量的RAM

这是完美的。

我不知道为什么它停止消耗这么多内存,但我认为它增加了内存消耗,因为它没有时间来完成每个driver.get请求。


0
投票

正如我的评论中所提到的,只在每次迭代时打开并写入文件,而不是在内存中保持打开状态:

# 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是一个非常渴望记忆的野兽,但它并不一定会在每次增长的迭代中谋杀你的RAM。然而,你越来越多的file2打开的缓冲区确实占用了RAM,你写的越多。只有当它关闭时,它才会释放虚拟内存并写入物理内存。

© www.soinside.com 2019 - 2024. All rights reserved.