我使用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()
从您的问题中不清楚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进程仍未被销毁和删除,您可能需要从任务列表中删除进程。
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()?找到详细的讨论
我发现如何避免内存泄漏。
我只是用
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,你写的越多。只有当它关闭时,它才会释放虚拟内存并写入物理内存。