2012-10-08 9 views
5

Desidero creare un sito Web semplice che può scaricare una pagina Web www.example.com/index.html e archiviarne l'istantanea sul server quando il client lo richiede. Sto pensando di usare il comando wget per scaricare la pagina web. Ruby on Rails sarebbe in grado di gestire questa attività?Utilizzo di wget tramite Ruby on Rails

+0

By snapshot, vuoi dire una foto, o il codice html sottostante? –

+1

Ah, intendo sia il codice HTML sottostanti e sugli eventuali immagini/fogli di stile associati a tale pagina (vale a dire utilizzando l'opzione -p di wget.) –

risposta

10

Sì.

È possibile eseguire shell commands in Ruby via back ticks, exec and system. Si noti che ognuno ritorna qualcosa di leggermente diverso:

  1. indietro zecche

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

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

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

This blog post sembra essere nella stessa vena come quello che si sta cercando di fare.

Inoltre, ci sono diverse librerie di Ruby formidabili per fare questo:

  1. mechanize con mechanize download - controlla questo railscast
  2. httparty - semplice wrapper per un more-difficult-to-use http library. Una volta ottenuto il corpo della risposta, sarà necessario salvarlo nel database o nel file.
  3. typhoeus - semplice meccanismo per fare le richieste http in parallelo, se avete bisogno di una tale capacità

Essi forniranno un'interfaccia rubino molto migliore più pulito per trattare con i dati che torna dalle varie richieste.


Il modo migliore per testare tutte queste opzioni è utilizzare la console di Rails. Vai alla directory principale del tuo Rails app e tipo:

rails c 

volta nella console, è possibile emulare le chiamate al server reale.

L'esecuzione di wget nella console farà cadere i file nella directory principale di Rails, che non è ciò che si desidera. tmp è una directory standard per queste cose. È possibile generare in modo dinamico il percorso in base alla URL in questo modo:

# 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}") 

assicurarsi di includere anche le opzioni da this post

+0

Grazie! Lasciami passare un po 'di tempo per esaminare la tua risposta. Tra l'altro, una volta che eseguo 'wget' usando' exec'/'system', come posso specificare dove sul server per posizionare i file? –

+0

[Il post del blog] (http://blogforever.eu/blog/2011/05/21/creating-a-snapshot-of-a-blog-post-using-wget/) che hai citato è assolutamente incredibile. Questo dovrebbe quasi sostituire la metà del parser di parser di pagine statiche che le gemme sono obsolete. –