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

时间:2019-01-03 19:08:00

标签: python selenium selenium-webdriver memory-management webdriver

我将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()

3 个答案:

答案 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,而您写入的内容就越多。只有关闭它,它才会释放虚拟内存并写入物理内存。