首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何同时运行多个nokogiri屏幕抓取线程

如何同时运行多个nokogiri屏幕抓取线程
EN

Stack Overflow用户
提问于 2011-03-21 21:22:37
回答 3查看 1.8K关注 0票数 5

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

代码语言:javascript
复制
Websites.all.each do |website|
  # screen scrape
end

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

最好的ruby或rails方式是什么?

提前感谢您的帮助。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-03-21 21:28:51

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

请记住,大多数主机都会对这种类型的东西收费。

如果你不关心管理线程,你也可以使用spawn插件,但它要简单得多!

这就是你所需要做的:

  1. rails plugin/install https://github.com/tra/spawn.git
  2. Then在您的控制器或模型中添加方法

例如:

代码语言:javascript
复制
 spawn do
    #execute your code here :)
 end 

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

https://github.com/tra/spawn

票数 2
EN

Stack Overflow用户

发布于 2011-03-21 21:34:04

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

我找到了a short blawg post here关于在诺基里使用它,但我自己还没有尝试过。

封装在DJ中,这应该可以在客户端延迟很小的情况下完成任务。

票数 5
EN

Stack Overflow用户

发布于 2011-12-19 18:44:40

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

来自the em-http-request github docs:

代码语言:javascript
复制
EventMachine.run {
  http1 = EventMachine::HttpRequest.new('http://google.com/').get
  http2 = EventMachine::HttpRequest.new('http://yahoo.com/').get

  http1.callback { }
  http2.callback { } 
end

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

代码语言:javascript
复制
callbacks = []
Websites.all.each do |website|
    callbacks << EventMachine::HttpRequest.new(website.url).get
end

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

使用瘦get服务器运行您的rails应用程序,以获得正常运行的EventMachine循环:

代码语言:javascript
复制
bundle exec rails server thin

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5378162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档