我将Selenium和Firefox Webdriver与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()
答案 0 :(得分:1)
从您对有关 lista 中的列表项的问题尚不清楚,以检查实际的url /网站。
但是,使用您采用的方法连续访问网站超过1万次时,可能无法减少 RAM消耗。
正如您提到的,当脚本访问该站点2500次左右时,它已经消耗了4gb或更多的RAM并且停止工作,您可能会诱使计数器在一个站点中访问该站点2000次。在driver.quit()
方法中调用tearDown(){}
以关闭并销毁现有的 WebDriver WebDriver 和 Web浏览器 >和 Web客户端实例,如下所示:
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 :(得分:1)
我发现了如何避免内存泄漏。
我只是用
time.sleep(2)
之后
file2.write(itemLista+" "+str(isActivated.text)+" "+str(activationDate.text)+"\n")
现在firefox可以在不消耗大量RAM的情况下运行了
那太完美了。
我不知道为什么停止它会消耗如此多的内存,但是我认为它正在增加内存消耗,因为它没有时间来完成每个driver.get请求。
答案 2 :(得分:0)
正如我的评论中所述,仅在每次迭代时打开并写入文件,而不是在内存中保持打开状态。
for i in range(len(dict_primarydata)):
dict_primarydata[i]['otherData'] = dict_otherdata[i]
尽管# 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")
确实是一个内存消耗大的野兽,但它不一定会随着每次迭代的增长而破坏RAM。但是,selenium
不断增长的打开缓冲区确实会占用RAM,而您写入的内容就越多。只有关闭它,它才会释放虚拟内存并写入物理内存。