2013-02-13 12 views
6

Używam Mechanize i Nokogiri do zbierania danych. Muszę zapisać obraz losowo wygenerowany przy każdym żądaniu.Zapisywanie obrazu za pomocą Mechanize i Nokogiri?

Podczas mojej próby jestem zmuszony do pobrania wszystkich zdjęć, ale jedynym, którego naprawdę chcę, jest obraz zlokalizowany w obrębie div#specific.

Czy jest możliwe wygenerowanie z niego danych Base64, bez ich zapisywania lub ponownego załadowania źródła?

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

Mam nadzieję, że nie jest to próba pokonania CAPTCHA. –

Odpowiedz

25

Aby pobrać obrazy z określonej lokalizacji:

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

Aby zapisać obraz:

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

Aby uzyskać obraz zakodowany bez zapisywania:

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

I uruchomiłem to, aby upewnić się, że obraz, który został zakodowany, może zostać zdekodowany z powrotem:

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

Jeśli się nie mylę, zapisanie obrazu w ten sposób ponownie załaduje src? POTRZEBUJĘ, aby zapisać obraz, lub uzyskać base64, BEZ ponownego załadowania src. – charliexx

+7

Nie ma ponownego ładowania. W przeciwieństwie do przeglądarki internetowej, Mechanize nie pobiera automatycznie obrazów ani żadnych innych zasobów. Ładuje tylko dokument HTML. Następnie znajdź potrzebny URL obrazu w dokumencie i jawnie pobierz obraz. – victmask

+0

Czy istnieje JAKIKOLWIEK sposób, aby to zrobić, bez przeładowywania obrazu? Być może używając innego klejnotu? – charliexx