2009-07-02 14 views

Respuesta

50

require "open-uri" 

open("your-url") {|f| 
    File.open("whatever_file.jpg","wb") do |file| 
    file.puts f.read 
    end 
} 


+1

Necesita agregar "require 'open-uri'" para que esto funcione. – Keltia

+0

Sí, olvidé agregarlo en la primera versión. – Geo

+4

de manera tangencial, si está en Windows (a diferencia del OP), necesitará abrir el archivo en modo binario: File.open (filename, 'w'). Binmode do | file | ... –

0
%x(wget http://farm1.static.flickr.com/92/218926700_ecedc5fef7_o.jpg) 

o

`wget http://farm1.static.flickr.com/92/218926700_ecedc5fef7_o.jpg` 
+2

esto no es portátil. – Geo

+1

tal vez. Pero él preguntó algo que funcionaría en Mac. –

+0

Esto no funciona en macOS. No, a menos que instale específicamente 'wget'. Si hubieras sugerido 'curl' (que viene por defecto), hubiera sido más aceptable. – user137369

0

La forma más fácil sería exigir open-uri y el uso que con la respuesta anterior o utilizar el módulo también suministrado Net :: HTTP con su método de obtención.

2

Si desea descargar todas las imágenes en una sola página, puede utilizar la gema image_downloader:

require 'rubygems' 
require 'image_downloader' 

downloader = ImageDownloader::Process.new('www.test.com','img_dir/') 

downloader.parse(:any_looks_like_image => true) 

downloader.download() 
15

Trate de usar la gema Mechanize:

Inicio con: sudo gem install mechanize para instalar Mechanize.

continuación:

require 'rubygems' 
require 'mechanize' 

agent = Mechanize.new 
link = 'http://www.asite.com/pic.jpg' 
agent.get(link).save "images/pic.jpg" 

EDIT: Para hacer las cosas más limpio que yo sugeriría que utilice el nombre del archivo en sí cuando se guarda la imagen. Tuve un problema al guardar imágenes a granel porque no estaban formateadas correctamente. Las imágenes se guardan como esto:

#pic.jpg(1) 
#pic.jpg(2) 
#etc. 

Es por eso que es mejor usar el nombre de la imagen como el nombre del archivo de la siguiente manera:

agent.get(src).save "images/#{File.basename(url)}" 

File.basename toma la URL de la imagen y simplemente devuelve el de la actual nombre de la imagen:

File.basename("http://www.asite.com/pic.jpg") 
# returns the image name 
pic.jpg 
0

Para que todo esté más limpio, le sugiero que utilice el nombre del archivo cuando guarde la imagen. Tuve un problema al guardar imágenes a granel porque no estaban formateadas correctamente. Las imágenes se guardan como esto:

#pic.jpg(1) 
#pic.jpg(2) 
#etc. 

Es por eso que es mejor usar el nombre de la imagen como el nombre del archivo de la siguiente manera:

src = 'http://www.asite.com/pic.jpg'  
agent.get(src).save "#{folder}/#{File.basename(src)}" 

File.basename toma la URL de la imagen y simplemente devuelve el de la actual nombre de imagen:

File.basename("http://www.asite.com/pic.jpg") 
# returns the image name 
pic.jpg 
Cuestiones relacionadas