2013-02-13 14 views
6

Uso Mechanize e Nokogiri per raccogliere alcuni dati. Ho bisogno di salvare un'immagine generata casualmente ad ogni richiesta.Salva immagine con Mechanize e Nokogiri?

Nel mio tentativo sono costretto a scaricare tutte le foto, ma l'unico che voglio veramente è l'immagine si trova all'interno div#specific.

Inoltre, è possibile generare dati Base64 da esso, senza salvare o ricaricare la sua fonte?

require 'rubygems' 
require 'mechanize' 
require 'nokogiri' 

a = Mechanize.new { |agent| 
    agent.keep_alive = true 
    agent.max_history = 0 
} 

urls = Array.new() 
urls.push('http://www.domain.com'); 

urls.each {|url| 

    page = a.get(url) 
    doc = Nokogiri::HTML(page.body) 

    if doc.at_css('#specific') 

     page.images.each do |img| 
      img.fetch.save('picture.png') 
     end 

    end 
} 
+2

Speriamo che questo non sia un tentativo di sconfiggere un CAPTCHA. –

risposta

25

Per recuperare le immagini dalla posizione specifica:

agent = Mechanize.new 
page = agent.get('http://www.domain.com') 
images = page.search("#specific img") 

Per salvare l'immagine:

agent.get(images.first.attributes["src"]).save "path/to/folder/image_name.jpg" 

per ottenere l'immagine codificata senza salvare:

encoded_image = Base64.encode64 agent.get(images.first.attributes["src"]).body_io.string 

I eseguito questo solo per assicurarsi che il l'immagine codificata può essere decodificata:

File.open("images/image_name.jpg", "wb") {|f| f.write(Base64.decode64(encoded_image))} 
+0

Se non sbaglio, il salvataggio dell'immagine in questo modo ricarica lo src? HO BISOGNO di salvare l'immagine, o di ottenere base64, SENZA ricaricare lo src. – charliexx

+7

Non si verifica alcun ricaricamento. A differenza di un browser Internet, Mechanize non scarica automaticamente immagini o altre risorse. Carica solo il documento html. Quindi trovi l'url immagine necessario nel documento e scarica esplicitamente l'immagine. – victmask

+0

C'è QUALUNQUE modo di farlo, senza ricaricare l'immagine? Forse usando un'altra gemma? – charliexx