2013-02-13 46 views
6

Tôi đang sử dụng Mechanize và Nokogiri để thu thập một số dữ liệu. Tôi cần lưu một bức ảnh được tạo ngẫu nhiên theo từng yêu cầu.Lưu hình ảnh bằng Cơ chế và Nokogiri?

Trong nỗ lực của mình, tôi buộc phải tải xuống tất cả các hình ảnh, nhưng chỉ người tôi thực sự muốn là hình ảnh nằm trong phạm vi div#specific.

Ngoài ra, có thể tạo dữ liệu Base64 từ nó mà không lưu hoặc tải lại nguồn của nó không?

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

Hy vọng đây không phải là nỗ lực đánh bại CAPTCHA. –

Trả lời

25

Để lấy hình ảnh từ vị trí cụ thể:

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

Để lưu hình ảnh:

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

Để có được hình ảnh được mã hóa mà không lưu:

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

tôi chạy điều này chỉ để đảm bảo rằng hình ảnh đã được mã hóa có thể được giải mã trở lại:

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

Nếu tôi không nhầm lẫn, lưu hình ảnh theo cách này sẽ tải lại src? Tôi CẦN lưu hình ảnh, hoặc lấy base64, KHÔNG tải lại src. – charliexx

+7

Không tải lại xảy ra. Không giống như trình duyệt internet, Mechanize không tự động tải xuống hình ảnh hoặc bất kỳ nội dung nào khác. Nó chỉ tải tài liệu html. Sau đó, bạn tìm thấy url hình ảnh cần thiết trong tài liệu và tải xuống hình ảnh một cách rõ ràng. – victmask

+0

Có cách nào để làm điều đó, mà không cần tải lại hình ảnh? Có lẽ sử dụng đá quý khác? – charliexx