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



我使用Selenium和Firefox网络驱动程序以及python从网站上抓取数据。

但在代码中,我需要访问这个网站超过1万次,这需要消耗大量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()

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

我只是用

time.sleep(2)

之后

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

现在firefox在没有消耗大量RAM 的情况下工作

这简直太完美了。

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

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

# 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。只有当它关闭时,它才会释放虚拟内存并写入物理内存。

从您关于lista列表项的问题中不清楚是否要检查实际的url/网站。

但是,如果使用您所采用的方法连续访问网站超过1万次,则可能无法减少RAM消耗

解决方案

正如您所提到的,当脚本访问该站点2500次左右时,它已经消耗了4gb或更多的RAM,并且停止工作您可以诱导计数器在循环中访问该站点2000次,并在调用tearDown(){}方法中的driver.quit()以关闭&按如下方式优雅地销毁现有的WebDriverWeb客户端实例:

driver.quit() // Python

您可以在PhantomJS web驱动程序内存中找到详细的讨论

如果GeckoDriverFirefox进程仍未被销毁和删除,您可能需要从任务列表中删除这些进程。

  • 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中找到详细的讨论:如何在不调用driver.quit()的情况下阻止geckodriver进程影响PC内存?

最新更新