2012-10-08 16 views
5

Quiero construir un sitio web simple que pueda descargar una página web www.example.com/index.html y almacenar su instantánea en el servidor cuando el cliente lo solicite. Estoy pensando en usar el comando wget para descargar la página web. ¿Podría Ruby on Rails ser capaz de manejar esta tarea?Usando wget vía Ruby on Rails

+0

con captura de imagen, qué se refiere una imagen, o el HTML subyacente? –

+1

Ah, me refiero tanto al html subyacente como a las imágenes/hojas de estilo asociadas a esa página (es decir, utilizando la opción -p de wget). –

Respuesta

10

Sí.

Puede realizar shell commands in Ruby via back ticks, exec and system. Tenga en cuenta que cada uno vuelve algo ligeramente diferente:

  1. volver garrapatas

    wget http://www.yahoo.com 
    
  2. exec:

    exec('wget http://www.yahoo.com') 
    
  3. system:

    system('wget http://www.yahoo.com') 
    

This blog post parece estar en la misma línea que lo que está tratando de hacer.

Además, hay varias bibliotecas de Ruby fabulosas para hacer esto:

  1. mechanize con mechanize download - echa un vistazo a este railscast
  2. httparty - simple envoltorio alrededor de una more-difficult-to-use http library. Una vez que obtenga el cuerpo de respuesta, deberá guardarlo en la base de datos o archivo.
  3. typhoeus - mecanismo simple para hacer las peticiones HTTP en paralelo, si necesita tal capacidad

Ello permitiría disponer de una interfaz de Rubí mucho mejor limpiador para hacer frente a los datos que regresa de las diversas solicitudes.


La mejor manera de probar todas estas opciones es utilizar la consola de Rails. Ir al directorio raíz de la aplicación Rails y tipo:

rails c 

Una vez en la consola, puede emular las llamadas a servidores reales.

Al ejecutar wget en su consola se soltarán los archivos en el directorio raíz de Rails, que no es lo que desea. tmp es un directorio estándar para tales cosas. Puede generar dinámicamente el camino basado en la URL de esta manera:

# tmp directory 
path = Rails.root.join('tmp') 
# create sub-directory as md5 hash based on URL 
sub_dir = Digest::MD5.hexdigest(url) 
# append sub_dir on the path 
destination_path = path.join(sub_dir) 
system("wget -P #{destination_path} #{url}") 

Asegúrese de incluir también las opciones de this post

+0

¡Gracias! Déjame tomar un tiempo para revisar tu respuesta. Por cierto, una vez que ejecuto 'wget' usando' exec'/'system', ¿cómo puedo especificar dónde en el servidor colocar los archivos? –

+0

[La publicación del blog] (http://blogforever.eu/blog/2011/05/21/creating-a-snapshot-of-a-blog-post-using-wget/) que usted mencionó es absolutamente increíble. Esto debería reemplazar a la mitad de las gemas de rubí del analizador de páginas estáticas que están obsoletas. –