Amikor a főnököd megkérdezi figyelje a versenytársak árait, elemezze a véleményeket, vagy gyűjtsön adatokat több száz oldalrólA manuális másolás és beillesztés már nem lehetséges. Szükséged van egy olyan módszerre, amellyel automatizálhatod az információk kinyerését anélkül, hogy megőrjítenéd magad, vagy órákat pazarolnál ismétlődő feladatokra.
A Python ökoszisztémában a két eszközről fogsz a legtöbbet hallani ehhez: GyönyörűLeves és SzelénAz egyik kiválóan elemzi a HTML-t gyorsan és egyszerűen; a másik képes megnyitni egy valódi böngészőt, futtatni JavaScriptet, kattintani, űrlapokat kitölteni és emberi felhasználóként viselkedni. A kulcs a jó megértés. Mikor kell mindegyiket használni, és hogyan kombinálhatóak hogy a legtöbbet hozhassuk ki belőlük.
Mi az a web scraping, és mikor van értelme használni?
A webes adatgyűjtés nem más, mint weboldalakról történő adatkinyerés folyamataMeg lehet csinálni másolással és beillesztéssel, de ahogy az információ mennyisége növekszik, érdemesebb szkriptekre vagy automatizált eszközökre hagyatkozni, amelyek végigmennek az oldalakon, és elmentik az érdeklődési körünket.
Kaparással lehet Terméklisták és árak, hírek, vélemények, hozzászólások és közösségi média bejegyzések összeállítása vagy gyakorlatilag bármilyen tartalom, amely nyilvánosan elérhető az interneten. Lényegében ez az előzetes lépés számos adatelemzési, gépi tanulási vagy feladatautomatizálási projekthez.
Azonban fontos tisztában lenni azzal, hogy mikor érdemes a kaparást alkalmazni. utolsó lehetőség, nem az elsőHa az oldal már kínál egy jól dokumentált hivatalos API-t, általában jobb azt használni: stabilabb, általában egyértelmű használati korlátokkal rendelkezik, és csökkenti a hibák vagy a szolgáltatási feltételek megszegésének kockázatát.
A kaparászás akkor kezd értelmet nyerni, amikor Nincs API, az API hiányos, vagy olyan adatokra van szükséged, amelyek csak a webes felületen jelennek meg., például beágyazott megjegyzések, rangsorolások, kis címkék vagy dinamikusan generált tartalomblokkok.
Fontos különbséget tenni két gyakran összekevert fogalom között is: webes adatgyűjtés és webfeltérképezésA scraping (adatgyűjtés) konkrét adatok kinyerésére összpontosít bizonyos oldalakról; a feltérképezés ezzel szemben a következőkre összpontosít: egy webhely vagy a teljes web szerkezetének feltárása és feltérképezéselinkek követésével, akárcsak a keresőmotorok a tartalom indexelésével.
Jogi és etikai szempontok: amit nem szabad figyelmen kívül hagyni
Mielőtt meggondolatlanul belevágnál a kaparóba, érdemes egy pillanatra elgondolkodni azon, jogi, technikai és etikai vonatkozásokSaját weboldalad vagy egy tudományos projekt lemásolása nem ugyanaz, mint egy kereskedelmi szolgáltatás létrehozása mások adatai alapján.
Az első dolog, amit ellenőrizned kell, hogy vagy-e az ország vagy régió jogszabályainak betartásaAz olyan kérdések, mint az adatvédelem, a magánélet védelme és a személyes adatok felhasználása, helyenként jelentősen eltérhetnek, ezért nem jó ötlet figyelmen kívül hagyni őket. Ha érzékeny vagy azonosítható adatokkal fogsz dolgozni, érdemes konzultálni egy olyan személlyel, aki jártas a technológiai jogban.
A következő lépés annak ellenőrzése, hogy a webhely rendelkezik-e felhasználási feltételek, amelyek tiltják a kaparástSok portál Általános Szerződési Feltételeiben külön záradékokat talál az automatizált adatkinyerésre, az információk kereskedelmi célú felhasználására vagy bizonyos részek jogosulatlan elérésére vonatkozóan.
Van egy kulcsfontosságú dolog, amit szinte mindig meg kell nézned: a fájl robots.txtA domain gyökerében találod, valami ilyesmit https://www.ejemplo.com/robots.txtOtt a tulajdonos jelzi, hogy mely útvonalakat nem szeretné feltérképezni vagy indexelni, például olyan utasításokon keresztül, mint például helytelenít útvonalak blokkolására vagy Feltérképezési késleltetés hogy minimális késés legyen a kérések között.
Ezen irányelvek tiszteletben tartása nemcsak etikai kérdés, hanem egy módja is annak, Ne terhelje túl a szervert másodpercenként több száz kéréssel.Egy rosszul megtervezett adatgyűjtő hasonlíthat egy szolgáltatásmegtagadási támadásra, és ez amellett, hogy nem elegáns, problémákat is okozhat.
Végül kérdezd meg magadtól, hogy Az adatok felhasználásának szándéka ésszerű.Újra fogod terjeszteni őket jelenlegi állapotukban? Kevered őket más forrásokkal? Belső projekthez vagy információk viszonteladásához használod? Ezek a kérdések nagyban befolyásolják a kockázatokat és azt, hogy hogyan tervezd meg a megoldásodat.
Hogyan töltődik be valójában egy weboldal: HTML, CSS, JavaScript és iframe-ek
A hatékony adatgyűjtéshez elengedhetetlen megérteni, hogy mit lát a szkripted, amikor kérést küld. Ideális esetben a szervertől kapott oldal már tartalmazná a következőt: az összes HTML-kód az Önt érdeklő tartalommalA böngésző pedig csak annyit tenne, hogy CSS-sel formázza meg, és egy kis interaktivitást ad hozzá JavaScripttel.
A valóság kevésbé szép: sok modern weboldal JavaScript használatával késleltetett adatokat töltenek be, és harmadik féltől származó tartalmakat ágyaznak be iframe-ekkel. vagy menet közben átírják a DOM-ot. Ha megnyitod a böngésző klasszikus „Forrás megtekintése” menüjét, néha nyomát sem láthatod a képernyőn megjelenő megjegyzéseknek, számlálóknak vagy dinamikus blokkoknak.
Tipikus példa erre a kommentelő rendszerek, mint például DisqusAz eredeti HTML egyetlen sornyi megjegyzést sem tartalmazhat, de a böngésző által generált végső DOM tartalmazhat egyet. JavaScript által létrehozott iframe ahová a teljes szál betöltődik. Ha megpróbálod statikusan lemásolni az oldalt, akkor egy „nyomorított” HTML-t kapsz.
Az ilyen típusú forgatókönyvekben a stratégia magában foglalja szimulálja a valódi böngésző működésétTöltsd be az oldalt, hagyd lefutni a JavaScriptet, várd meg, amíg megjelennek a téged érdeklő elemek, és csak ezután csomagold ki a tartalmat. Itt jön képbe a Selenium.
Statikus adatgyűjtés kérésekkel és BeautifulSoup-pal
Amikor a szükséges tartalom már szerepel a kezdeti HTML-ben (tipikus termék, hírek, egyszerű táblázatok, statikus listák), a leghatékonyabb megközelítés általában a következő használata: HTTP-kérés végrehajtására és a BeautifulSoup HTML-elemzésére vonatkozó kérésekKlasszikus pár a könnyű és gyors kaparáshoz.
Az alapfolyamat egyszerű: először küldesz egy kérést a kérések.get(url) és elemzed a választ. A kezében lévő tárgyat megnézheted az állapotkód a status_code paraméterrel, a szöveges tartalom a text paraméterrel, vagy a bináris tartalom a content paraméterrel, a fejlécek és a végső URL-ek vizsgálata mellett, hogy jobban megértsük, mit ad vissza a szerver.
Miután megvan a HTML, átadod a BeautifulSoupnak, általában valami ilyesmivel: BeautifulSoup(html, "html.parser")Az elemző fa struktúrába bontja a szöveget, ami sokkal kényelmesebb a címkék, attribútumok és beágyazott tartalom kereséséhez.
Ezzel a leves objektummal most olyan metódusokat használhatsz, mint a keresés, összes_keresés vagy kiválasztás meghatározott csomópontok megtalálásához: például az összes amelyek oktatóanyagokat, egy táblázat sorait, egy hírrovat linkjeit tartalmazzák vagy az oldal bármely olyan része, amely kellően koherens HTML-struktúrával rendelkezik.
Egy tipikus példa erre egy digitális újságkaparó beállítása, mint például a 12. oldal. Kérést intézhet a címlaphoz, elemezd a szekcióblokkokat, keresd meg a hírlinkeket És onnantól kezdve szisztematikusan navigálj, hogy megkapd a címsorokat, dátumokat, szövegtörzset, fő képeket és bármilyen más adatot, ami érdekel, szótárakba csomagolva azokat, amelyek készen állnak az adatbázisba való mentésre.
Ezekben a kaparókban célszerű logikát hozzáadni Hibakezelés try-except használatával Annak érdekében, hogy egyetlen hiba (megváltozott szerkezetű hír, sikertelen kérés, hiányzó címke) ne okozzon teljes folyamatot, az ilyen típusú projektek napi rutinjának része a specifikus kivételek észlelése, valamint annak eldöntése, hogy mikor kell figyelmen kívül hagyni a hibákat, és mikor kell leállítani.
Dinamikus adatgyűjtés Selenium segítségével: JavaScript, iframe-ek és felhasználói műveletek
Amikor a web mindenhez JavaScriptre támaszkodik, a statikus adatgyűjtés kudarcot vall. Ha a tartalom menet közben generálódik, akkor egy... mögé bújik. iframe, vagy csak gombokkal, űrlapokkal vagy dinamikus elemekkel való interakció után jelenik megSzükséged van egy igazi böngészőre, vagy egy headless böngészőre, ami végrehajtja ezt a logikát.
Itt mutatkozik meg a szelén izomerő-növelő hatása. A szelént eredetileg arra tervezték, hogy Webalkalmazások funkcionális tesztelésének automatizálásaDe a böngésző kezelésére való képessége – oldalak megnyitása, kattintás, beviteli mezők kitöltése, a tartalom betöltésére való várakozás – nagyon hatékony eszközzé teszi a dinamikus adatgyűjtéshez.
A Selenium lelke a WebDriver, egy olyan komponens, amely a kiválasztott böngészőt (Chrome, Firefox és mások) vezérli. Használatához a következőre van szükség: böngészőspecifikus illesztőprogram (geckodriver Firefoxhoz, chromedriver Chrome-hoz stb.), amelynek a rendszerből elérhető elérési úton kell lennie, általában a PATH környezeti változóban.
Az alapvető Python telepítés valami ilyesmivel történik pip telepítés szelénInnentől kezdve a szkriptedben létrehozol egy WebDriver példányt, például a következővel: webdriver.Firefox() vagy webdriver.Chrome()És most már úgy böngészhetsz, URL-eket nyithatsz meg, vagy interakcióba léphetsz az oldallal, mintha valódi felhasználó lennél.
Ami a böngésző típusát illeti, használhat teljes böngészőt grafikus felülettel, vagy böngészőt készenléti módban. fejetlenElméletben vannak alternatívák, mint például a PhantomJS, de a gyakorlatban sokan számoltak be inkompatibilitásokról és furcsa viselkedésről, ezért általában előnyösebb a... használd a Chrome-ot vagy a Firefoxot valós vagy fej nélküli módban a meglepetések csökkentése érdekében.
Miután az oldal betöltődött, a Selenium lehetővé teszi az elemek megtalálását a szelektorok széles választékának használatával: azonosító, név, osztály, CSS-szelektor vagy XPath alapjánMeghívhatsz olyan metódusokat, mint a keresett_elem vagy keresett_elemek és onnan indítson el olyan műveleteket, mint a kattintás, a kulcsok küldése vagy az egyes csomópontok látható szövegének lekérése.
Kombináld a Seleniumot és a BeautifulSoupot, hogy a legtöbbet hozd ki belőlük
Összetett webhelyek esetén a leghatékonyabb kombináció általában a következő: A Selenium kezeli az oldal betöltését, a JavaScript végrehajtását és a végső DOM előkészítését; a BeautifulSoup ezután elemzi a renderelt HTML-t és kinyeri az adatokat. a keresési funkciók minden kényelmével együtt.
Az általános minta egyszerű. Először inicializálja a WebDriver-t, majd töltse be az URL-t a következővel: driver.get() És ha szükséges, explicit várakozások használatával megvárod, amíg bizonyos kulcsfontosságú elemek megjelennek. Amikor biztos vagy benne, hogy a tartalom betöltődött, megkapod a Végső HTML a driver.page_source fájllal.
Ezt a HTML-t átadod a BeautifulSoupnak, akárcsak a statikus adatgyűjtésnél, hogy iteráljon. táblázatok, listák, cikkek, sorok vagy bármilyen ismétlődő szerkezetű blokkEz lehetővé teszi a Selenium szelektorok erejének kihasználását az oldal megfelelő részének eléréséhez, majd a BeautifulSoup rugalmasságát az adatok tiszta kinyeréséhez.
Az iframe-eket használó oldalakon, például a Disqus hozzászólásoknál, gyakran kell kontextus módosítása az adott iframe-re a tartalom kinyerése előtt. A Selenium segítségével megkeresheted az iframe-et – például azt, amelyik a konténerről lóg, és amelynek azonosítója disqus_thread –, használhatod a switch_to.frame függvényt, és miután bejutottál, megvárhatod, amíg az olyan elemek, mint a megjegyzésszámláló vagy a szövegblokkok betöltődnek.
Más esetekben, például tartalomgenerátoroknál, a kombináció még nyilvánvalóbb. Képzelj el egy Star Wars névgenerátort, amely lehetővé teszi, hogy olyanokat válassz, mint a Férfi, női vagy vegyes neveket szeretnél, és hányat szeretnél egyszerrePéldául kattintásonként 100 név. A Selenium gondoskodik a megfelelő opció kiválasztásáról (például a név="választás" és érték="100" értékű választógombról), a "Létrehozás" gombra kattintásról, és a névtábla összeállításának megvárásáról.
Amint megjelenik a nevek táblája, lekérheti a driver.page_source, átadod a BeautifulSoup-nakMegkeresed a megfelelő táblázatot (például a lap negyedik táblázatát), és kinyered belőle az összes cellát. Tisztítod a szöveget, kicseréled a szokatlan karaktereket, eltávolítod a duplikáltakat, és minden új nevet egy listába mentesz.
Egy olyan ciklusban, amely ezt a folyamatot addig ismétli, amíg például el nem éri a 100 000 nevet, a Selenium automatizálja a felhasználói felülettel való interakciót, a BeautifulSoup pedig az adatok kinyerését és tisztítását végzi. Nem ritka, hogy egy ilyen folyamat eltart egy ideig. több mint egy óraEzért célszerű az időzítéseket szabályozni, a kivételeket kezelni, és ha szükséges, a köztes állapotokat menteni a munkaveszteség elkerülése érdekében.
Gyakorlati használati esetek a BeautifulSoup, a Selenium és az API-k használatával
Mindezen darabokkal az asztalon meglehetősen változatos projekteket építhet, a következőktől kezdve: Az egyszerű, személyes használatra szánt kaparóktól a komplex, nagyméretű kitermelő csővezetékekigA lényeg az, hogy minden réteghez a megfelelő eszközt válasszuk.
A kiadói szektorban például beállíthat egy rendszert, amely feltérképezi egy újság weboldalát, beszerzi Egy adott szekció cikkeinek esetében töltse le a fő szöveget, a szerzőt, a dátumot, a címkéket és a fő képet. és tárolja azt egy adatbázisban későbbi tartalomelemzési vagy NLP projektekhez.
Az e-kereskedelemben erre egy klasszikus példa egy légitársaság weboldalának vagy egy repülőjegy-összehasonlító oldalnak az adatgyűjtése. Árak, menetrendek, indulási és célrepülőterek lekérésepoggyászkorlátozások és egyéb hasznos részletek. Itt találhatók mind Requests és BeautifulSoup, ha a HTML statikus, például a Selenium esetében, ha az eredmények űrlapokkal és dinamikus szelektorokkal való interakció után jelennek meg.
Egy másik tipikus projekt a kaparás és a ... kombinációja. Hivatalos API-k, ha elérhetőkPéldául a Spotify API segítségével információkat szerezhetsz előadókról, albumokról és dalokról, és ezzel egyidejűleg zenei blogokról és weboldalakról származó kritikákat vagy hozzászólásokat gyűjthetsz, hogy felhasználói véleményekkel gazdagítsd az adataidat.
Ha túl kell lépned az egyszeri szkripteken, és szeretnéd nagy adatmennyiségekre skálázhatóÍme a Scrapy, egy speciális adatgyűjtési keretrendszer, amely leegyszerűsíti az életedet a kéréssorok, a robotok kezelése, a köztes szoftverek és a folyamatok segítségével. A Selenium továbbra is hasznos lehet bizonyos esetekben; egyszerűen integráld a JavaScript futtatását igénylő robotokba.
Mindezen esetekben az etikai és jogi normák továbbra is érvényesek: kulcsfontosságú a robots.txt tiszteletben tartása, a kérések gyakoriságának mérséklése, Ne lépjen be privát területekre, és ne kerülje meg a biztonsági intézkedéseket. és felelősségteljesen használja az adatokat, különösen akkor, ha kereskedelmi célra kívánja felhasználni azokat.
Hibakezelés, munkakörnyezetek és bevált gyakorlatok
Egy robusztus adatgyűjtő nem csak a könyvtárak használatának ismeretéről szól, hanem arról is, hogy Szervezd meg jól a munkakörnyezetet, kezeld a hibákat, és tartsd a kódot olvasható és újrafelhasználható formában.Ha a projekt akár csak kicsit is növekszik, örülni fogsz, hogy jó lábon indultál.
Professzionális Linux vagy macOS projektek esetén általában ajánlott létrehozni egy külön mappát a projekthez, csatolni egy virtuális környezet venv-velAktiváld, és csak a szükséges függőségeket telepítsd: requests, beautifulsoup4, selenium, jupyter, ha notebookokat fogsz használni stb. Ez sokkal könnyebbé teszi a környezet reprodukálását, a csomagok frissítését vagy a projekt másik gépre való migrálását.
Könnyebb környezetben vagy gyors prototípusgyártás céljából sokan a következőkhöz fordulnak google colabahol telepítheted a szükséges könyvtárakat a pip segítségével, és közvetlenül a böngészőből dolgozhatsz. Komoly projektek esetén azonban célszerű később egy ellenőrzött környezetbe migrálni, ahol verziózhatod a kódot és biztonságosan kezelheted a hitelesítő adatokat.
A mindennapi munkád során kivételekkel kell majd foglalkoznod. Amikor a kérések sikertelenek, amikor egy Selenium elem nem jelenik meg időben, vagy amikor a BeautifulSoup nem találja a várt csomópontot, a Python kivételeket dob. kivételek, amelyeket ha nem észlelnek, leállítják a programotA try-except blokkok használata lehetővé teszi ezen hibák kezelését, a történtek naplózását, és annak eldöntését, hogy kihagyja-e az URL-t, újrapróbálkozik-e, vagy leállítja-e a végrehajtást.
A funkcionális tervezés nagyban segíti a rend fenntartását is. Egy olyan funkció elkülönítése, amely Töltsd le az oldalt, egy másik elemzi a linkeket, egy harmadik pedig kinyeri egy hír tartalmát És egy másik, amely adatokat tárol, lehetővé teszi az egyes részek külön-külön történő tesztelését, a kód újrafelhasználását és a megvalósítás módosítását, amikor a webhely módosítja a struktúráját.
Végül, ha multimédiás tartalmakat, például cikkekből kiemelt képeket szeretne letölteni, akkor ezt a logikát olyan speciális függvényekbe kell csomagolni, amelyek kezelik azt. fogadja az URL-t, elküldi a kérést, menti a fájlt egy elfogadható névvel, és kezeli a csatlakozási hibákatÍgy elkerülhető, hogy túl sok felelősségi kör keveredjen ugyanabban a kódblokkban.
Röviden, ha megérted, hogyan épülnek fel a modern weboldalak, mikor elegendő a statikus HTML, és mikor van szükséged egy valódi böngészőre, és ezeket ésszerűen kombinálod, akkor elérheted a kívánt eredményeket. Kérések, BeautifulSoup, Selenium, API-k és olyan eszközök, mint a ScrapyAz adatkinyerést elegánsan automatizálhatod. A lényeg az, hogy átgondoltan tedd, tiszteletben tartva a technikai és jogi korlátokat, és a kódot kellően rendszerezetten tartsd, hogy néhány hónap múlva is tudd, mit csinál az egyes részek.