Blog Layout

Mihin web scraping perustuu?

Jouni Lapinkangas • 31. heinäkuuta 2024

Mihin web scraping perustuu?

Asiaan vihkiytymättömälle saattaa kuulostaa erikoiselta että robotti voisi käydä nettisivuilla, ja osata hakea sieltä juuri sinulle olennaiset tiedot. Mistä robotti tietää mitä hakea?


Tässä kirjoituksessa käyn lyhyesti läpi erilaisia tapoja toteuttaa web scrapingia. Kyseessä ei missään nimessä ole kaiken kattava opas (näitä on netti pullollaan), vaan pieni tietoisku, jonka tarkoitus on selittää miksi web scraping yleensäkin toimii.


HTML-sivu haltuun


Nettisivut toteutetaan html-koodilla. Jos tutkailet jonkin nykyaikaisen sivuston lähdekoodia, näyttää se usein suurelta sekamelskalta. Jos sivustoa tarpeeksi yksinkertaistetaan, on koodi kuitenkin helppo ymmärtää. Pelkistetyn yksinkertaisen sivun html-koodi voisi olla vaikkapa seuraavanlainen:

  <!DOCTYPE html>
<html>
<body>

<h1>Otsikkotaso 1</h1>
     <h2>Otsikkotaso 2</h2>
         <p>Ensimmäinen tekstipätkä</p>
     <h2>Toinen otsikkotaso 2</h2>
         <p>Toinen tekstipätkä ja linkki osoitteeseen <a href=”https://www.dataurakointi.fi”>Dataurakointi.fi</a></p>
     
</body>
</html>


HTML-koodi on järjestelty "tägien" (engl. tag) avulla. Esimerkiksi <p> -tägin sisällä on kappale, ja <h1> -tägin sisällä ykköstason otsikko. Tägit luovat sivustolle hierarkian, jonka avulla sivustosta voidaan tulkita tiettyjä osia tai kokonaisuuksia.

HTML-koodi saadaan käyttöön lataamalla sivu esimerkiksi pythonin
requests-kirjaston avulla. Vastaavasti tiedon hakuun sivulta voidaan käyttää BeautifulSoup4 -kirjastoa. Esimerkkikoodistamme voitaisiin koodilla hakea esimerkiksi:
- Kaikki otsikot (esimerkissämme h1 ja h2)
- Kaikki tason 2 otsikot (h2)
- Kaikki tekstit, jotka ovat toisen tason 2 otsikon jälkeen
- Kaikki linkit, jotka voidaan avata ja hakea tiedot sieltä.
- jne.


Javascript-sivu haltuun -
Selenium


Edellisestä lähestymistavasta seuraa ongelmia silloin, kun web-sivu luo osan sisällöstä javascriptin avulla. Tällöin käyttämällä requests-kirjastoa ei koko sivustoa saada käyttöön. Ongelma voidaan kiertää useallakin tavalla, joista yksi on käyttää Selenium-kirjastoa. Seleniumin avulla voidaan matkia nettiä selaavaa ihmistä, jolloin myös javascriptillä toteutettu koodi latautuu kokonaisuudessaan.

Javascriptillä saattaa olla toteutettu myös erilaisia listauksia, jotka on lajiteltu omille sivuilleen. Tällöin sivunvaihtolinkit eivät sisällä mitään webbiosoitteita, jotka voitaisiin avata tiedonhakua varten. Sen sijaan joudumme ohjelmallisesti klikkaamaan linkkiä, jotta saamme seuraavan sivun tiedot näkyviin.

Jotkut tiedot saattavat ilmestyä näkyviin, kun hiirtä pitää jonkin kohteen päällä. Seleniumilla voidaan ohjelmallisesti toteuttaa tällainenkin ratkaisu.

Käytännössä Selenium on itselleni se tapa, jolla saadaan haettua nekin datat, joihin ei muuten päästä käsiksi.


Kikkailulla tehot tappiin - Ajax-kutsut


