„The Ultimate Guide to Web Scraping with Node.js“

Taigi, kas vis dėlto yra žiniatinklio grandymas? Tai reiškia, kad reikia automatizuoti sunkią užduotį rinkti informaciją iš svetainių.

Yra daugybė naudojimosi žiniatinkliui atvejų: galbūt norėsite rinkti kainas iš įvairių el. Prekybos svetainių kainų palyginimo svetainei. Arba galbūt jums reikia skrydžio laiko ir viešbučių / „AirBNB“ sąrašų kelionių svetainėje. Galbūt norite rinkti el. Laiškus iš įvairių katalogų, kuriuose pateikiami potencialūs klientai, arba naudoti duomenis iš interneto, kad mokytumėte mašininio mokymosi / dirbtinio intelekto modelius. Arba galbūt norėsite sukurti tokį paieškos variklį kaip „Google“!

Pradėti naudoti žiniatinklio grandymą yra lengva, ir procesą galima suskirstyti į dvi pagrindines dalis:

  • gauti duomenis naudojant HTML užklausų biblioteką arba naršyklę be galvos,
  • ir analizuojant duomenis, kad gautumėte tikslią norimą informaciją.

Šis vadovas padės jums aptarti procesą su populiariu „Node.js“ prašymų-pažadų moduliu „CheerioJS“ ir „Puppeteer“. Peržiūrėdami šio vadovo pavyzdžius, sužinosite visus patarimus, kurių jums reikia norint tapti profesionalu renkant visus reikalingus duomenis naudojant „Node.js“!

Iš „Wikipedia“ rinksime visų JAV prezidentų vardų ir pavardžių bei gimtadienių sąrašą ir visų įrašų pavadinimus „Reddit“ pirmajame puslapyje.

Pirmiausia pirmiausia: įdiekime bibliotekas, kurias naudosime šiame vadove („Puppeteer“ užtruks šiek tiek laiko, kol bus įdiegta, nes reikia atsisiųsti ir „Chromium“).

Pateikite savo pirmąją užklausą

Tada atidarykime naują tekstinį failą (pavadink failą potusScraper.js) ir parašykime greitą funkciją, kad gautume Vikipedijos „Prezidentų sąrašas“ puslapio HTML.

Išvestis:

„Chrome DevTools“ naudojimas

Šaunu, mes gavome neapdorotą HTML iš tinklalapio! Bet dabar turime suprasti šį milžinišką teksto dėmę. Norėdami tai padaryti, turėsime naudoti „Chrome DevTools“, kad galėtume lengvai ieškoti per tinklalapio HTML.

