Dryscrape/webkit_server内存泄漏

Bai*_*ili 3 html python web-scraping

我正在使用dryscrape/webkit_server来抓取启用javascript的网站.

每次调用session.visit()时,进程webkit_server的内存使用量似乎都会增加.它发生在我身上使用以下脚本:

import dryscrape

for url in urls: 
    session = dryscrape.Session()
    session.set_timeout(10)
    session.set_attribute('auto_load_images', False)
    session.visit(url)
    response = session.body()
Run Code Online (Sandbox Code Playgroud)

我正在迭代约.300 urls和70-80 urls之后webkit_server占用大约3GB的内存.然而,对我来说这不是真正的内存问题,但似乎dryscrape/webkit_server在每次迭代时都变得越来越慢.在上述70-80次迭代之后,dryscrape速度很慢,导致超时错误(设置超时= 10秒),我需要中止python脚本.重新启动webkit_server(例如,每30次迭代后)可能有所帮助并且会清空内存,但是我不确定"内存泄漏"是否真的导致干刮越来越慢.

有谁知道如何重启webkit_server所以我可以测试一下?

我没有为这个问题找到一个可接受的解决方法,但是我也不想切换到另一个解决方案(selenium/phantomjs,ghost.py),因为我简单地喜欢dryscrape.Dryscrape正在努力工作.如果一个人没有在一个会话中迭代过多的网址.

这里也讨论了这个问题

https://github.com/niklasb/dryscrape/issues/41

和这里

Webkit_server(从python的dryscrape调用)在访问每个页面时使用越来越多的内存.如何减少使用的内存?

nic*_*ico 5

你所遇到的内存泄漏也可能与webkit_process从未被实际杀死的事实有关(并且你每次迭代都会产生一个新的dryscrape.Session,它会在后台生成一个永远不会被杀死的webkit_server进程).因此,每次重新启动时,它都会继续生成一个新进程.@Kenneth的答案可能有效但任何需要调用命令行的解决方案都是粗略的.一个更好的解决方案是在开始时声明一次会话并在结束时从python中取消webkit_server进程:

import webkit_server
import dryscrape

server = webkit_server.Server()
server_conn = webkit_server.ServerConnection(server=server)
driver = dryscrape.driver.webkit.Driver(connection=server_conn)
sess = dryscrape.Session(driver=driver)
# set session settings as needed here

for url in urls:
    sess.visit(url)
    response = session.body()
    sess.reset()

server.kill() # the crucial line!
Run Code Online (Sandbox Code Playgroud)

坦率地说,这是dryscrape库中的一个缺点.应该可以从dryscrape会话访问kill命令.

  • 这应该是公认的答案.谢啦 (3认同)