Ruby on rails 优化Nokogiri钢轨刮板机

Ruby on rails 优化Nokogiri钢轨刮板机,ruby-on-rails,ruby,nokogiri,Ruby On Rails,Ruby,Nokogiri,我在下面安装了一个Nokogiri刮刀。一切都很好,只是速度很慢。我一直在研究如何使它更快,遇到过使用线程、将它移动到后台进程、保存到db并缓存它的情况,我只是不知道该走什么路,或者从哪里开始。如能提供建议或指导,将不胜感激。你可以在scraper上看到一个实时版本,它可以从同一个域上的不同博客抓取博客图片和帖子,并且当前可以实时抓取 模型 我建议使用 现在,您的scrape方法在开始下一个请求之前完成了一个请求,您可以优化这一点,如果您同时执行pararell请求发送所有请求,而不是一个接一个

我在下面安装了一个Nokogiri刮刀。一切都很好,只是速度很慢。我一直在研究如何使它更快,遇到过使用线程、将它移动到后台进程、保存到db并缓存它的情况,我只是不知道该走什么路,或者从哪里开始。如能提供建议或指导,将不胜感激。你可以在scraper上看到一个实时版本,它可以从同一个域上的不同博客抓取博客图片和帖子,并且当前可以实时抓取

模型
我建议使用

现在,您的scrape方法在开始下一个请求之前完成了一个请求,您可以优化这一点,如果您同时执行pararell请求发送所有请求,而不是一个接一个地发送

使用typheous,您的代码如下所示:

hydra = Typhoeus::Hydra.hydra  
start_urls.each do |start_url|
  # Build a request object representing the actual request you want to send and add it to the queue.
  hydra.queue(Typhoeus::Request.new(start_url))
end
# Then, run all the queued request in pararell.
hydra.run

# Then, you can get all requests response like this
responses = requests.map do |request| 
  request.response.body
  # Any other code here
end
通过这种方法,您可以优化您的性能。假设您有10个请求要处理,每个请求需要10秒钟。实际进近时,总处理时间为100秒。通过并行发送您的所有请求,总处理时间将只有10分钟


你可以找到关于typheous的所有文档。要转到有关pararell请求的部分,请单击。

您希望索引页加载得更快,还是希望刮板运行得更快?您好@StevenTen,我希望索引页加载得更快。因此,在第一个博客被删除后,理想情况下,图像将开始加载,而其余的则会加载,达到一定程度。非常感谢。我要去看看这个,当我开始的时候,我会发回的。我只需要更新我的scrape方法吗?您可以根据我的原始代码进行详细说明,但对如何在中构建它有点困惑。
<div id="container" class="container">
  <% @paths.zip(@images).each do |url, img|%>
  <div class="item tranz ">
    <a href="<%= url %>" target="_blank"><img src="http://www.cltampa.com<%= img %>"></a>
  </div>
  <% end %>
  </div>
</div>
def index
  start_urls = %w[http://cltampa.com/blogs/potlikker 
    http://cltampa.com/blogs/artbreaker 
    http://cltampa.com/blogs/politicalanimals 
    http://cltampa.com/blogs/earbuds 
    http://cltampa.com/blogs/dailyloaf]
  scraper = Photocloud.new(start_urls)
  scraper.scrape
  @images = scraper.images
  @paths = scraper.paths
end
hydra = Typhoeus::Hydra.hydra  
start_urls.each do |start_url|
  # Build a request object representing the actual request you want to send and add it to the queue.
  hydra.queue(Typhoeus::Request.new(start_url))
end
# Then, run all the queued request in pararell.
hydra.run

# Then, you can get all requests response like this
responses = requests.map do |request| 
  request.response.body
  # Any other code here
end