Ruby Madness使用Nokogiri,Mechanize和OpenUri下载相同的文件以获取不同的信息

时间:2014-07-03 18:31:08

标签: ruby web-scraping nokogiri mechanize open-uri

确定,

我正在编写无处不在的爬虫,并遇到了一些问题。 〜在Ruby上作为一个完全的菜鸟并不奇怪。

我使用Nokogiri获取页面的html - 找到我感兴趣的所有链接,然后下载与这些链接相关的文件。一切都很好。

但是,我似乎无法通过单一方法获取所需信息。

如果我使用file = open(Src).read,则文件包含文件的内容 - 这对于保存到数据库和散列目的非常有用。但它并没有让我轻松访问(据我所知)文件名,大小,文件类型等属性。

要获取该信息,我正在使用Mechanize:

agent = Mechanize.new
fop = agent.get(Src)

使用head agent.head方法我可以获得内容类型,上次修改日期和内容长度。 fop.filename当然给了我文件名。现在使用agent.head(Src)["content-type"]方法,我认为为内容类型,最后修改和内容长度调用重新下载信息 - 它正在下载头3次。总的浪费我说文件已经包含了完整的文件,fop应该提供我需要的所有其他信息,而不需要打电话。

这样做有更好的方法(来自拇指指甲下载器)

thumbs.each do |thumb|
  imgSrc = thumb.css('.t_img').first['src']
  file = open(imgSrc).read 
  agent = Mechanize.new
  fop = agent.get(imgSrc)
  p fop
  puts "1 Driver        : prowl.rb" 
  puts "1 Source        : " + pageURL
  puts "1 Title         : " + thumb.css('.t_img').first['alt']
  puts "1 File Source   : " + imgSrc
  puts "1 File Type     : " + agent.head(imgSrc)["content-type"].to_s
  puts "1 File Name     : " + fop.filename
  puts "1 Last Modified : " + agent.head(imgSrc)["last-modified"].to_s
  puts "1 Image Size    : " + agent.head(imgSrc)["content-length"].to_s
  puts "1 MD5           : " + GetMD5(*[file.to_s])
  puts "1 SHA256        : " + GetSha256(*[file.to_s])
end 

所以问题是:

  1. 如何优化我的抓取工具,以便以最少的请求数量获取所需的所有信息?和,

1 个答案:

答案 0 :(得分:1)

agent = Mechanize.new
thumbs.each do |thumb|
  imgUrl = thumb.css('.t_img').first['src']
  imgTitle = thumb.css('.t_img').first['alt']
  image = agent.get(imgSrc)
  p image
  puts "1 Driver        : prowl.rb"
  puts "1 Source        : " + pageURL
  puts "1 Title         : " + imgTitle
  puts "1 File Source   : " + imgUrl
  puts "1 File Type     : " + image.header['content-type']
  puts "1 File Name     : " + image.filename
  puts "1 Last Modified : " + image.header["last-modified"]
  puts "1 Image Size    : " + image.header["content-length"]
  puts "1 MD5           : " + GetMD5(*[image.content.to_s])
  puts "1 SHA256        : " + GetSha256(*[image.content.to_s])
end

在这里。重新使用代理,每次创建新代理都没有意义。

直接从Mechanize获取页面,无需打开并阅读然后传递内容。您要查找的所有标题信息都在您网页的header属性中。