【问题标题】:how to run multiple nokogiri screen scrape threads at once如何一次运行多个 nokogiri 屏幕抓取线程
【发布时间】:2011-07-19 16:30:34
【问题描述】:

我有一个网站,需要在许多不同的网站上使用 Nokogiri 来提取数据。此过程使用delayed_job gem 作为后台作业运行。然而,每页运行大约需要 3-4 秒,因为它必须暂停并等待其他网站响应。 我目前只是通过基本上说来运行它们

Websites.all.each do |website|
  # screen scrape
end

我想分批执行它们,而不是一个一个,这样我就不必等待每个站点的服务器响应(有时可能需要 20 秒)。

最好的 ruby​​ 或 rails 方法是什么?

提前感谢您的帮助。

【问题讨论】:

  • 这根本不是 Nokogiri 问题。您的延迟是由于 HTTP 请求等待远程主机返回页面而发生的。一旦页面被传递给 Nokogiri,它将几乎立即解析。

标签: ruby-on-rails screen-scraping nokogiri


【解决方案1】:

您可能想查看Typhoeus,它使您能够发出并行 http 请求。

我发现 a short blawg post here 将它与 Nokogiri 一起使用,但我自己没有尝试过。

包装在 DJ 中,这应该可以在客户端延迟很小的情况下解决问题。

【讨论】:

  • 这看起来很有趣,但我认为我想要实现的目标远非复杂。不管怎样,谢谢
  • Typhoeus 使用 Hydra 来处理并行任务,但实际上使用 pair 非常简单。此外,HTTPClient 可以执行并行任务。
  • Typhoeus 非常简单,但这并不能真正解决解析 HTML 是慢一步的问题。实际上我刚刚实现了类似的东西,但 Typhoeus 并没有比将一个块映射到每个 URL 快得多。 IO 显然要快得多,但解析本质上是序列化的。
【解决方案2】:

您需要使用延迟作业。看看这个Railscasts

请记住,大多数主机都会为此类事情收费。

如果您不关心管理线程,也可以使用spawn 插件,但它更容易!

这就是你需要做的所有事情:

  1. rails plugin/install @987654323@
  2. 然后在您的控制器或模型中添加方法

例如:

 spawn do
    #execute your code here :)
 end 

http://railscasts.com/episodes/171-delayed-job

https://github.com/tra/spawn

【讨论】:

  • 在我指定的问题中我已经在使用延迟的工作,(但我需要它花费
  • 哦,很抱歉错过了。还没有咖啡:)
  • 是的,spawn 非常棒,但你知道 ruby​​ 线程的故事。
  • Spawn 似乎工作得很好——快得多。我希望它在 Heroku 上得到支持
【解决方案3】:

我正在使用 EventMachine 为当前项目执行与此类似的操作。有一个很棒的插件叫做 em-http-request,它允许你并行发出多个 HTTP 请求,并提供同步响应的选项。

来自the em-http-request github docs:

EventMachine.run {
  http1 = EventMachine::HttpRequest.new('http://google.com/').get
  http2 = EventMachine::HttpRequest.new('http://yahoo.com/').get

  http1.callback { }
  http2.callback { } 
end

所以在你的情况下,你可以有

callbacks = []
Websites.all.each do |website|
    callbacks << EventMachine::HttpRequest.new(website.url).get
end

callbacks.each do |http|
    http.callback { }
end

使用瘦网络服务器运行您的 Rails 应用程序,以获得有效的 EventMachine 循环:

bundle exec rails server thin

您还需要 eventmachine 和 em-http-request gem。祝你好运!

【讨论】:

  • 感谢您提醒我有关“eventmachine”宝石的信息。我总是忘记重新安装
猜你喜欢
  • 2017-02-25
  • 1970-01-01
  • 1970-01-01
  • 2013-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-19
  • 2018-04-22
相关资源
最近更新 更多