J'ai une longue liste d'URL. Contenu à l'intérieur de chaque page Web, il y a des liens que je dois extraire. L'action Automator Obtenir les URL des liens à partir des pages Web est une action très utile pour cette tâche. Malheureusement, Automator lui-même ne gère pas très bien les charges de travail lourdes et plante souvent ou reste bloqué indéfiniment. Comment pourrais-je procéder en utilisant Bash via l'application Terminal Mac OS X ?
Éditer - voici le script actuel tel qu'il est maintenant.
#!/bin/bash
echo "Entrez jusqu'à 3 mots"
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 "Traitement de $n URL..."
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 URL restant à traiter..." || echo "Traitement terminé!"
done
grep -e "$v1" -e "$v2" -e "$v3" "$tmp" | sort -u | cat > "$fin"
cat "$fin" >> "$arc"
for r in "Résultats de cette session"; do echo "$(cat "$fin" | wc -l)" "$r"; done
for a in "URL archivées"; do echo "$(cat "$arc" | wc -l)" "$a"; done
J'ai ajouté read -p
au début du script. Y a-t-il des limitations sur le nombre de variables qui peuvent être utilisées de cette manière ? J'ai réussi à en utiliser jusqu'à 9 en testant. Et y a-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 boucles for
à la fin pour indiquer combien de données ont été traitées.
Problèmes actuels
-
parfois j'obtiens une erreur
sort: comparaison de chaînes a échoué : Séquence de byte incorrecte sort: Définissez LC_ALL='C' pour contourner le problème.
cependant lorsque j'ajoute
LS_ALL=C
au script, cela ne semble pas correct.
0 votes
J'ai déjà installé lynx via Homebrew.
0 votes
D'accord alors. À mon avis, écrire un script bash en utilisant lynx pour obtenir les liens à partir de la liste d'URL est la meilleure solution. Avec les URL cibles dans un fichier texte, un par ligne, le fichier peut être lu ligne par ligne et traité dans une boucle avec un minuteur afin de ne pas surcharger trop rapidement le serveur si les URL pointent vers le même domaine et/ou simplement pour rythmer les choses de manière appropriée. Toutes les sorties sont mises dans un autre fichier pour être filtrées selon les besoins afin d'obtenir une liste d'URL souhaitée. Avez-vous besoin d'aide avec le script?
0 votes
Oui, ce serait super si vous pouviez le faire. Je commence à apprendre bash mais je suis très novice en la matière. J'ai les URL dans un fichier texte brut, un par ligne. Je ne suis juste pas sûr de ce que je dois faire ensuite.