Capybara Poltergeist IOError: closed stream

Capybara Poltergeist IOError: closed stream

我正在使用 Capybara 进行网页抓取。我注意到一个问题,之后 Poltergeist 在占用系统资源的内存中徘徊。 Poltergeist Github 页面指出 Capybara (https://github.com/teampoltergeist/poltergeist) 存在内存泄漏问题,他们建议调用

session.driver.quit

这解决了我的内存问题,但是当我想稍后再次使用水豚时,我收到错误消息:

IOError: closed stream

我相信只需刷新 Capybara 会话即可解决此问题,但找不到 public 方法让我重新启动一个全新的会话。

1) 有什么方法可以解决我的问题吗?

2) 重置会话是重新打开流的最佳方式吗?

我认为您的客户端内存因内存泄漏而超载,因此重新启动浏览器可以解决问题。您可以通过session.driver.browser.client查看客户信息。您可以按 session.driver.browser.restart 重新启动浏览器,然后它会打开一个没有 url 的浏览器。如果您检查 session.driver.browser.client,您可以看到客户端信息已重置。

效果最好的解决方案是像这样启动一个新的水豚会话:

session = Capybara::Session.new(:poltergeist, Rails.application)
session.visit(...)
session.driver.quit

对于我的程序,我将它封装在一个 WebScraper 模块中,如下所示:

module WebScraper
  attr_accessor :session

  delegate :visit, :save_screenshot, to: :session

  def start_session
    @session ||= Capybara::Session.new(:poltergeist, Rails.application)
  end

  def end_session
    @session.driver.quit
    @session = nil
  end
end