Kada te šef pita pratite cijene konkurenata, analizirajte recenzije ili prikupljajte podatke sa stotina stranicaRučno kopiranje i lijepljenje više nije opcija. Potreban vam je način da automatizujete izdvajanje informacija bez izluđivanja ili gubljenja sati na repetitivne zadatke.
U Python ekosistemu, dva alata o kojima ćete najčešće čuti za ovo su Prekrasna supa i selenJedan se ističe u brzoj i jednostavnoj analizi HTML-a; drugi može otvoriti pravi preglednik, izvršiti JavaScript, kliknuti, popuniti obrasce i ponašati se kao ljudski korisnik. Ključno je dobro razumijevanje. kada koristiti svaki od njih i kako ih kombinovati da iz njih izvuku maksimum.
Šta je web scraping i kada ga je korisno koristiti
Skraping weba nije ništa više od proces izdvajanja podataka sa web stranicaMožete to uraditi kopiranjem i lijepljenjem, ali kako količina informacija raste, ima smisla osloniti se na skripte ili automatizovane alate koji pregledavaju stranice i spremaju ono što vas zanima.
Struganjem možete Sastavite popise proizvoda i cijene, vijesti, recenzije, komentare i objave na društvenim mrežama ili gotovo bilo koji sadržaj koji je javno dostupan na webu. U suštini, to je preliminarni korak za mnoge projekte analize podataka, mašinskog učenja ili automatizacije zadataka.
Međutim, važno je biti jasan o tome kada bi struganje trebalo biti vaša strategija. posljednje sredstvo, ne prvoAko stranica već nudi dobro dokumentiran službeni API, obično je bolje koristiti ga: stabilniji je, obično ima jasna ograničenja korištenja i smanjuje rizik od kršenja bilo čega ili uvjeta korištenja.
Struganje počinje imati smisla kada Ne postoji API, API je nepotpun ili su vam potrebni podaci koji se pojavljuju samo u web interfejsu., kao što su ugrađeni komentari, rangiranje, male oznake ili dinamički generirani blokovi sadržaja.
Također je važno razlikovati dva koncepta koja se često miješaju: web scraping i web indeksiranjeScraping se fokusira na izdvajanje specifičnih podataka sa određenih stranica; s druge strane, crawling je posvećen istražiti i mapirati strukturu web-stranice ili cijelog webapraćenjem linkova, baš kao što to rade pretraživači za indeksiranje sadržaja.
Pravni i etički aspekti: šta ne biste trebali zanemariti
Prije nego što nepromišljeno pokrenete svoj strugač, vrijedi odvojiti trenutak da razmislite o pravne, tehničke i etičke implikacijeSkrašavanje vlastite web stranice ili akademskog projekta nije isto što i postavljanje komercijalne usluge na osnovu podataka drugih ljudi.
Prvo što treba provjeriti je da li ste u skladu sa zakonodavstvom vaše zemlje ili regijePitanja poput zaštite podataka, privatnosti i korištenja ličnih podataka mogu se znatno razlikovati od mjesta do mjesta, tako da ih nije dobra ideja ignorisati. Ako ćete raditi s osjetljivim ili identifikabilnim podacima, najbolje je da se konsultujete s nekim ko je upućen u tehnološko pravo.
Sljedeći korak je provjeriti da li stranica ima uslovi korištenja koji zabranjuju skraćivanjeMnogi portali uključuju posebne klauzule u svoje Uslove i odredbe koje se odnose na automatizirano izdvajanje podataka, komercijalnu upotrebu informacija ili neovlašteni pristup određenim odjeljcima.
Postoji jedan ključni dio na koji gotovo uvijek trebate obratiti pažnju: datoteka robots.txtNaći ćete ga u korijenu domene, nešto poput https://www.ejemplo.com/robots.txtTamo vlasnik navodi koje rute ne želi da budu indeksirane ili indeksirane, na primjer putem direktiva kao što su Onemogući blokirati rute ili Puzanje-kašnjenje kako bi se osiguralo minimalno kašnjenje između zahtjeva.
Poštovanje ovih smjernica nije samo pitanje etike, već i način Ne preopterećujte server stotinama zahtjeva u sekundi.Loše dizajniran scraper može ličiti na napad uskraćivanjem usluge (denial-of-service), a to, osim što je neelegantno, može vam uzrokovati probleme.
Na kraju, zapitajte se da li Upotreba podataka koju namjeravate koristiti je razumna.Hoćete li ih distribuirati onakve kakve jesu? Hoćete li ih miješati s drugim izvorima? Da li je to za interni projekat ili za preprodaju informacija? Ova pitanja uveliko utiču na rizike i na to kako biste trebali dizajnirati svoje rješenje.
Kako se web stranica zapravo učitava: HTML, CSS, JavaScript i iframeovi
Za efikasno scrapingovanje, bitno je razumjeti šta vaš skript zapravo vidi kada šalje zahtjev. U idealnom svijetu, stranica primljena od servera bi već sadržavala sav HTML sa sadržajem koji vas zanimaI sve što bi preglednik uradio jeste da ga stilizira CSS-om i doda malo interaktivnosti pomoću JavaScripta.
Stvarnost je manje lijepa: mnoge moderne web stranice Oni učitavaju podatke odloženo pomoću JavaScripta i ugrađuju sadržaj trećih strana pomoću iframeova. ili prepisuju DOM u hodu. Ako otvorite klasični meni "Prikaži izvorni kod" u pregledniku, ponekad nećete vidjeti nikakve tragove komentara, brojača ili dinamičkih blokova koji se pojavljuju na ekranu.
Tipičan primjer su sistemi za komentiranje poput DisqusOriginalni HTML možda ne sadrži nijedan red komentara, ali konačni DOM koji generiše pretraživač može sadržavati jedan. iframe kreiran pomoću JavaScripta gdje se učitava cijela nit. Ako pokušate izvršiti statičko scraping te stranice, završit ćete s "oštećenim" HTML-om.
U ovakvim scenarijima, strategija uključuje simulirajte ono što radi pravi preglednikUčitajte stranicu, pustite JavaScript da se pokrene, pričekajte da se pojave elementi koji vas zanimaju i tek onda izdvojite sadržaj. Tu nastupa Selenium.
Statičko struganje podataka pomoću zahtjeva i BeautifulSoup-a
Kada se sadržaj koji vam je potreban već nalazi u početnom HTML-u (tipičan proizvod, vijesti, jednostavne tabele, statički oglasi), najefikasniji pristup je obično korištenje Zahtjevi za slanje HTTP zahtjeva i BeautifulSoup za parsiranje HTML-aTo je klasičan par za lagano i brzo struganje.
Osnovni tok je jednostavan: prvo pošaljete zahtjev sa requests.get(url) i analizirate odgovor. Predmet u ruci, možete pogledati statusni kod sa status_code, tekstualni sadržaj sa text ili binarni sadržaj sa content, pored pregleda zaglavlja i konačnih URL-ova kako bi se bolje razumjelo šta server vraća.
Nakon što imate HTML kod, prosljeđujete ga BeautifulSoupu, obično nečim poput ovoga: BeautifulSoup(html, "html.parser")Parser rastavlja tekst u strukturu stabla koja je mnogo praktičnija za pretraživanje oznaka, atributa i ugniježđenog sadržaja.
Sa tim objektom sou sada možete koristiti metode poput pronađi, pronađi_sve ili odaberi da locirate određene čvorove: na primjer, sve koji sadrže tutorijale, redove tabele, linkove u odjeljku vijesti ili bilo koji dio stranice koji ima razumno koherentnu HTML strukturu.
Tipičan primjer je postavljanje scrapera za digitalne novine poput Página 12. Možete uputiti zahtjev naslovnoj stranici, analizirati blokove sekcija, pronaći linkove vijesti I odatle, sistematski se krećite kako biste dobili naslove, datume, tekst, glavne slike i sve podatke koji vas zanimaju, pakujući ih u rječnike spremne za spremanje u bazu podataka.
U ovim scraperima je preporučljivo dodati logiku rukovanje greškama pomoću try-except Da bi se spriječilo da jedan kvar (vijest s promijenjenom strukturom, neuspjeli zahtjev, nedostajuća oznaka) ugrozi cijeli proces, hvatanje specifičnih izuzetaka i odlučivanje kada ignorirati greške, a kada stati, dio je svakodnevne rutine za ove vrste projekata.
Dinamičko struganje pomoću Seleniuma: JavaScript, iframe-ovi i korisničke akcije
Kada web počne da se oslanja na JavaScript za apsolutno sve, statičko skrapingovanje ne uspijeva. Ako se sadržaj generiše u hodu, on se krije iza iframe ili se pojavljuje tek nakon interakcije s dugmadima, obrascima ili dinamičkim elementimaPotreban vam je pravi preglednik ili preglednik bez grafičkog koda koji izvršava svu tu logiku.
Ovdje selen pokazuje svoje mišiće. Selen je prvobitno dizajniran da Automatizirajte funkcionalno testiranje web aplikacijaAli njegova sposobnost da upravlja preglednikom - otvaranjem stranica, klikanjem, popunjavanjem unosa, čekanjem da se sadržaj učita - čini ga vrlo moćnim alatom za dinamičko struganje.
Srce Seleniuma je WebDriver, komponenta koja kontroliše odabrani preglednik (Chrome, Firefox i drugi). Da biste ga koristili, potreban vam je drajver specifičan za preglednik (geckodriver za Firefox, chromedriver za Chrome, itd.), koji mora biti u putanji dostupnoj sa vašeg sistema, obično uključenoj u varijablu okruženja PATH.
Osnovna instalacija Pythona se radi na sljedeći način: pip instalacija selenaOdatle, u vašem skriptu kreirate instancu WebDrivera, na primjer sa webdriver.Firefox() ili webdriver.Chrome()A sada možete početi pregledavati, otvarati URL-ove ili komunicirati sa stranicom kao da ste pravi korisnik.
Što se tiče vrste preglednika, možete koristiti potpuni preglednik s grafičkim interfejsom ili preglednik u stanju pripravnosti. Bez glaveU teoriji postoje alternative poput PhantomJS-a, ali u praksi su mnogi ljudi prijavili nekompatibilnosti i čudno ponašanje, pa je obično poželjnije koristiti... koristite Chrome ili Firefox u stvarnom ili headless načinu rada kako bi se smanjila iznenađenja.
Nakon što se stranica učita, Selenium vam omogućava da locirate elemente koristeći širok spektar selektora: po ID-u, imenu, klasi, CSS selektoru ili XPath-uMožete pozvati metode poput pronađi_element ili pronađi_elemente i odatle, pokrenuti akcije kao što su klik, slanje tipki ili preuzimanje vidljivog teksta svakog čvora.
Kombinirajte Selenium i BeautifulSoup da biste izvukli maksimum iz toga
Najmoćnija kombinacija za složene web stranice je obično sljedeća: Selenium se bavi učitavanjem stranice, izvršavanjem JavaScripta i pripremom konačnog DOM-a; BeautifulSoup zatim dolazi na red da parsira taj renderirani HTML i izdvoji podatke. sa svim pogodnostima svojih funkcija pretraživanja.
Opći obrazac je jednostavan. Prvo inicijalizirate WebDriver, a zatim učitate URL pomoću driver.get() I, ako je potrebno, čekate da se određeni ključni elementi pojave koristeći eksplicitne čekanja. Kada ste sigurni da se sadržaj učitao, dobijate Konačni HTML sa driver.page_source.
Taj HTML prosljeđujete BeautifulSoupu, baš kao što biste to učinili kod statičkog scrapinga, za iteraciju tabele, liste, članci, redovi ili bilo koji blok sa ponavljajućom strukturomOvo vam omogućava da iskoristite snagu Selenium selektora kako biste došli do ispravnog dijela stranice, a zatim i fleksibilnost BeautifulSoupa za čisto izdvajanje podataka.
Na stranicama koje koriste iframe-ove, kao što su komentari na Disqusu, često morate promijeni kontekst na određeni iframe prije izdvajanja sadržaja. Pomoću Seleniuma možete locirati iframe - na primjer onaj koji visi s kontejnera s ID-om disqus_thread -, koristiti switch_to.frame i, kada ste unutra, pričekati da se učitaju elementi poput brojača komentara ili tekstualnih blokova.
U drugim slučajevima, kao što su generatori sadržaja, kombinacija je još očiglednija. Zamislite generator imena iz Ratova zvijezda koji vam omogućava da birate Želite li muška, ženska ili miješana imena i koliko ih želite odjednomNa primjer, 100 imena po kliku. Selenium se brine o odabiru odgovarajuće opcije (na primjer, radio dugme sa imenom="izbor" i vrijednošću="100"), kliku na dugme "Generiraj" i čekanju da se tabela imena izgradi.
Kada se pojavi tabela imena, preuzimate driver.page_source, prosljeđujete ga BeautifulSoupuTražite odgovarajuću tabelu (na primjer, četvrtu tabelu na stranici) i izdvajate sve ćelije iz nje. Čistite tekst, zamjenjujete neobične znakove, uklanjate duplikate i spremate svako novo ime na listu.
U petlji koja ponavlja ovaj proces sve dok se, na primjer, ne dostigne 100.000 imena, Selenium automatizira interakciju korisničkog interfejsa, a BeautifulSoup se bavi ekstrakcijom i čišćenjem podataka. Nije neuobičajeno da takav proces traje neko vrijeme. više od sat vremenaStoga je preporučljivo kontrolirati vrijeme obrade, obrađivati izuzetke i, ako je potrebno, spremati međustanja kako bi se izbjegao gubitak posla.
Praktični primjeri upotrebe sa BeautifulSoup, Selenium i API-jima
Sa svim ovim dijelovima na stolu, možete graditi prilično raznolike projekte, od Od jednostavnih strugača za ličnu upotrebu do složenih velikih cjevovoda za ekstrakcijuVažno je odabrati pravi alat za svaki sloj.
Na primjer, u izdavačkoj industriji možete postaviti sistem koji pretražuje web stranicu novina, prikuplja Za članke u određenom odjeljku, preuzmite glavni tekst, autora, datum, oznake i glavnu sliku. i pohraniti ga u bazu podataka za kasniju analizu sadržaja ili NLP projekte.
U e-trgovini, klasičan primjer je skidanje podataka sa web stranice aviokompanije ili stranice za poređenje letova. Dobijte cijene, rasporede, početne i odredišne aerodromeograničenja prtljaga i druge korisne detalje. Ovdje su oba Zahtjevi i BeautifulSoup ako je HTML statičan, kao što je Selenium ako se rezultati pojavljuju nakon interakcije s formama i dinamičkim selektorima.
Drugi tipičan projekat uključuje kombinovanje struganja sa upotrebom Zvanični API-ji kada budu dostupniNa primjer, možete dobiti informacije o izvođačima, albumima i pjesmama koristeći Spotify API i istovremeno prikupljati recenzije ili komentare s muzičkih blogova i web stranica kako biste obogatili svoje podatke mišljenjima korisnika.
Ako trebate ići dalje od jednokratnih scenarija i želite skaliranje na velike količine podatakaPredstavljamo Scrapy, specijalizirani okvir za scraping koji pojednostavljuje vaš život s redovima zahtjeva, upravljanjem paucima, middlewareom i cjevovodima. Selenium i dalje može biti koristan u određenim slučajevima; jednostavno ga integrirajte u pauke koji zahtijevaju izvršavanje JavaScripta.
U svim ovim slučajevima, etika i zakonitost i dalje važe: ključno je poštovati robots.txt, umjeriti učestalost zahtjeva, Ne pristupajte privatnim područjima niti zaobilazite sigurnosne mjere. i odgovorno koristite podatke, posebno ako ćete ih koristiti u komercijalne svrhe.
Upravljanje greškama, radna okruženja i najbolje prakse
Robustan scraper nije samo poznavanje korištenja biblioteka, već i Dobro organizujte radno okruženje, kontrolišite greške i održavajte kod čitljivim i pogodnim za ponovnu upotrebu.Ako projekat i malo poraste, bit ćete sretni što ste krenuli na pravi način.
Za profesionalne projekte na Linuxu ili macOS-u, obično se preporučuje kreiranje posebne mape za projekat, montiranje virtuelno okruženje sa venv-omAktivirajte ga i instalirajte samo potrebne zavisnosti unutar njega: requests, beautifulsoup4, selenium, jupyter ako ćete koristiti notebook računare itd. Ovo će znatno olakšati reprodukciju okruženja, ažuriranje paketa ili migraciju projekta na drugu mašinu.
U lakšim okruženjima ili za brzu izradu prototipa, mnogi ljudi se okreću google colabgdje možete instalirati potrebne biblioteke pomoću pipa i raditi direktno iz preglednika. Međutim, za ozbiljne projekte preporučljivo je kasnije migrirati u kontrolirano okruženje gdje možete ažurirati verzije koda i sigurno upravljati vjerodajnicama.
U svom svakodnevnom radu, morat ćete se suočiti s izuzecima. Kada zahtjevi ne uspiju, kada se Selenium element ne pojavi na vrijeme ili kada BeautifulSoup ne može pronaći čvor koji ste očekivali, Python će izbaciti izuzetke. izuzeci koji će, ako se ne uhvate, zaustaviti programKorištenje try-except blokova vam omogućava da obradite ove greške, evidentirate šta se dogodilo i odlučite da li da preskočite taj URL, pokušate ponovo ili zaustavite izvršenje.
Funkcionalni dizajn također uveliko pomaže u održavanju reda. Odvajanje funkcije koja Preuzmi stranicu, drugu koja analizira linkove, a treću koja izdvaja sadržaj novinskog članka A drugi koji pohranjuje podatke omogućava vam testiranje svakog dijela zasebno, ponovnu upotrebu koda i promjenu implementacije kada stranica modificira svoju strukturu.
Konačno, ako ćete preuzimati multimedijski sadržaj poput istaknutih slika iz članaka, poželjet ćete tu logiku enkapsulirati u specifične funkcije koje je obrađuju. primiti URL, izvršiti zahtjev, sačuvati datoteku s razumnim imenom i obraditi greške u povezivanjuNa ovaj način izbjegavate miješanje previše odgovornosti u istom bloku koda.
Ukratko, ako razumijete kako se grade moderne web stranice, kada je statički HTML dovoljan, a kada vam je potreban pravi preglednik, i ako ih razumno kombinujete, možete postići željene rezultate. Zahtjevi, BeautifulSoup, Selenium, API-ji i alati poput ScrapyjaMožete prilično elegantno automatizirati ekstrakciju podataka. Važno je to učiniti promišljeno, poštujući tehnička i zakonska ograničenja i održavajući kod dovoljno organiziranim da i za nekoliko mjeseci od sada znate šta svaki dio radi.