2014-07-03 20 views
0

好吧,红宝石的疯狂下载与Nokogiri相同的文件,机械化和OpenUri获得不同的信息

我正在写无处不在的爬虫,并遇到了一些问题。 〜毫不奇怪,在Ruby的时候总是一个noob。

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

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

如果我使用file = open(Src).read那么文件包含文件的内容 - 这非常适合保存到数据库以及散列目的。但它并没有给我轻松访问(只要我发现)将属性如文件名,大小,文件类型等

为了让我使用机械化像这样的信息:

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. 如何优化我的履带,这样我可以得到所有我想要的最少数量的请求信息?
+0

您能否将agent.head(imgSrc)存储到临时变量中? –

回答

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直接获取页面,没有nead打开并阅读,然后传递内容。您正在查找的所有标题信息都在页面的header属性中。

+0

但是,文件的实际二进制数据在哪里存在 - 其余代码虽然是好的。 –

+0

我忘了它,对不起。现在已经修复了。 – hakcho

+0

谢谢,不错,整洁和高效。 –