Priručnik za data novinarstvo 1.0
Loading

Nalaženje podataka na internetu

Sve ste pokušali, ali niste uspjeli naći podatke koji vas interesuju. Našli ste podatke na internetu, ali se ne mogu downloadovati niti ih možete prekopirati. Ne brinite, možda ipak postoji način da ih izvučete. Naprimjer, možete uraditi sljedeće:

  • Preuzmite podatke iz API interfejsa za web, kao što su interfejsi koje pružaju online baze podataka i mnoge moderne web aplikacije (uključujući Twitter, Facebook i mnoge druge). Ovo je odličan način da pristupite vladinim ili komercijalnim podacima, kao i podacima sa društvenih medija.

  • Ekstraktujte podatke iz PDF-ova. Ovo je veoma teško jer PDF je jezik za printere i ne sardrži mnogo informacija o strukturi podataka koji se nalaze u dokumentu. Ekstraktovanje podataka iz PDF-a bi prevazišlo okvire ove knjige, ali postoje neki alati i tutorijali koji bi vam u tome mogli pomoći.

  • Scraping sajtovi. Kada "stružete" podatke, vi ekstraktujete struktuirani sadržaj sa normalne web stranice uz pomoć alata za scraping ili pisanjem kratkog koda. Ova metoda je veoma moćna i može se koristiti u puno situacija, ali isto tako zahtijeva određeno poznavanje toga kako internet funkcioniše.

Uz sve te odlične tehničke opcije, ne zaboravite onu jednostavnu: često se isplati odvojiti vrijeme i tražiti dokument koji sadrži mašinski čitljive podatke ili nazvati instituciju koja ima podatke koje tražite.

U ovom poglavlju prolazimo kroz najosnovije primjere izvlačenja podataka sa HTML web stranica.

Šta su mašinski čitljivi podaci?

Cilj većine ovih metoda je pristupiti mašinski čitljivim podacima. Ti podaci se prave kako bi ih procesuirao kompjuter, a ne za prezentaciju ljudskom korisniku. Struktura takvih podataka je povezana sa informacijama koje sadrži, a ne sa tim kako će se na kraju ti podaci prikazati. Neki od formata koji su mašinski čitljivi su CSV, XML, JSON i Excel files, dok su formati kao što su Word dokumenti, HTML stranice i PDF fajlovi više okrenuti ka vizuelnom izgledu informacija. Naprimjer, PDF je jezik koji komunicira direktno sa vašim printerom, tako da su za njega bitne pozicije linija i tačaka na stranici, a ne sami karakteri.

Scraping web sajtova: zašto?

Svi su ovo nekad uradili: otišli na neki web sajt, vidjeli interesantnu tabelu i pokušali je kopirati na Excel kako bi dodali neke brojeve ili je spasili za kasnije. Međutim, ovo se često ne može izvesti, ili se informacije koje vas interesuju nalaze na više web sajtova. Ručno kopiranje može brzo dosaditi, pa je logično rješenje da se za to napiše kratki kod.

Prednost "struganja" je u tome što ga možete obaviti sa skoro bilo kojim web sajtom – od vremenske prognoze do vladinih troškova, čak i ako taj site nema API za pristup sirovim podacima.

Šta možete, a šta ne možete strugati

Naravno, postoje ograničenja kada je ova metoda u pitanju. Neki od otežavajućih faktora su sljedeći:

  • Loše formatiran HTML kod koji sadrži malo ili nimalo strukturnih informacija (npr. na starijim vladinim web stranicama).

  • Sistemi provjeravanja autentičnosti koji trebaju spriječiti automatski pristup, kao npr. CAPTCHA kodovi i zahtjevi za plaćanjem sadržaja.

  • Sistemi bazirani na sesijama koji koriste cookies kako bilježili šta je korisnik sve radio

  • Nedostatak kompletnog listinga pojmova i mogućnosti za proširenu pretragu (korištenje ˝?˝ ili ˝*˝umjesto nekih slova)

  • Blokiranje prevelikog broja korisnika koji pokušavaju pristupiti sajtu od strane administratora servera.

Drugi set prepreka čine pravne prepreke: neke zemlje priznaju prava zaštite baza podataka, što bi moglo ograničiti vaše pravo da ponovo koristite informacije koje su objavljene online. Ponekada možete odlučiti da ignorišete licencu i iskoristiti podatke – u zavisnosti od pravosudnog sistema, kao novinar možete imati posebna prava. Korištenje slobodnih vladinih podataka bi trebalo biti dozvoljeno, ali biste trebali dobro provjeriti prije nego ih objavite. Komercijalne organizacije – a naročito nevladine organizacije – su manje tolerantne i možda će pokušati tvrditi da ˝sabotirate˝ njihove sisteme. Drugi podaci mogu narušiti privatnost određenih individua i time narušiti i zakone o privatnosti podataka ili profesionalni etički kodeks.

