Vrhunski vodič za struganje weba s Node.js

Pa što je uopće struganje s weba? Uključuje automatizaciju mukotrpnog zadatka prikupljanja podataka s web stranica.

Puno je slučajeva korištenja za struganje weba: možda ćete htjeti prikupiti cijene s različitih web lokacija e-trgovine za web stranicu za usporedbu cijena. Ili vam je možda potrebno vrijeme leta i popisi hotela / AirBNB-a za mjesto putovanja. Možda želite prikupiti e-poštu iz različitih direktorija za potencijalne kupce ili upotrijebiti podatke s Interneta za obuku modela strojnog učenja / AI. Ili možda možda želite izgraditi tražilicu poput Googlea!

Lako je započeti s struganjem weba, a postupak se može podijeliti na dva glavna dijela:

  • stjecanje podataka pomoću HTML knjižnice zahtjeva ili bezglavog preglednika,
  • i raščlanjivanje podataka kako biste dobili točne informacije koje želite.

Ovaj će vas vodič provesti kroz postupak s popularnim Node.js modulom za obećanje, CheerioJS i Puppeteer. Radeći kroz primjere u ovom vodiču naučit ćete sve savjete i trikove koji su vam potrebni da biste postali profesionalac u prikupljanju svih podataka koji su vam potrebni s Node.js!

Popis svih imena i rođendana američkih predsjednika prikupit ćemo s Wikipedije i naslove svih postova na naslovnici Reddita.

Prvo najprije: Instalirajmo knjižnice koje ćemo koristiti u ovom vodiču (Puppeteeru će trebati neko vrijeme da se instalira jer treba preuzeti i Chromium).

Izrada vašeg prvog zahtjeva

Dalje, otvorimo novu tekstualnu datoteku (nazovimo datoteku potusScraper.js) i napišite brzu funkciju za dobivanje HTML-a stranice Wikipedije "Popis predsjednika".

Izlaz:

Korištenje Chrome DevTools

Super, dobili smo sirovi HTML s web stranice! Ali sada moramo shvatiti ovu divovsku mrlju teksta. Da bismo to učinili, morat ćemo upotrijebiti Chrome DevTools koji će nam omogućiti lako pretraživanje HTML-a web stranice.

Korištenje Chrome DevTools jednostavno je: jednostavno otvorite Google Chrome i kliknite desnom tipkom miša na element koji biste željeli sastrugati (u ovom slučaju klikćem desnom tipkom Georgea Washingtona, jer želimo doći do veza do svih stranica Wikipedije pojedinih predsjednika) :

Sada jednostavno kliknite inspekciju i Chrome će otvoriti okno DevTools, omogućujući vam lak pregled izvornog HTML-a stranice.

Raščlanjivanje HTML-a s Cheerio.js

Sjajno, Chrome DevTools sada nam pokazuje točan obrazac koji bismo trebali tražiti u kodu ("velika" oznaka s hipervezom unutar nje). Upotrijebimo Cheerio.js za raščlanjivanje HTML-a koji smo ranije dobili kako bismo vratili popis veza do pojedinih stranica Wikipedije američkih predsjednika.

Izlaz:

Provjeravamo je li vraćeno točno 45 elemenata (broj američkih predsjednika), što znači da negdje drugdje na stranici nema dodatnih skrivenih "velikih" oznaka. Sada možemo pregledati i dohvatiti popis veza do svih 45 predsjedničkih stranica Wikipedije uzimajući ih iz odjeljka "attribs" svakog elementa.

Izlaz:

Sada imamo popis svih 45 predsjedničkih stranica Wikipedije. Stvorimo novu datoteku (nazvanu potusParse.js), koja će sadržavati funkciju za zauzimanje predsjedničke stranice Wikipedije i vraćanje predsjednikova imena i rođendana. Prvo najprije, uzmimo sirovi HTML sa Wikipedia stranice Georgea Washingtona.

Izlaz:

Ponovno upotrijebimo Chrome DevTools da pronađemo sintaksu koda koji želimo raščlaniti, kako bismo mogli izvući ime i rođendan s Cheerio.js.

Dakle, vidimo da je ime u klasi koja se zove "firstHeading", a rođendan je u klasi koja se zove "bday". Izmijenimo naš kôd tako da koristi Cheerio.js za izdvajanje ove dvije klase.

Izlaz:

Sve zajedno

Savršen! Ajmo sada ovo umotati u funkciju i izvesti iz ovog modula.

Vratimo se sada izvornoj datoteci potusScraper.js i zahtijevajmo modul potusParse.js. Zatim ćemo ga primijeniti na popis wikiUrlova koji smo ranije prikupili.

Izlaz:

Prikazivanje JavaScript stranica

Voilà! Popis imena i rođendana svih 45 američkih predsjednika. Upotreba samo modula za obećanje i Cheerio.js trebali bi vam omogućiti struganje velike većine web mjesta na Internetu.

Međutim, nedavno su mnoge web stranice počele koristiti JavaScript za generiranje dinamičnog sadržaja na svojim web mjestima. To stvara problem za zahtjev-obećanje i druge slične knjižnice HTTP zahtjeva (poput axios i dohvaćanja), jer odgovor dobivaju samo iz početnog zahtjeva, ali ne mogu izvršiti JavaScript na način na koji to može web preglednik.

Dakle, za struganje web mjesta koja zahtijevaju izvršenje JavaScripta potrebno nam je drugo rješenje. U sljedećem ćemo primjeru dobiti naslove svih postova na naslovnoj stranici Reddita. Pogledajmo što se događa kada pokušamo upotrijebiti zahtjev-obećanje kao što smo to učinili u prethodnom primjeru.

Izlaz:

Evo kako izgleda izlaz:

Hmmm ... ne baš ono što želimo. To je zato što za dobivanje stvarnog sadržaja trebate pokrenuti JavaScript na stranici! S Puppeteerom to nije problem.

Puppeteer je izuzetno popularan novi modul koji vam je donio tim Google Chromea koji vam omogućuje upravljanje bezglavim preglednikom. Ovo je savršeno za programsko struganje stranica koje zahtijevaju izvršenje JavaScript-a. Uzmimo HTML s naslovnice Reddita koristeći Puppeteer umjesto zahtjeva-obećanja.

Izlaz:

Lijepo! Stranica je ispunjena ispravnim sadržajem!

Sada možemo koristiti Chrome DevTools kao što smo to činili u prethodnom primjeru.

Čini se da Reddit stavlja naslove u oznake "h2". Upotrijebimo Cheerio.js za izdvajanje h2 oznaka sa stranice.

Izlaz:

Dodatna sredstva

I tu je popis! U ovom trenutku trebali biste se osjećati ugodno pri pisanju svog prvog strugača za prikupljanje podataka s bilo kojeg web mjesta. Evo nekoliko dodatnih resursa koji bi vam mogli biti korisni tijekom vašeg pretraživanja web stranica:

  • Popis proxy usluga za struganje na webu
  • Popis praktičnih alata za struganje weba
  • Popis savjeta za struganje weba
  • Usporedba web proxyja za struganje
  • Cheerio dokumentacija
  • Lutkarska dokumentacija