使用Mechanize从网址获取revant内容

时间:2014-03-06 18:49:31

标签: ruby-on-rails ruby web-scraping screen-scraping mechanize

我有这个班级

class Scrapper
    require 'rubygems'
    require 'mechanize'

    def initialize(url)
        @url = url
        agent = Mechanize.new
        @page = agent.get(url)
    end

    def perform(type)
        if type == 'title'
            get_title
        else
            get_content
        end
    end

    def get_title
        @page.title
    end

    def get_content
        @page
    end
end

现在我可以获得该页面的标题,但我如何获得相关内容?
例如。 http://thenextweb.com/facebook/2014/03/06/facebook-launches-improved-version-major-news-feed-redesign-teased-last-year/#!yJE5N

  • 我想获得封面/任何相关图片(如果有的话)。
  • 页面内容。
    感谢。

1 个答案:

答案 0 :(得分:2)

这会将该图片作为Nokogiri::XML::Element

返回
def get_article_image_tag
  @page.at(".article-featured-image > img")
end
#=> #<Nokogiri::XML::Element:0x19ac280 name="img" attributes= #<Nokogiri::XML::Attr:0x19ac238 name="width" value="786">, #<Nokogiri::XML::Attr:0x19ac22c name="height" value="305">, #<Nokogiri::XML::Attr:0x19ac 220 name="src" value="http://cdn0.tnwcdn.com/wp-content/blogs.dir/1/files/2014/03 187265573-786x305.jpg">, #<Nokogiri::XML::Attr:0x19ac214 name="class" value="attachment-featured_post wp-post-image">, #<Nokogiri::XML::Attr:0x19ac208 name="alt" value="SWEDEN-FACEBOOK-DATA-CENTER-SERVERS">, #<Nokogiri::XML::Attr:0x19ac1fc name="title" value="Facebook launches an improved version of the News Feed redesign teased last year">]>

这将返回源URL

def get_article_image_src
  @page.at(".article-featured-image > img").attributes["src"].value
end
#=>"http://cdn0.tnwcdn.com/wp-content/blogs.dir/1/files/2014/03/187265573-786x305.jpg"

获取文章文本

def get_article_text
  @page.at("div.article").text
end

这将返回文章文本,没有任何格式化文本和不可见的字符,如\n\t等。此方法似乎也在选择器内抓取HTML / Javascript代码。

另外,对于动态功能,您可以在此处更改通话

def perform(type)
   self.send("get_#{type.to_s}")
end

然后可以使用“content”,“title”,“article_image_tag”,“article_image_src”以及您定义的任何其他get_xxx方法调用它。

修改,向您的用户展示这将在rails视图中使用的所有图像

<% @page.images.each do |image| %>
  <%= image_tag(image.url) %>
<% end %>

这将迭代所有图像并将其显示在页面中的图像标记中。显然,这可能需要修补,具体取决于网址是相对的还是满的。

老实说,除非您需要mechanize设置Cookie或其他内容,否则我会查看Nokogiri。不是100%肯定如何使用机械化来实现这一点,但使用Nokogiri你可以通过它的总体大小确定图片的“相关性”。

require 'nokogiri'
require 'open-uri'

doc = Nokogiri::HTML(open("http://thenextweb.com/facebook/2014/03/06/facebook-launches-improved-version-major-news-feed-redesign-teased-last-year/#!yJ6uM"))
largest_image = doc.search("img").sort_by{|image| image.attributes["height"].value.to_i * image.attributes["width"].value.to_i}.pop