2014-07-03 21 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

謝謝,不錯,整潔和高效。 –