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
risposta
Sì.
È possibile eseguire shell commands in Ruby via back ticks, exec and system. Si noti che ognuno ritorna qualcosa di leggermente diverso:
indietro zecche
wget http://www.yahoo.com
exec
:exec('wget http://www.yahoo.com')
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:
- mechanize con mechanize download - controlla questo railscast
- 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.
- 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
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? –
[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. –
By snapshot, vuoi dire una foto, o il codice html sottostante? –
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.) –