Mustand: sisu ei ole veel tehniliselt ega keeleliselt täielikult kontrollitud ega toimetatud.

Peatüki vaade

Linux/Unix/macOS käsurea kiirõpik

Praegu loed peatükki Veebist sisu toomine ja tekstivaade: curl, wget, lynx, mis kuulub osasse Osa III: Failid, võrk ja süsteemitöö.

Veebist sisu toomine ja tekstivaade: curl, wget, lynx

Selles peatükis vaatame, kuidas veebist sisu alla tuua, HTML-i tekstiks muuta ja vajadusel teha väike kontrollitud crawl.

Loogika

Veebist sisu toomisel tasub kõigepealt eristada kolme eri ülesannet:

  1. too üks vastus või fail
  2. laadi alla terve lehtede puu või jätka katkestatud tõmmet
  3. vaata HTML-i loetava tekstina või kogu sealt lingid kokku

Just selle järgi tasub tööriist valida:

  • curl ühe päringu, päiste, API või toor-HTML jaoks
  • wget allalaadimise, jätkamise ja crawl'i jaoks
  • lynx HTML-i tekstivaate ja linkide loendi jaoks

Sõna “scrape” tähendab siin lihtsalt seda, et võtad veebist sisu ja töötled seda edasi käsureal. Kui ametlik API või andmefail on olemas, siis eelista seda peaaegu alati HTML-i kraapimisele.

Enne kui kraabid

Enne automaatset allalaadimist tasub alati kontrollida mõnda lihtsat asja:

  • kas saidil on olemas API või andmeeksport
  • kas robots.txt või kasutustingimused lubavad seda tööd
  • kas saad alustada väikese prooviga, mitte kohe terve domeeniga
  • kas lisad päringute vahele pausi, kui teed korduvaid tõmbeid
  • kas suudad hiljem tõestada, kust andmed tulid ja millal sa need tõid

Hea reegel on: alusta ühe URL-iga, kontrolli tulemust ja alles siis mõtle suurema crawl'i peale.

Kiirspikker

  • curl -I URL küsib ainult päised
  • curl -L -o fail.html URL salvestab vastuse faili ja järgib ümbersuunamisi
  • curl -sL URL | lynx -stdin -dump muudab veebilehe tekstiks
  • wget URL laeb URL-i vaikimisi faili
  • wget -c URL jätkab katkestatud allalaadimist
  • wget --recursive --level=1 --no-parent URL teeb väikese piiratud crawl'i
  • lynx URL avab tekstilise veebivaate interaktiivselt
  • lynx -dump URL trükib lehe teksti koos viidetega välja
  • lynx -dump -listonly URL trükib välja ainult linkide nimekirja

Kui tööriist puudub

curl on sageli juba olemas, kuid wget ja lynx ei pruugi igas süsteemis vaikimisi paigaldatud olla.


sudo apt install wget lynx
sudo dnf install wget lynx
brew install wget lynx

Käivita need käsud

See plokk näitab ühe väikese ohutu töövoo:

  • vaata, kas URL üldse vastab
  • salvesta leht faili
  • muuda HTML tekstiks
  • kogu linkide nimekiri eraldi välja

mkdir -p veeb-naide
cd veeb-naide
curl -I https://example.com/
curl -L -o naide-curl.html https://example.com/
wget -O naide-wget.html https://example.com/
lynx -dump naide-curl.html | sed -n '1,20p'
lynx -dump -listonly https://example.com/
ls -lh

Kui tahad veebist tulnud HTML-i kohe torusse panna, siis tee nii:


curl -sL https://example.com/ | lynx -stdin -dump | sed -n '1,20p'

curl: üks vastus korraga

curl on hea siis, kui tahad täpselt kontrollida, mis päring tehakse ja mida vastuseks saadakse.

Olulised lipud alguses:

  • -I ainult päised
  • -L järgi ümbersuunamisi
  • -o fail salvesta kindla nimega
  • -O salvesta serveri pakutud nimega
  • -s vaikne reziim
  • -S näita viga ka siis, kui kasutad -s

Näited:


curl -I https://example.com/
curl -L -o esileht.html https://example.com/
curl -sL https://example.com/ | grep -i '<title'
curl -sL https://example.com/ | lynx -stdin -dump

Praktiline mõte on siin lihtne:

  • curl kirjutab vaikimisi väljundi ekraanile
  • seetõttu sobib ta hästi torude ja filtritega
  • curl ise ei tee “veebipuud”, vaid ühe või mõne konkreetse päringu

