2012-01-21 17 views
13

Vorrei scaricare una pagina Web mentre fornivo URL da stdin. In sostanza, un processo produce continuamente URL per stdout/file e io li voglio filtrare su wget o curl. (Pensaci come un semplice web crawler se vuoi).wget o curl da stdin

Questo sembra funzionare bene:

tail 1.log | wget -i - -O - -q 

Ma quando uso 'tail-f' e non funziona più (buffering o wget è in attesa di EOF?):

tail -f 1.log | wget -i - -O - -q 

Qualcuno potrebbe fornire una soluzione usando wget, curl o qualsiasi altro strumento Unix standard? Idealmente non voglio ricominciare wget in loop, continuate a farlo scaricando gli URL mentre arrivano.

risposta

6

Ciò che è necessario utilizzare è xargs. Per esempio.

tail -f 1.log | xargs -n1 wget -O - -q 
+0

Con 'xargs'' wget' riceve l'URL come parametro in modo da non dover più '-i -'. 'tail -f 1.log | xargs -n1 wget -O - -q' – pabouk

+0

questo avvierà un nuovo processo wget per URL –

+0

Se questo è in esecuzione su una macchina condivisa, è possibile sapere che qualsiasi altro utente può leggere i parametri usando il comando "ps", quindi non mettere password ecc. nei tuoi URL. Utilizza una delle soluzioni che non comporta il passaggio allo standard in parametri se questo potrebbe essere un problema (gli amministratori con accesso root alla macchina potrebbero ovviamente controllare quali URL stai recuperando, ma presumibilmente ti fidi degli amministratori più di quanto ti fidi casualmente altri utenti). –

0

Utilizzare xargs che converte stdin in argomento.

tail 1.log | xargs -L 1 wget 
+0

Come ho commentato l'altra risposta: se questo è in esecuzione su una macchina condivisa, ti piacerebbe sapere che ogni altro utente può leggere i tuoi parametri usando il comando "ps", quindi non mettere password ecc. Nei tuoi URL . Utilizza una delle soluzioni che non comporta il passaggio allo standard in parametri se questo potrebbe essere un problema (gli amministratori con accesso root alla macchina potrebbero ovviamente controllare quali URL stai recuperando, ma presumibilmente ti fidi degli amministratori più di quanto ti fidi casualmente altri utenti). –

3

È possibile eseguire questa operazione con cURL, ma l'input deve essere formattato correttamente. Esempio alfa.txt:

url example.com 
output example.htm 
url stackoverflow.com 
output stackoverflow.htm 

esempio alternativo:

url stackoverflow.com/questions 
remote-name 
url stackoverflow.com/documentation 
remote-name 

comando Esempio:

cat alfa.txt | curl -K- 
+0

Le righe "output" o "remote-name" sono opzionali: ometterle se si desidera che l'output passi all'output standard.Quindi tutto quello di cui hai bisogno è aggiungere "url" all'inizio di ogni riga (ad esempio pipe through sed -e 's/^/url /') –

+0

il problema del buffer dell'OP sarà ancora un problema qui. curl's -K- non carica il suo input una riga alla volta. –

0

Prova il piping tail -f attraverso python -c $'import pycurl;c=pycurl.Curl()\nwhile True: c.setopt(pycurl.URL,raw_input().strip()),c.perform()'

Questo diventa riccio (beh, probabilmente intendeva il ricciolo della riga di comando e lo chiamo come una libreria da un one-liner Python, ma è ancora arricciato) per recuperare immediatamente ogni URL, sfruttando comunque il mantenimento del socket sul server aperto se stai richiedendo più URL dallo stesso server in sequenza. Tuttavia, non è completamente robusto: se uno dei tuoi URL è duff, l'intero comando fallirà (potresti voler farlo diventare uno script Python appropriato e aggiungere try/except per gestirlo), e c'è anche il piccolo dettaglio che getterà EOFError su EOF (ma suppongo che ciò non sia importante se si utilizza tail -f).