„Chrome DevTools“ naudoti paprasta: tiesiog atidarykite „Google Chrome“ ir dešiniuoju pelės mygtuku spustelėkite elementą, kurį norite nugramdyti (šiuo atveju dešiniuoju pelės mygtuku spustelėkite George'ą Washingtoną, nes norime gauti nuorodas į visus atskirų prezidentų Vikipedijos puslapius). :

Dabar tiesiog spustelėkite tikrinti, o „Chrome“ parodys „DevTools“ sritį, kuri leis jums lengvai patikrinti puslapio šaltinio HTML.

Analizuojamas HTML su „Cheerio.js“

Nuostabu, „Chrome DevTools“ dabar rodo tikslų modelį, kurio turėtume ieškoti kode („didelė“ žyma su hipersaitu jo viduje). Panaudokime „Cheerio.js“, kad išanalizuotume anksčiau gautą HTML, kad būtų pateiktas nuorodų į atskirus JAV prezidentų „Wikipedia“ puslapius sąrašas.

Išvestis:

Patikriname, ar yra tiksliai 45 elementai (JAV prezidentų skaičius), o tai reiškia, kad kitur puslapyje nėra jokių papildomų paslėptų „didelių“ žymių. Dabar galime pereiti ir paimti nuorodų į visus 45 prezidentinės Vikipedijos puslapius sąrašą, paimdami juos iš kiekvieno elemento skilties „atributai“.

Išvestis:

Dabar turime visų 45 prezidentinės „Wikipedia“ puslapių sąrašą. Sukurkime naują failą (pavadinimu potusParse.js), kuriame bus funkcija užimti prezidento „Wikipedia“ puslapį ir grąžinti prezidento vardą bei pavardę ir gimtadienį. Pirmiausia pirmiausia paimkime neapdorotą HTML iš George'o Washingtono „Wikipedia“ puslapio.

Išvestis:

Dar kartą naudokime „Chrome DevTools“ norėdami išanalizuoti norimo analizuoti kodo sintaksę, kad galėtume išskleisti vardą ir gimtadienį naudodami „Cheerio.js“.

Taigi matome, kad vardas yra „firstHeading“, o gimtadienis - „bday“. Pakeiskime savo kodą, kad naudodamiesi Cheerio.js išgautume šias dvi klases.

Išvestis:

Viską sujungus

Puikus! Dabar suvyniokime tai į funkciją ir eksportuokime iš šio modulio.

Dabar grįšime į pradinį failą potusScraper.js ir reikalausime modulio potusParse.js. Tada pritaikysime jį anksčiau surinktam „wikiUrls“ sąrašui.

Išvestis:

Pateikiami „JavaScript“ puslapiai

Voilà! Visų 45 JAV prezidentų vardų ir gimtadienių sąrašas. Naudodami tik užklausos pažadų modulį ir „Cheerio.js“ turėtumėte leisti nuskaityti didžiąją dalį interneto svetainių.

Tačiau pastaruoju metu daugelis svetainių pradėjo naudoti „JavaScript“, kad generuotų dinamišką turinį savo svetainėse. Tai sukelia užklausos pažadų ir kitų panašių HTTP užklausų bibliotekų (pvz., Axios ir fetch) problemą, nes jos gauna atsakymą tik iš pradinės užklausos, tačiau negali vykdyti „JavaScript“ taip, kaip tai gali padaryti interneto naršyklė.

Taigi, norint nuskaityti svetaines, kurioms reikia „JavaScript“ vykdymo, mums reikia kito sprendimo. Kitame pavyzdyje gausime visų įrašų, esančių „Reddit“ pirmajame puslapyje, pavadinimus. Pažiūrėkime, kas atsitiks, kai bandysime naudoti prašymą-pažadą, kaip tai darėme ankstesniame pavyzdyje.

Išvestis:

Štai kaip atrodo išvestis:

Hmmm ... ne visai tai, ko mes norime. Taip yra todėl, kad norint gauti tikrąjį turinį reikia paleisti „JavaScript“ puslapyje! Su „Puppeteer“ tai nėra problema.

„Puppeteer“ yra itin populiarus naujas modulis, kurį jums pateikė „Google Chrome“ komanda, leidžianti valdyti naršyklę be galvos. Tai puikiai tinka programiškai nuskaityti puslapius, kuriems reikia „JavaScript“ vykdymo. Paimkime HTML iš „Reddit“ pagrindinio puslapio, naudodami „Puppeteer“, o ne prašymą-pažadą.

Išvestis:

Malonu! Puslapis užpildytas teisingu turiniu!

Dabar galime naudoti „Chrome DevTools“, kaip tai darėme ankstesniame pavyzdyje.

Panašu, kad „Reddit“ įdeda pavadinimus į „h2“ žymas. Naudokime „Cheerio.js“, kad išgautume h2 žymas iš puslapio.

Išvestis:

Papildomi resursai

Ir yra sąrašas! Šiuo metu turėtumėte jaustis rašydami savo pirmąjį žiniatinklio grandiklį, kad surinktumėte duomenis iš bet kurios svetainės. Čia yra keli papildomi šaltiniai, kurie gali būti naudingi žiniatinklio grandymo metu:

  • Žiniatinklio grandymo tarpinių paslaugų sąrašas
  • Patogių žiniatinklio grandymo įrankių sąrašas
  • Žiniatinklio grandymo patarimų sąrašas
  • Žiniatinklio grandymo įgaliojimų palyginimas
  • „Cheerio“ dokumentacija
  • Lėlininkų dokumentacija