Spajanje, ekstrakcija, prikupljanje, čišćenje.

Izazov kod velikih količina podataka u Velikoj Britaniji nije doći do njih - već doći do njih u formatu koji možete koristiti. Mnogo podataka o troškovima za goste, vanjskim interesima parlamentaraca, lobiranju i slično se redovno objavljuje ali u obliku koji je veoma teško analizirati.

Da bi se dobilo više informacija, jedini put je teški rad: sastavljanje desetina Excel fajlova, od kojih svaki sadrži desetine podataka, jedini je način da se dođe do jasne liste ministarskih sastanaka. Ali za druge informacije, "scraping" se pokazao izuzetno korisnim.

Korištenje servisa kao što je ScraperWiki da pronađemo programere koji će kreirati program za izvlačenje informacija kao što je registar interesa parlamentaraca odradilo je pola posla za nas: imali smo informacije o zastupnicima u jednoj tabeli, spremne za (dugi) proces analize i čišćenja podataka.

Servisi poput ovog (ili alati kao što je Outwit Hub) od velike su pomoći novinarima koji pokušavaju prikupiti zbrkane podatke a sami ne znaju programirati.

James Ball, the Guardian

Alati koji vam mogu pomoći sa ekstraktovanjem podataka

Postoje mnogi programi koji se mogu koristiti za ektraktovanje ogromnih količina informacija sa web sajta, uključujući i dodatke za browsere i neke web servise. U zavisnosti od vašeg browsera, alati kao što su Readability (koji pomažu ekstraktovanje sa stranica) ili DownThemAll (koji vam dozvoljava da istovremeno downloadujete mnoge fajlove) će vam pomoći da automatizujete neke dosadne zadatke, dok je Chromeov Scraper dodatak napravljen upravo za ekstraktovanje tabela sa web sajtova. Ekstenzije za programere kao što je FireBug (za Firefox, a ista stvar je već uključena u Chrome, Safari i IE) vam dozvoljava da saznate kako je neki web sajt struktuiran i koje komunikacije se odvijaju između vašeg browsera i servera.

ScraperWiki je web sajt koji vam omogućava da kodirate softvere za ekstrakciju kvantitativnih podataka na nekoliko različitih programskih jezika, uključujući Python, Ruby i PHP. Ukoliko želite početi skidati podatke i izbjeći pripreme za programiranje na vašem kompjuteru, onda je ovo sajt za vas. Druge web usluge, kao što su Google Spreadsheet i Yahoo! Pipes, vam također dozvoljavaju da obavite neke ekstrakcije sa web sajtova.

Kako radi softver za ekstrakciju podataka (web scraper)?

Softveri za ekstrakciju podataka sa weba su obično kratki kodovi napisani na programskom jeziku poput Python, Ruby ili PHP. Odabir odgovarajućeg jezika uglavnom zavisi od toga kojoj zajednici imate pristup: ukoliko neko u vašoj redakciji ili gradu već radi sa jednim od ovih jezika, onda bi bilo logično da se odlučite za isti jezik.

Iako su neki od ranije pomenutih alata koji rade na principu ´pokaži i klikni´ korisni za početak, najkompleksniji dio zadatka kada je ekstrakcija podataka u pitanju je adresiranje pravih stranica i pravih elemenata unutar tih stranica kako bi se ekstraktovale željene informacije. Ovi zadaci nisu vezani za programiranje, već za razumijevanje strukture web sajta i baze podataka.

Kada prikazuje neki web sajt, vaš browser će skoro uvijek koristiti dvije tehnologije: HTTP, preko kojeg komunicira sa serverom i zahtijeva određeni izvor kao što su dokumenti, slike ili video zapisi; i HTML, jezik na kojem su napravljeni web sajtovi.

Anatomija web stranice

Svaka HTML stranica se sastoji od hijerarhijski poredanih elemenata (koje definišu HTML ˝tagovi˝). Jedan veliki element sadrži mnogo manjih – naprimjer, tabela se sastoji od mnogo dijelova: redova i ćelija. Postoje mnoge vrste tagova koji obavljaju različite funkcije – neki proizvode elemente, a drugi tabele, slike ili linkove. Tagovi mogu imati i dodatna svojstva (npr. mogu biti jedinstveni identifikatori) i mogu pripadati grupama poznatim kao ´klase´ što omogućava pronalazak pojedinačnih elemenata unutar dokumenta. Ovakav odabir odgovarajućih elemenata i ekstraktovanje njihovih sadržaja je ključno za pisanje programa za skidanje podataka.

Pregledanje elemenata web stranice: sve se može rastaviti na elemente unutar elemenata.

Kako biste skidali podatke sa web stranica, trebate naučiti nešto o različitim vrstama elemenata koji se mogu naći u HTML dokumentu. Naprimjer, element <table> obuhvata cijelu tabelu koja sadrži <tr> (table row, red tabele) elemente za njene redove, koja dalje sadrži <td> (table data, podaci u tabeli) za svaku ćeliju. Najčešća vrsta elementa sa kojom ćete se susresti je <div>, koji se u suštini može odnositi na bilo koji blok elemenata. Najlakši način da razumijete ove elemente je pomoću alatne trake u vašem browseru: oni će vam pomoći da pretražujete bilo koji dio web stranice i otkrijete koji se kod ispod toga krije.

Tagovi funkcionišu kao korice knjige jer bilježe početak i kraj neke cjeline. Naprimjer, <em> označava početak kosog ili naglašenog dijela teksta, a </em> označava kraj tog dijela. Jednostavno.

Primjer: struganje podataka o nuklearnim nesrećama koristeći Python

NEWS je portal Međunarodne agencije za nuklearnu energiju (IAEA) o nesrećama sa radioaktivnim materijalom širom svijeta (i ozbiljan kandidat za članstvo u svjetskom klubu čudnih naziva!). Ova web stranica sadrži podatke o nesrećama na jednostavnom sajtu nalik na blog sa kojeg se podaci mogu lako skinuti.

Figure 4. Portal Međunarodne agencije za nuklearnu energiju (IAEA) (news.iaea.org)

Za početak, kreirajte novi Python strugač na ScraperWikiju i dobit ćete prostor za tekst koji će uglavnom biti prazan i sadržavat će samo neke osnovne kodove. U novom prozoru otvorite IAEA sajt i u svom browseru otvorite traku sa alatima. U dijelu ˝Elements˝ potražite HTML element za jedan od naslova vijesti. Alatna traka vašeg browsera vam pomaže da elemente na toj web stranici povežete sa HTML kodom koji stoji iza svega.

Kada pregledate ovu stranicu, vidjet ćete da su naslovi <h4> elementi unutar neke tabele (<table>). Svaki događaj je <tr> red koji također sadrži opis i datum. Ukoliko želimo ekstraktovati naslove svih događaja, trebamo smisliti kako da odaberemo sve redove u tabeli sekvencijalno i da istovremeno obuhvatimo i sav tekst unutar elemenata naslova.

Kako bismo ovaj proces pretvorili u kod, moramo biti svjesni svih koraka koji se trebaju preduzeti. Da biste razumjeli koji koraci su neophodni, igrat ćemo se jedne igre: u vašem ScraperWiki prozoru pokušajte napisati pojedinačne upute za sebe, za svaki korak koji ćete preduzeti dok budete pisali ovaj kod za ekstrakciju podataka, kao da pišete recept (prije svake linije stavite znak rešetku kako biste Pythonu naglasili da to nije pravi kompjuterski kod). Naprimjer:

# Potražiti sve redove u tabeli
# Unicorn ne smije prelaziti na lijevoj strani.

Pokušajte biti precizni što je više moguće i nemojte pretpostaviti da program zna išta o stranici sa koje pokušavate skinuti podatke.

Kada napišete tu imitaciju koda, uporedite to sa osnovnim kodom za naš prvi softver za ekstrakciju podataka:

import scraperwiki
from lxml import html

U prvom dijelu, importujemo postojeće funkcije iz biblioteka – dijelova unaprijed napisanog koda. ScraperWiki će nam omogućiti da downloadujemo web sajtove, dok lxml služi kao alat za strukturnu analizu HTML dokumenata. Slijede dobre vijesti: ukoliko sastavljate kod u Pythonu pomoću ScraperWikija, ove dvije linije će uvijek biti iste.

url = "http://www-news.iaea.org/EventList.aspx"
doc_text = scraperwiki.scrape(url)
doc = html.fromstring(doc_text)

Dalje, kod će napraviti ime (varijablu): url i dodijelit će URL IAEA stranice kao svoju vrijednost. Ovo scraperu govori da tako nešto postoji i da na to želimo obratiti pažnju. Primijetit ćete da je sam URL unutar navodnih znakova jer on nije dio koda programa, već string, niz karaktera.

Dalje url varijablu koristimo kao input za funkciju scraperwiki.scrape. Funkcija će omogućiti neki definisani zadatak – u ovom slučaju će downloadovati web stranicu. Kada završi, output će dodijeliti nekoj drugoj varijabli, doc_text. doc_text će sada sadržavati sam tekst web stranice – ne vizuelni izgled koji vidite u svom browseru, već izvorni kod, zajedno sa svim tagovima. Pošto ovaj format nije lako rašćlaniti, koristit ćemo drugu funkciju, html.fromstring, da generiramo poseban prikaz u kojem lako možemo adresirati elemente, takozvani Document Object Model (DOM).

