1 votos

Comando de shell o serie de comandos similares a la acción de Automator "Get Link URLs from Webpages"

Tengo una larga lista de URLs. Dentro de cada una de estas páginas web, hay enlaces que necesito extraer. La acción de Automator "Get Link URLs from Webpages" es una acción muy útil para esta tarea. Desafortunadamente, Automator no maneja muy bien las cargas de trabajo pesadas y muy a menudo se bloquea o se cuelga indefinidamente. ¿Cómo podría hacer esto usando Bash a través de la aplicación Terminal de Mac OS X?

Edición - este es el actual script tal y como está ahora mismo.

#!/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

He añadido read -p al principio del script. ¿Existen limitaciones en el número de variables que se pueden utilizar así? He utilizado con éxito hasta 9 en las pruebas. ¿Y hay una forma más práctica de escribir esto? He probado read -p "" {v1..v9} que no funcionó. Añadí un par de for al final para indicar la cantidad de datos procesados.

Temas de actualidad

  • a veces me sale un error

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

    Sin embargo, cuando se añade LS_ALL=C al script no parece correcto esto.

0 votos

De hecho ya tengo instalado lynx vía Homebrew.

0 votos

De acuerdo entonces. IMO escribir un bash script usando lynx para obtener los enlaces de la lista de URL's es el camino a seguir. Con las URLs de destino en un archivo de texto, uno por línea, el archivo puede ser leído en una línea a la vez y procesado en un bucle con un temporizador para no golpear el servidor demasiado rápido si las URLs están apuntando al mismo dominio y o simplemente para el ritmo de las cosas adecuadamente. Toda la salida se pone en otro archivo para ser filtrada como sea necesario para llegar a la lista de URLs deseadas. ¿Necesita ayuda con el script?

0 votos

Sí, sería genial si pudieras. Estoy empezando a aprender bash pero soy muy novato. Tengo las URLs en un archivo de texto plano una por línea. Sólo que no estoy seguro de dónde ir desde allí.

1voto

user3439894 Puntos 5883

Aquí hay un script para empezar:

#!/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

Esto volcará todos los enlaces en un archivo que podrás procesar posteriormente en función de lo que busques. Más información en código podría añadirse para filtrar y procesar la salida, sin embargo, sin saber qué es lo que necesitas tendrás que trabajar en ello o hacer algunas preguntas adicionales.


Para limpiar el salida Utiliza lo siguiente como ejemplo:

Usando " https://www.google.com " como una de las URLs que el salida se vería así:

$ 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

He truncado la salida, en realidad hay 19 URLs de enlaces.

Para tener la salida sea sólo una lista de URLs, sin números ni espacios en blanco, etc., utilice awk ya sea en conjunto con lynx o después.

$ 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

Así que si quieres el salida para que sean sólo las URL de los enlaces, cambie el lynx en la línea de comandos:

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

Siempre se puede procesar el contenido del salida archivo más adelante en el script o después para reducirlo a las URLs de enlaces realmente deseadas y utilizar un parámetro de búsqueda diferente en awk Por ejemplo, he utilizado ":" para eliminar las líneas en blanco en el lynx salida y mostrar un ejemplo de cómo se puede filtrar. En este ejemplo sólo las URLs de enlaces son redirigidas al salida porque sólo las líneas que contienen un : obtener la salida por awk ya que todas las URLs deben llevar dos puntos. La dirección {print $2} , simplificado en esta explicación, elimina todo lo que está a la izquierda de la URL real del enlace.


Aquí hay una actualización script que clasifica y elimina las URL de enlaces duplicados:

#!/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

Actualizar para capturar stderr salida de lynx a un archivo:

Para captar stderr salida de lynx a un archivo, redirigir stderr a un archivo de disco, por ejemplo, 2>>"$file" añadido después de "$url" Por ejemplo:

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

Añadir errlog="/path/to/Lynx_Errors.txt" en output="/path/to/Output_Link_URLs.txt" y luego cambiar el lynx en la línea de comandos, por ejemplo

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

O:

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

Ejemplo:

#!/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

0 votos

Sé que se supone que no debemos usar los comentarios para dar las gracias, pero al diablo con las reglas.. ¡Muchas gracias! Me habéis ayudado muchísimo.

0 votos

@user556068, he añadido un ejemplo para filtrar el lynx salida Así pues, el archivo de salida sólo contendrá URLs de enlaces, sin números ni espacios en blanco, etc.

0 votos

Cuánta información. Puedo decir que voy a aprender muchas cosas nuevas. Pregunta para usted - ¿Cómo puedo crear un registro de errores para realizar un seguimiento de las URL que causan "lynx: No se puede acceder al archivo de inicio"?

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X