Mam długą listę adresów URL. Na każdej z tych stron znajdują się linki, które muszę wyodrębnić. Akcja Automatora Pobierz adresy URL linków ze stron internetowych jest bardzo przydatną akcją dla tego zadania. Niestety sam Automator nie radzi sobie dobrze z dużymi obciążeniami i bardzo często ulega awarii lub zawiesza się w nieskończoność. Jak mogę to zrobić za pomocą Bash za pośrednictwem aplikacji terminalowej Mac OS X?
Edytuj - jest to bieżący skrypt w obecnej postaci.
#!/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
Dodałem read -p
na początku skryptu. Czy istnieją ograniczenia dotyczące liczby zmiennych, których można użyć w ten sposób? Z powodzeniem wykorzystałem do 9 w testowaniu. Czy istnieje bardziej praktyczny sposób na napisanie tego? Próbowałem, read -p "" {v1..v9}
co nie zadziałało. Na końcu dodałem kilka for
pętli, aby wskazać, ile danych zostało przetworzonych.
Bieżące problemy
czasami pojawia się błąd
sort: string comparison failed: Illegal byte sequence sort: Set LC_ALL='C' to work around the problem.
jednak po dodaniu
LS_ALL=C
do skryptu nie wydaje się to poprawne.
Odpowiedzi:
Oto skrypt na początek:
Spowoduje to zrzucenie wszystkich łączy do pliku, który możesz dalej przetwarzać w zależności od tego, czego szukasz. Można dodać dodatkowy kod do filtrowania i przetwarzania danych wyjściowych, jednak bez wiedzy, czego potrzebujesz, będziesz musiał nad nim popracować lub zadać dodatkowe pytania.
Aby wyczyścić dane wyjściowe , użyj następującego przykładu:
Przy użyciu „ https://www.google.com ” jako jednego z adresów URL dane wyjściowe wyglądałyby tak:
Obciąłem dane wyjściowe, w rzeczywistości jest 19 adresów URL linków.
Aby wynik był tylko listą adresów URL, bez liczb lub białych znaków itp., Użyj
awk
albo w połączeniu z,lynx
albo później.Jeśli więc chcesz, aby plik wyjściowy był tylko adresem URL łącza, zmień
lynx
wiersz polecenia na:Zawsze możesz przetworzyć zawartość pliku wyjściowego później w skrypcie lub później, aby sprowadzić go do naprawdę pożądanych adresów URL linków i użyć innego parametru wyszukiwania w
awk
, np. Użyłem „:”, aby wyeliminować puste linie nalynx
wyjściu i aby pokazać przykład, w jaki sposób można go filtrować. W tym przykładzie tylko adresy URL linków są przekierowywane do pliku wyjściowego , ponieważ tylko wiersze zawierające dane:
wyjściowe getawk
, ponieważ wszystkie adresy URL powinny zawierać dwukropek.{print $2}
, Uproszczone w tym wyjaśnieniem, usuwa wszystko na lewo od rzeczywistego URL Link.Oto zaktualizowany skrypt, który sortuje i usuwa zduplikowane adresy URL linków:
Aktualizacja przechwycić
stderr
wyjście zlynx
do pliku:Aby przechwycić
stderr
wyjście zlynx
do pliku przekierowaćstderr
do pliku na dysku, np2>>"$file"
dodanej po"$url"
, na przykład:Dodaj
errlog="/path/to/Lynx_Errors.txt"
pod,output="/path/to/Output_Link_URLs.txt"
a następnie zmieńlynx
wiersz poleceń na, np .:Lub:
Przykład:
źródło
lynx
wyjściowych , więc plik wyjściowy będzie zawierał tylko adresy URL linków, żadnych liczb ani białych znaków itp.stderr
wyjścia zlynx
do pliku.lynx.... | awk.... | sort | uniq
trylynx -nonumbers -hiddenlinks=merge -dump -listonly "$url" | awk '!a[$0]++'