Nokogiri在同一域上刮取多个URL

时间:2015-02-09 00:23:19

标签: ruby-on-rails ruby nokogiri

我正在尝试使用位于同一域的Nokogiri抓取多个网址。例如cltampa.com/potlikker和cltampa.com/artbreaker。对于这两个网址,我正在寻找相同的两个元素,每个博客帖子的主标题图像和标题的网址。我有用于抓取图像的代码,但它效率很低,绝对不是DRY。我也需要抓住相关的标题href,所以我可以在我的视图中用它们包装图像。

我的控制器目前看起来像这样

    def index
      doc = Nokogiri::HTML(open('http://cltampa.com/blogs/potlikker'))
      potlikker = doc.xpath('//*[@class="contentImageCenter"]/img/@src')
      doc = Nokogiri::HTML(open('http://cltampa.com/blogs/artbreaker'))
      artbreaker = doc.xpath('//*[@class="contentImageCenter"]/img/@src')
      @images = potlikker + artbreaker
    end 

我的观点看起来像这样

<div id="container" class="container">
  <% @images.each do |img|%>
  <div class="item">
    <a href="<@url_should_go_here" target="_blank"><img src="http://www.cltampa.com<%= img %>"></a>
  </div>
  <% end %>
</div>

我的第一个问题是什么是解析多个网址的最有效方法,因为我现在拥有的不是它。我会为此创建一个单独的方法,对此的任何帮助都会很棒。

我的下一个问题是如何在抓取图片网址的同时获取标题href。我有xpath分别抓住它们,但把它们放在一起然后在我的视图中渲染它让我感到困惑。

我一直在引用这个答案Iterating through multiple URLs to parse HTML with Nokogori,但还没有运气。

提前致谢。

进展更新

  def index
    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/bedpost http://cltampa.com/blogs/dailyloaf]
    @final_images = []
    @final_urls = []

    urls.each do |url|
      blog = Nokogiri::HTML(open(url)) 
      images = blog.xpath('//*[@class="contentImageCenter"]/img/@src')
      images.each do |image|
        @final_images << image
      end
    end  

    urls.each do |url|
      blog = Nokogiri::HTML(open(url)) 
      story_path = blog.xpath('//*[@class="postTitle"]/a/@href')
      story_path.each do |path|
        @final_urls << path
      end
    end 
  end

上面的代码在技术上给了我我需要的东西,只是不确定如何在视图中将它们绑在一起。我需要在final_images周围包装final_urls。我相信有更好的方法可以做到这一点,再次感谢任何信息。

我还应该补充一点,我在Heroku上遇到了超时问题,因此任何关于加快速度,转移到后台任务等方面的建议都会非常感激。我现在正在调查,但不确定最佳路线。

0 个答案:

没有答案