2014-07-03 2 views
0

Ok,Ruby Madness Téléchargement même fichier avec Nokogiri, mécaniser et openURI pour obtenir différentes informations

Je suis en train d'écrire le robot d'exploration omniprésente et se sont heurtées à certains problèmes. ~ Pas étonnant d'être un noob total chez Ruby.

J'utilise Nokogiri pour obtenir le code html d'une page. Retrouvez tous les liens qui m'intéressent, puis téléchargez les fichiers associés à ces liens. Tout va bien jusqu'ici.

Cependant, je ne semble pas pouvoir obtenir l'information dont j'ai besoin d'une seule méthode.

Si j'utilise file = open(Src).read alors le fichier contient le contenu du fichier - ce qui est génial pour l'enregistrement dans une base de données et pour le hachage. Mais cela ne me donne pas un accès facile (pour autant que je l'ai trouvé) à des attributs tels que le nom de fichier, la taille, le type de fichier, etc.

Pour obtenir cette information, je me sers Mechanize comme ceci:

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

En utilisant la méthode head agent.head, je peux obtenir le type de contenu, la date de dernière modification et la longueur du contenu. fop.filename me donne le nom de fichier bien sûr. Maintenant, en utilisant la méthode agent.head(Src)["content-type"] est, je pense que re-télécharger l'information pour les appels de type de contenu, dernière modification et contenu-longueur - il télécharge la tête 3 fois. Un gaspillage total, je dirais que le fichier contient déjà le fichier complet et fop devrait me fournir toutes les autres informations dont j'ai besoin sans appeler la tête.

est-il une meilleure façon donc de le faire (du téléchargeur ongle du pouce)

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 

La question est:

  1. Comment puis-je optimiser mon robot afin que je puisse obtenir tous l'information que je veux avec le nombre minimum de demandes? et,
+0

Pourriez-vous stocker agent.head (imgSrc) dans une variable temporaire? –

Répondre

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 

Ici, il est. Réutilisez l'agent, il ne sert à rien d'en créer un nouveau à chaque fois.

Obtenez la page directement à partir de Mechanize, pas besoin d'ouvrir et de lire puis de passer le contenu. Toutes les informations d'en-tête que vous recherchez sont dans l'attribut header de votre page.

+0

Toutefois, où se trouvent les données binaires réelles pour le fichier - le reste de votre code est bon. –

+0

J'ai oublié, désolé. C'est réparé maintenant. – hakcho

+0

Merci, gentil, soigné et efficace. –

Questions connexes