Comando di shell o serie di comandi simili all'azione di Automator "Ottieni URL di collegamento da pagine Web"

1

Ho una lunga lista di URL. Contenuti all'interno di ciascuna di queste pagine Web, ci sono collegamenti che devo estrarre. L'azione di Automator Ottieni URL di collegamento da pagine Web è un'azione molto utile per questa attività. Sfortunatamente Automator non gestisce molto bene i carichi di lavoro pesanti e molto spesso si blocca o si blocca indefinitamente. Come posso andare su questo utilizzando Bash tramite l'app Terminal di Mac OS X?

Modifica: questo è lo script attuale così com'è adesso.

#!/bin/bash

echo "Enter up to 3 words"
read -p "" v1 v2 v3 

web="$HOME/web.txt"
tmp="$HOME/tmp.txt"
err="$HOME/err.txt"
fin="$HOME/fin.txt"
arc="$HOME/arc.txt"

n="$(awk 'END {print NR}' "$web")"
echo "Processing $n URLs..."

grep 'http' "$web" | \
while read -r url; do
    lynx -nonumbers -hiddenlinks=merge -dump -listonly "$url" 2>>"$err" | awk '!a[$0]++' >> "$tmp"
    sleep 1
    n=$((n-1))
    [[ $n -gt 0 ]] &&  echo "$n URLs left to process..." || echo "Processing Completed!"
done

grep -e "$v1" -e "$v2" -e "$v3" "$tmp" | sort -u | cat > "$fin" 
cat "$fin" >> "$arc"

for r in "Results This Session"; do echo "$(cat "$fin" | wc -l)" "$r"; done
for a in "URL's Archived"; do echo "$(cat "$arc" | wc -l)" "$a"; done

Ho aggiunto read -p all'inizio dello script. Ci sono limitazioni sul numero di variabili che possono essere utilizzate in questo modo? Ho utilizzato con successo fino a 9 test. E c'è un modo più pratico per scrivere questo? Ho provato read -p "" {v1..v9} che non ha funzionato. Ho aggiunto un paio di cicli for alla fine per indicare quanti dati sono stati elaborati.

Problemi attuali

  • a volte viene visualizzato un errore

    sort: string comparison failed: Illegal byte sequence
    sort: Set LC_ALL='C' to work around the problem.
    

    tuttavia quando aggiungi LS_ALL=C allo script, questo non sembra corretto.

posta I0_ol 27.03.2016 - 01:39
fonte

1 risposta

1

Ecco uno script per iniziare:

#!/bin/bash

urls="/path/to/Input_URLs_List.txt"
output="/path/to/Output_Link_URLs.txt"

n="$(awk 'END {print NR}' "$urls")"
echo "Processing $n URLs..."

cat "$urls" | \
while read url; do
    lynx -dump -listonly "$url" >> "$output"
    sleep 5
    n=$((n-1))
    echo "$n URLs left to process..."
done

Ciò scaricherà tutti i collegamenti in un file che è possibile elaborare ulteriormente in base a ciò che stai cercando. È possibile aggiungere un codice aggiuntivo per filtrare ed elaborare l'output, ma senza sapere di che cosa hai bisogno dovrai lavorarci sopra o fare alcune domande aggiuntive.

Per pulire l' output , usa il seguente esempio:

Usando il link " link " come uno degli URL di output :

$ lynx -dump -listonly "https://www.google.com"


References

    1. https://www.google.com/imghp?hl=en&tab=wi
    2. https://maps.google.com/maps?hl=en&tab=wl
    3. https://play.google.com/?hl=en&tab=w8
    4. https://www.youtube.com/?tab=w1

Ho troncato l'output, in realtà c'è 19 link URL.

Per avere output solo un elenco di URL, nessun numero o spazio vuoto, ecc., usa awk in congiunzione con lynx o in seguito.

$ lynx -dump -listonly "https://www.google.com" | awk '/:/{print $2}'
https://www.google.com/imghp?hl=en&tab=wi
https://maps.google.com/maps?hl=en&tab=wl
https://play.google.com/?hl=en&tab=w8
https://www.youtube.com/?tab=w1

Quindi se vuoi che il file output sia solo l'URL di collegamento, modifica la riga di comando lynx in:

lynx -dump -listonly "$url" | awk '/:/{print $2}' >> "$output"

Puoi sempre elaborare i contenuti del file output in seguito nello script o in seguito per ottenere gli URL di collegamento desiderati e utilizzare un parametro di ricerca diverso in awk , ad esempio, ho usato ":" per eliminare entrambe le righe vuote nel lynx output e per mostrare un esempio di come può essere filtrato. In questo esempio, solo gli URL di collegamento vengono reindirizzati nel file output perché solo le righe contenenti : vengono restituite da awk , poiché tutti gli URL devono contenere i due punti. Il {print $2} , semplificato in questa spiegazione, rimuove tutto a sinistra dell'effettivo URL di collegamento.

Ecco uno script aggiornato che ordina e rimuove gli URL dei link duplicati:

#!/bin/bash

urls="/path/to/Input_URLs_List.txt"
output="/path/to/Output_Link_URLs.txt"

n="$(awk 'END {print NR}' "$urls")"
echo "Processing $n URLs..."

cat "$urls" | \
while read url; do
    lynx -dump -listonly "$url" | awk '/:/{print $2}' | sort | uniq >> "$output"
    sleep 5
    n=$((n-1))
    [[ $n -gt 0 ]] &&  echo "$n URLs left to process..." || echo "Processing Completed!"
done

Aggiornamento per acquisire stderr output da lynx a un file:

Per acquisire stderr output da lynx a un file, reindirizza stderr su un file disco, ad esempio 2>>"$file" aggiunto dopo "$url" , ad esempio:

lynx -dump -listonly "$url" 2>>"$file" >> "$output"

Aggiungi errlog="/path/to/Lynx_Errors.txt" in output="/path/to/Output_Link_URLs.txt" e quindi modifica la riga di comando lynx su, ad esempio:

lynx -dump -listonly "$url" 2>>"$errlog" >> "$output"

o

lynx -dump -listonly "$url" 2>>"$errlog" | awk '/:/{print $2}' | sort | uniq >> "$output"

Esempio:

#!/bin/bash

urls="/path/to/Input_URLs_List.txt"
output="/path/to/Output_Link_URLs.txt"
errlog="/path/to/Lynx_Errors.txt"

n="$(awk 'END {print NR}' "$urls")"
echo "Processing $n URLs..."

cat "$urls" | \
while read url; do
    lynx -dump -listonly "$url" 2>>"$errlog" | awk '/:/{print $2}' | sort | uniq >> "$output"
    sleep 5
    n=$((n-1))
    [[ $n -gt 0 ]] &&  echo "$n URLs left to process..." || echo "Processing Completed!"
done
    
risposta data 27.03.2016 - 08:45
fonte

Leggi altre domande sui tag