Desáté cvičení – Web crawler aneb rekurzivní stahovač
Zadání
Toto cviko bylo věnováno celé jednomu většímu příkladu – napsání rekurzivního stahovače webových stránek.
Úkol: Napište skript, který dostane URL a stáhne z ní a z odkazovaných
stránek všechny emailové adresy. Měl by umět nastavit hloubku rekurze pomocí
parametru -r <číslo>, defaultně 10.
Základní části
- Parsování argumentů – pomocí příkazu
getopts- Formátovací string:
ab:cdefinuje přepínačea,bac, kdebbere parametr getoptsvrací postupně všechny parametry (název v definované proměnné, hodnotu v$OPTARGa číslo parametru v$OPTIND)- Pro zpracování jednotlivých parametrů se hodí použít
case <proměnná> in, klauzule*)je default
while getopts r: opt; do case $opt in r) r=$OPTARG;; *) echo "Usage: $0 [-r DEEP]";; esac done - Formátovací string:
- Stažení jedné stránky – pomocí příkazu
wgets nastaveným výstupem přepínačem-O- Hodí se použít dočasný soubor získaný pomocá
mktempt
t=$(mktemp) wget -O "$t" "$url" 2>/dev/null - Hodí se použít dočasný soubor získaný pomocá
- Získání emailových adres – vhodným použitím regulárních výrazů a příkazu
grep- Přepínač
-Ezapíná extended regexy, přepínač-ozpůsobuje výpis pouze matchnutých částí
grep -Eo "[a-zA-Z0-9+.-]+@[a-zA-Z0-9+.-]+" < "$t" >> mailove_adresy.txt - Přepínač
- Získání odkazů – pomocí
sedu- Odkazy jsou ve tvaru
href="...", zkonstruujeme si pro ně regex - Přepínač
pna konci sedového příkazusubstitute způsobí výpis nahrazené části
sed -n 's/.*href="\([^"]*\)".*/\1/p' "$t" - Odkazy jsou ve tvaru
- Rekurzivní dotazy – nestihli jsme dodělat. Zbývá:
- Zajistit, abychom stejný odkaz stahovali jenom jednou
- Omezit se jen na doménu danou původním odkazem (nebylo v původním zadání, ale je velmi užitečné)
Celý program:
r=100 # default
while getopts r: opt; do
case $opt in
r) r=$OPTARG;;
*) echo "Usage: $0 [-r DEEP]";;
esac
done
shift $(($OPTIND - 1))
url="$1"
t=$(mktemp)
wget -O "$t" "$url" 2>/dev/null
grep -Eo "[a-zA-Z0-9+.-]+@[a-zA-Z0-9+.-]+" < "$t" >> mailove_adresy.txt
sed -n 's/.*href="\([^"]*\)".*/\1/p' "$t"
# Zbývá dodělat rekurzi