Javascriptillä toteutetut sivustot hakevat nettisivuilla esitettävät tiedot tietokannastaan erilaisilla kutsuilla. Kutsu palauttaa tietokannasta tarvittavat tiedot sivulle. Näitä kutsuja pystyy tutkimaan itse vaikkapa Firefox-selaimen Web developer toolsien avulla. Ajatuksena on toteuttaa kutsu itse samalla tavalla ohjelmallisesti, ja saada kutsun tiedot valmiiksi organisoidussa muodossa käyttöön.

Tämä on parhaimmillaan hyvin tehokas tapa hakea tietoa, mutta ei välttämättä aina onnistu.


Tee itse tai jätä ammattilaiselle


Yllä olevien tekniikoiden kokeilu ja käyttö on parhaimmillaan mukavaa puuhaa. Voit kuitenkin jättää homman myös ammattilaiselle, joka valitsee jokaiseen käyttötarkoitukseen sopivan tekniikan.


Tekijä Jouni Lapinkangas 31. heinäkuuta 2024
Hei, arvoisa kävijä! Dataurakointi.fi on nyt perustettu. Palvelun tarkoitus on saattaa internetin hajautettu, ja huonosti organisoitu tieto sinulle hyödylliseen formaattiin automatiikkaa käyttäen. Teen ohjelmakoodeja, jotka toteuttavat tiedonhaku-urakan huomattavasti vähemmällä työpanoksella kuin ihminen. Sinä taas säästät huomattavan määrän aikaa ja vaivaa. Olen kokenut tuskasi Dataurakointi.fin taustalla on oma ongelmani, jota lähdin itse ratkaisemaan vuosia sitten: harrastin vedonlyöntiä, ja halusin analysoida ottelutuloksia sekä -tilastoja. Tähän ei riittänyt kuitenkaan pelkkä näkymä pelaajan x edellisten otteluiden tuloksista, vaan halusin paljon laajemman tietopohjan, joka mahdollistaisi erilaisten koneoppimismallien ajamisen. Käytännössä minun siis piti saada joltain internet-sivuilta tuloksia talteen järkevässä muodossa, ja koota niistä jokin tietokannan tapainen. Taustana minulla oli jonkin verran kokemusta Excelin ja niiden makrojen pyörittelystä, ja lähdin liikkelle tietynlaisella välimallilla. Saatoin kopioida tuloksia suoraan internet-sivulta Exceliin ja sitten siistiä niitä jollain makrolla. Tämä kieltämättä oli huomattavasti tehokkaampaa kuin pelkästään naputella tietoja käsin. Käsin naputteluakin kyllä tuli harrastettua. Python-koodi voittaa välimallin ratkaisut Joitakin vuosia sitten maailmani kuitenkin kirkastui: aloin opetella python-ohjelmointikieltä ja ymmärsin, että pythonin eri kirjastoilla pystyisi toteuttamaan ”web scrapingia”. Termi kääntyy suomeksi esimerkiksi ”kaavinnaksi”, mutta käytän yleensä itse englanninkielistä termiä. Web scraping tarkoittaa automatisoitua datan hakemista verkkosivuilta ja sen muutosta sopivaan formaattiin. Käytännössä siis vaikkapa 10 000 jalkapallo-ottelua, jotka ovat hajallaan sivustolla tai sivustoilla tuodaan yhteen excel-taulukkoon, csv-tiedostoon, json-tiedostoon tai tietokantaan. Näin tiedosta on paljon enemmän hyötyä ja siitä pystytään tekemään analyysia. Lopulta monien opettelutuntien jälkeen minulla oli ohjelma, jonka jätin työstämään aiemmin itse tekemiäni hommia: tässä todella tehostettiin tuotantoa rankalla kädellä! Anna minun hakea datat, keskity ydinosaamiseesi Web scraping on minusta hauskaa ja hyödyllistä: miksi en siis tarjoaisi oppimiani niksejä sinunkin hyödyksesi? Ole rohkeasti yhteydessä ja kerro mitä tarvitset: selvitetään voisiko osaamisestani olla hyötyä sinullekin.
Share by: