Adatgyűjtés web scraping technikával
Előfordulhat, hogy szükségünk van nagyobb adatmennyiségre, amit kézzel összeszedni időrabló, reménytelen vállalkozás. Ha amúgy nyílt adatbázisban, valamilyen weboldalon elérhetőek a kívánt adatok, akkor össze is lehet őket gyűjteni. A nem direkt lekérdezős, weboldalon keresztüli módszert nevezik web scraping technikának. Én időjárási adatokat szerettem volna összeszedni, amit a Weather Underground oldalon meg lehet találni. Az oldalnak nagyszerű tulajdonsága, hogy bárki csatlakozhat hozzá, s visszamenőleg is meg lehet nézni a különböző értékeket akár évekre visszamenőleg is.
Első lépésként meg kell találnunk azokat az adatokat, amikre szükségünk van, s ez nem is mindig egyszerű. A példánknál maradva ha kiválasztunk egy helyszínt, aminek az aktuális időjárására kíváncsiak vagyunk, akkor több környező állomás értékeit is megnézhetjük, kiválaszthatjuk a nekünk tetszőt. Igen ám, de ha ezután mi rákattintunk a linkre, ami a korábbi adatokhoz vinne (HISTORY fül), akkor az oldal tervezési sajátsága miatt a legközelebbi reptér időjárás állomására fog átugrani és annak az adatait megjeleníteni. Az oldal súgójában megtaláljuk a megoldást, kattintsunk a időjárás állomás nevére, s akkor bejön annak az állomásnak a saját oldala, s ott már nézegethetjük az adott állomás korábbi adatait.
Itt kezdhetnénk el játszani és kézzel kimentegetni az oldalon lévő táblázatot, de ehelyett nyúljunk kicsit mélyebbre! Ha megnyitjuk a böngészőnk fejlesztői paneljét, akkor vizsgálódhatunk, hogy mi történik a háttérben. A fejlesztői panel hálózat ablakában elkaphatjuk a forgalmat, amit az oldal bonyolít, s felfedezhetjük, hogy az oldal különböző API hívásokat küldözget, amikre rendre JSON formában kap választ és azok között kis kutatás után meg is találhatjuk a táblázatunkat.
A kérés fejlécét megnézve láthattuk, hogy GET kérésről van szó, így kipróbálhatjuk böngészőben meghívva mi történik. Az URL-t a böngészőnkben betöltjük, akkor láthatjuk, hogy szépen megérkezik a JSON fájl válaszként. Ezt kihasználva vizsgálódhatunk tovább, vajon hogyan is épül fel a kérdéses URL.
https://api.weather.com/v2/pws/history/all?stationId=IDUNAK31&format=json&units=m&date=20231212&numericPrecision=decimal&apiKey=e1f10a1e78da46f5b10a1e78da96f525
Ebből négy fontos változónk van:
- stationId: az állomás azonosítója
- format: JSON, vagy XML formátumban kérjük a választ
- units: metrikus (m), vagy angolszász (e) mértékegységeket használjon
- date: melyik napra vagyunk kíváncsiak
Ahhoz, hogy ne csak egy állomást tudjunk lekérdezni, szükség van az állomások azonosítóira. Ezt az oldal térképén lépkedve lehet megtalálni, s szintén egy kis webes kapirgálás kell hozzá... Az így talált URL felépítése sem túl bonyolult, csak pár apróságra kell odafigyelni.
https://api1.weather.com/v2/vector-api/products/614/features?x=1115&y=708&lod=12&apiKey=e1f10a1e78da46f5b10a1e78da96f525&tile-size=512&time=1704699000000-1704699900000:5&stepped=true
- x,y koordináták: a térkép aktuális szeletkéje
- lod: nagyítási szint
- time: az aktuális időponthoz legközelebb eső 15perces intervallum 0 másodperccel UNIX időformátumban
Magyarország esetén 12-es nagyítási szinten a megtalált téglalapomban kb. 1700 időjárás állomás vallja magát magyarnak.
Ha mindent összerakunk, akkor már csak a kapott JSON fájlok feldolgozása van hátra, amit csak azért kell megtenni, mert a kapott fájlokat direktben nem tudom megetetni a QGIS programmal. Ez a szoftver CSV fájlokat viszont remekül kezel, így a megoldás, egy plusz konverzió.
A feladathoz én a Windows-ba beépített Powershell környezetet választottam, abban készítettem el a szkriptet, ami a mostani változatban teljes Magyarország területére vonatkozóan letölti a kiválasztott kezdőnaptól kezdve a megadott mennyiségű napi adatokat, majd a futtató mappába napokra bontott CSV fájlokat készít. Egy ilyen CSV fájl 5 perces bontásban tartalmazza az adott nap minden kiválasztott időjárás állomásának összes mért adatát, így megközelítőleg 100 megabájtos fájlok jönnek létre. Egy-egy nap nálam 20-23 perc alatt készült el.