for row in doc.cssselect("#tblEvents tr"):
link_in_header = row.cssselect("h4 a").pop()
event_title = link_in_header.text
print event_title

U ovom završnom koraku ćemo koristiti DOM kako bismo našli sve redove u našoj tabeli i ekstraktovali naslove događaja iz njenog zaglavlja. Koriste se dva nova koncepta: "for loop" i selektovanje elemenata (.cssselect). "For loop" prolazi kroz spisak pojmova dodjeljujući svakome privremeni alias (u ovom slučaju row) i onda nad svakim provodi zadate instrukcije.

Drugi novi koncept, selektovanje elemenata, koristi poseban jezik kako bi našao elemente u dokumentu. CSS selektori se obično koriste kako bi dali informacije o izgledu HTML elementima i mogu se koristiti za precizan odabir elementa na nekoj stranici. U ovom slučaju (line 6) selektovat ćemo #tblEvents tr koji će <tr> elemente unutar elemenata tabele spojiti sa ID tblEvents (rešetka predstavlja ID). Napominjemo da će ovo izbaciti listu <tr> elemenata.

Kao što se može vidjeti u sljedećoj liniji (line 7), gdje primjenjujemo drugi selektor kako bismo našli sve <a> (hiperlinkove) unutar svih <h4> (naslovi). Ovdje tražimo samo pojedinačne elemente (samo je jedan naslov u svakom redu), tako da ga moramo izbaciti sa liste koju nam izbaci naš selektor koristeći funkciju .pop().

Primijetit ćete da neki elementi u DOM-u sadrže tekst, odnosno tekst koji nije dio nekog jezika za označavanje i kojem možemo pristupiti koristeći sintaksu [element].text koju vidimo u liniji 8. Konačno, u liniji 9, taj tekst nanosimo na ScraperWiki konzolu. Ukoliko na svom scraperu pritisnete run, manji prozor bi trebao početi izlistavati imena događaja sa IAEA web stranice.

Figure 5. Scraper u akciji (ScraperWiki)

Sada možete vidjeti osnovni scraper u akciji: on downloaduje web stranicu, transformiše je u DOM format i zatim vam omogućava da odaberete i ekstraktujete određeni sadržaj. Sa ovim kosturom, možete pokušati riješiti neke od preostalih problema koristeći ScraperWiki i Python dokumentaciju:

  • Da li u naslovu svakog događaja možete naći adrese za linkove?

  • Možete li odabrati mali element koji sadrži datum i mjesto uz pomoć njegovog CSS imena i ekstraktovati tekst tog elementa?

  • ScraperWiki nudi malu bazu podataka za svaki scraper tako da možete pohraniti rezultate; kopirajte odgovarajući primjer iz njihovih dokumenata i adaptirajte ga tako da spasi naslov, linkove i datum događaja.

  • Lista događaja ima mnogo stranica; da li možete ekstraktovati podatke sa više stranica kako biste dobili i prošle događaje?

Dok se pokušavate izboriti sa ovim koracima, pregledajte ScraperWiki: u već postojećim scraperima se nalaze mnogi korisni primjeri – a i sami podaci su često i uzbudljivi. Tako da ne morate svoj scraper započinjati od samog početka: jednostavno odaberite jedan koji je sličan, preuzmite ga i prilagodite svom problemu.

Friedrich Lindenberg, Open Knowledge Foundation

Scraping javne baze podataka

Neki francuski doktori mogu odrediti vlastite cijene, tako da vas 30-minutna posjeta onkologu, naprimjer, može koštati između 70 i 500 eura. Podaci o ovim cijenama su po zakonu javni, ali su objavljeni u online bazi podataka u kojoj se veoma teško snaći. Da bih za Le Monde napravio dobar pregled, odlučio sam "sastrugati" cijelu ovu bazu podataka.

Tu je postalo zabavno. Polje za pretragu na početnoj stranici je bila Flash aplikacija koja vodi na stranicu u HTML-u preko POST zahtjeva. Uz pomoć Nicolasa Kayser-Brila, trebalo mi je neko vrijeme da shvatim da aplikacija koristi treću stranicu kao "skriveni" korak između polja za pretrage i stranice sa rezultatima. Ova stranica je zapravo korištena da se spase cookie podaci o vrijednostima pretrage, nakon čega bi im pristupila i stranica sa rezultatima. Teško je zamisliti zamršeniji proces, ali opcije koje nudi cURL PHP biblioteka jednostavno prevazilaze ove prepreke - jednom kad shvatite gdje su! Na kraju je za skidanje kompletne baze podataka trebalo 10 sati, ali vrijedilo je.

Alexandre Léchenet, Le Monde