Selenium在调用close/quit后也没有释放内存

12 人关注

所以我一直在做一个搜刮器,它可以在10K以上的网页上搜刮数据。

问题是,随着时间的推移,内存消耗急剧增加。因此,为了克服这个问题--不是在搜刮结束时才关闭驱动程序实例--搜刮器被更新,以便在每个页面被加载和数据被提取后关闭实例。

但由于某种原因,RAM内存仍然被填满。

我试着用PhantomJS,但由于某些原因,它不能正常加载数据。 我还试过用最初版本的搜刮器将Firefox中的缓存限制在100mb,但这也没有用。

注意:我同时用chromedriver和firefox进行测试,不幸的是我不能用request、 mechanize等库来代替selenium。

希望得到任何帮助,因为我已经尝试了一个星期来解决这个问题。谢谢。

python
selenium
firefox
selenium-webdriver
selenium-chromedriver
ScrapyNoob
ScrapyNoob
发布于 2016-07-03
5 个回答
unutbu
unutbu
发布于 2022-06-15
已采纳
0 人赞同

唯一的方法 迫使Python解释器向操作系统释放内存的方法是终止进程。因此,使用 multiprocessing 来生成selenium Firefox实例;当生成的进程被终止时,内存将被释放。

import multiprocessing as mp
import selenium.webdriver as webdriver
def worker()
    driver = webdriver.Firefox()
    # do memory-intensive work
    # closing and quitting is not what ultimately frees the memory, but it
    # is good to close the WebDriver session gracefully anyway.
    driver.close()
    driver.quit()
if __name__ == '__main__':
    p = mp.Process(target=worker)
    # run `worker` in a subprocess
    p.start()
    # make the main process wait for `worker` to end
    p.join()
    # all memory used by the subprocess will be freed to the OS

另见为什么当我删除一个大对象时,Python 不释放内存?

I think this is the solution to this problem!
abrarisme
abrarisme
发布于 2022-06-15
0 人赞同

你是想说是你的驱动程序占满了你的内存?你是如何关闭它们的?如果你正在提取你的数据,你是否仍有对一些在内存中存储它们的集合的引用?

你提到,当你在刮削结束时关闭驱动实例时,你的内存已经用完了,这使你看起来像是在保留额外的引用。

是的,似乎驱动程序正在填充内存。我有5个使用Selenium的功能。我把Selenium和Scrapy一起使用。所以在这些函数中,我只是实例化了新的驱动实例,然后在函数快结束时调用driver.quit()或driver.close()。至于保留额外的引用,我不确定我是否这样做。我使用selenium来加载页面,一旦加载完毕,我就把page_source放到Scrapy选择器中。我在Scrapy中没有任何内存泄漏。
你可以用以下方法逐行检查内存的使用情况(在你的程序中,而不是在网站中)。 memory_profiler .这应该有助于更好地了解哪个部分在消耗你的内存。如果你在那里找不到任何东西,在这里贴出一个函数的例子可能会有帮助。
@ScrapyNoob还检查了顶部,看看你使用的任何浏览器是否有多个实例。
muhammad abdulmoiz
muhammad abdulmoiz
发布于 2022-06-15
0 人赞同

我也遇到过类似的问题,我自己销毁了那个驱动(即把驱动设置为无),防止了这些内存泄漏。

Lucas Azevedo
Lucas Azevedo
发布于 2022-06-15
0 人赞同

我也有同样的问题,直到把 webdriver.get(url) 语句放在try/except/finally语句中,并确保 webdriver.quit() 在finally语句中,这样,它总是执行。就像这样。

webdriver = webdriver.Firefox()
        webdriver.get(url)
        source_body = webdriver.page_source
except Exception as e:
        print(e)
finally:
        webdriver.quit()