J'ai une longue liste d'URL. Chacune de ces pages Web contient des liens que je dois extraire. L'action Automator Obtenir les URL de lien des pages Web est une action très utile pour cette tâche. Malheureusement, Automator ne gère pas très bien les lourdes charges de travail et se bloque ou se bloque indéfiniment très souvent. Comment puis-je m'y prendre à l'aide de Bash via l'application Mac OS X Terminal?
Edit - c'est le script actuel tel qu'il est actuellement.
#!/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
J'ai ajouté read -p
au début du script. Y a-t-il des limites au nombre de variables pouvant être utilisées de la sorte? J'ai utilisé avec succès jusqu'à 9 tests. Et existe-t-il un moyen plus pratique d'écrire cela? J'ai essayé read -p "" {v1..v9}
qui n'a pas fonctionné. J'ai ajouté quelques for
boucles à la fin pour indiquer combien de données ont été traitées.
Questions d'actualité
parfois je reçois une erreur
sort: string comparison failed: Illegal byte sequence sort: Set LC_ALL='C' to work around the problem.
cependant, lorsque vous ajoutez
LS_ALL=C
au script, cela ne semble pas correct.
Réponses:
Voici un script pour vous aider à démarrer:
Cela va vider tous les liens dans un fichier que vous pouvez traiter en fonction de ce que vous recherchez. Du code supplémentaire pourrait être ajouté pour filtrer et traiter la sortie. Toutefois, sans savoir de quoi vous avez besoin, vous devrez travailler dessus et poser des questions supplémentaires.
Pour nettoyer la sortie , utilisez l'exemple suivant:
En utilisant " https://www.google.com " comme une des URL, le résultat devrait ressembler à ceci:
J'ai tronqué la sortie, il y a en fait 19 URL de liens.
Pour que la sortie soit simplement une liste d'URL, sans chiffres ni espaces, etc., utilisez-
awk
les conjointementlynx
ou ultérieurement.Donc, si vous voulez que le fichier de sortie ne soit que les URL de lien, modifiez la
lynx
ligne de commande pour:Vous pouvez toujours traiter le contenu du fichier de sortie plus tard dans le script ou ultérieurement pour le réduire aux URL de lien réellement recherchées et utiliser un paramètre de recherche différent dans
awk
, par exemple, j'ai utilisé ":" pour éliminer à la fois les lignes vides dans lalynx
sortie. et pour montrer un exemple de la façon dont il peut être filtré. Dans cet exemple, seules les URL de lien sont redirigées dans le fichier de sortie car seules les lignes contenant une:
sortie en obtiennentawk
, car toutes les URL doivent comporter un signe deux-points. Le{print $2}
, simplifié dans cette explication, supprime tout ce qui se trouve à gauche de l'URL de lien réelle.Voici un script mis à jour qui trie et supprime les URL de lien en double:
Mise à jour pour capturer la
stderr
sortie d'lynx
un fichier:Pour capturer la
stderr
sortie d'lynx
un fichier, redirigez-lestderr
vers un fichier sur disque, par exemple,2>>"$file"
ajouté après"$url"
, par exemple:Ajouter en-
errlog="/path/to/Lynx_Errors.txt"
dessousoutput="/path/to/Output_Link_URLs.txt"
et changer lalynx
ligne de commande en, par exemple:Ou:
Exemple:
la source
lynx
sortie , de sorte que le fichier de sortie ne contienne que des URL de lien, aucun chiffre ni espace, etc.stderr
sortie d'lynx
un fichier.lynx.... | awk.... | sort | uniq
essayerlynx -nonumbers -hiddenlinks=merge -dump -listonly "$url" | awk '!a[$0]++'