wget: allalaadija ja crawler

wget on mugav siis, kui tahad, et fail päriselt kettale jääks, või kui tahad teha piiratud rekursiivset allalaadimist.

Olulised lipud alguses:

  • -O fail salvesta kindla nimega
  • -c jätka katkestatud tõmmet
  • -P kaust salvesta kindlasse kausta
  • --recursive rekursiivne allalaadimine
  • --level=1 või -l 1 piira sügavust
  • --no-parent ära mine ülemkataloogidesse
  • --page-requisites tõmba lehe toimimiseks vajalikud failid
  • --convert-links muuda lingid lokaalses koopias sobivaks
  • --adjust-extension pane HTML-failidele sobiv laiend
  • --wait=1 ja --random-wait tee viisakam crawl

Näited:


wget https://example.com/
wget -O esileht.html https://example.com/
wget -c -O esileht-koopia.html https://example.com/

Väike piiratud crawl:


wget --recursive --level=1 --no-parent https://example.com/

Kui tahad teha lokaalse koopiana väikest dokumentatsioonipuud, siis mall on näiteks selline:


wget \
  --mirror \
  --convert-links \
  --adjust-extension \
  --page-requisites \
  --no-parent \
  --wait=1 \
  --random-wait \
  https://docs.example.org/juhend/

Seda viimast käsku ei tasu kunagi pimesi suvalise suure saidi juurel käivitada. Kõigepealt kontrolli alati:

  • kui suur ala sul tegelikult vaja on
  • kas --no-parent ja õige alg-URL piiravad töö piisavalt kitsaks
  • kas serverile on mõistlik teha nii palju päringuid

lynx: HTML tekstiks ja lingid välja

lynx on kasulik siis, kui veebileht on vaja teha kiiresti loetavaks tekstiks.

See on hea tööriist näiteks siis, kui:

  • tahad lehte lugeda terminalist
  • tahad HTML-ist saada lihtsa tekstivaate
  • tahad linkide nimekirja eraldi kätte
  • tahad torust tuleva HTML-i kiiresti puhastada enne grep-i või sed-i

Kõige tavalisemad töökujud:


lynx https://example.com/
lynx -dump https://example.com/
lynx -dump -listonly https://example.com/

Kui sul on HTML juba failis, siis saad sama teha lokaalselt:


lynx -dump naide-curl.html
lynx -dump -listonly naide-curl.html

Vahe on lihtne:

  • lynx URL on interaktiivne tekstibrauser
  • lynx -dump URL prindib loetava tekstivaate ekraanile
  • lynx -dump -listonly URL prindib ainult lingid

Väike scrape-töövoog

Kui eesmärk ei ole “terve sait alla”, vaid “too üks leht ja töötle seda”, siis üks praktiline töövoog on:


curl -L -o leht.html https://example.com/
lynx -dump leht.html > leht.txt
grep -n 'Example' leht.txt
lynx -dump -listonly leht.html > lingid.txt
wc -l lingid.txt

See töövoog on hea, sest iga samm on kontrollitav:

  1. tõmbad algse HTML-i faili
  2. teed sellest inimesele loetava tekstiversiooni
  3. otsid tekstist mustrit
  4. võtad lingid eraldi nimekirjana välja

See seob hästi kokku ka peatükid grep, sed, sort ja awk.

Mida tasub meeles pidada

  • curl sobib paremini üksikute päringute ja torude jaoks
  • wget sobib paremini allalaadimise ja crawl'i jaoks
  • lynx ei ole “crawler”, vaid tekstivaate ja linkide tööriist
  • HTML-i scrape on habras, sest lehe struktuur võib muutuda
  • JavaScriptiga ehitatud sait ei pruugi anda curl-ile või wget-ile sama pilti, mida näeb brauser

Kui näed, et info tuleb lehele alles JavaScripti abil, siis puhas curl või wget ei pruugi sulle tegelikku sisu anda. Siis tasub otsida:

  • ametlikku API-t
  • JSON-vastust brauseri võrgupaneelist
  • eksportfaili nagu CSV või JSON

Minitest

  1. Tee curl -I päring aadressile https://example.com/.
  2. Salvesta sama leht korraga nii curl-i kui wget-iga.
  3. Muuda üks HTML-fail lynx -dump abil tekstiks.
  4. Trüki lynx -dump -listonly abil välja ainult lingid.
  5. Seleta ühe lausega, millal kasutaksid curl, millal wget ja millal lynx.