Den ultimative guide til webskrabning med Node.js

Så hvad er webskrabning alligevel? Det involverer at automatisere den besværlige opgave med at indsamle information fra websteder.

Der er mange brugssager til webskrabning: Det kan være en god idé at samle priser fra forskellige e-handelswebsteder til et prissammenligningsside. Eller måske har du brug for flyvetider og hotel- / AirBNB-lister til et rejsewebsted. Måske vil du indsamle e-mails fra forskellige telefonbøger til salgsemner eller bruge data fra internettet til at træne machine learning / AI-modeller. Eller du vil måske endda ønske at opbygge en søgemaskine som Google!

Kom godt i gang med webskrabning er let, og processen kan opdeles i to hoveddele:

  • tilegnelse af data ved hjælp af et HTML-anmodningsbibliotek eller en headless browser,
  • og parsing af dataene for at få de nøjagtige oplysninger, du ønsker.

Denne guide fører dig gennem processen med det populære Node.js-anmodningsløfte-modul, CheerioJS og Puppeteer. Når du gennemgår eksemplerne i denne vejledning, lærer du alle de tip og tricks, du har brug for, til at blive en professionel til at indsamle de data, du har brug for med Node.js!

Vi vil samle en liste over alle navne og fødselsdage på amerikanske præsidenter fra Wikipedia og titlerne på alle indlæg på forsiden af ​​Reddit.

Første ting først: Lad os installere de biblioteker, vi bruger i denne vejledning (Puppeteer vil tage et stykke tid at installere, da det også skal downloade Chromium).

Lav din første anmodning

Lad os derefter åbne en ny tekstfil (navngiv filen potusScraper.js), og skriv en hurtigfunktion for at hente HTML-koden på Wikipedia "Liste over præsidenter" -siden.

Produktion:

Brug af Chrome DevTools

Sejt, vi har den rå HTML fra websiden! Men nu er vi nødt til at forstå denne kæmpe tekstklap. For at gøre det skal vi bruge Chrome DevTools for at give os mulighed for let at søge gennem HTML på en webside.

Brug af Chrome DevTools er let: Åbn blot Google Chrome, og højreklik på det element, du vil skrabe (i dette tilfælde højreklikker jeg på George Washington, fordi vi ønsker at få links til alle de enkelte præsidenters Wikipedia-sider) :

Klik nu blot på inspicér, og Chrome åbner sin DevTools-rude, så du nemt kan inspicere sidens kild HTML.

Analyse af HTML med Cheerio.js

Awesome, Chrome DevTools viser os nu det nøjagtige mønster, vi skal kigge efter i koden (et "stort" tag med et hyperlink inde i det). Lad os bruge Cheerio.js til at analysere den HTML, vi modtog tidligere, for at returnere en liste over links til de enkelte Wikipedia-sider for amerikanske præsidenter.

Produktion:

Vi kontrollerer for at sikre, at der er nøjagtigt 45 elementer, der returneres (antallet af amerikanske præsidenter), hvilket betyder, at der ikke er nogen ekstra skjulte "store" tags andre steder på siden. Nu kan vi gå igennem og hente en liste over links til alle 45 præsidentens Wikipedia-sider ved at hente dem fra afsnittet "attribs" i hvert element.

Produktion:

Nu har vi en liste over alle 45 præsidentens Wikipedia-sider. Lad os oprette en ny fil (kaldet potusParse.js), som vil indeholde en funktion til at tage en præsidents Wikipedia-side og returnere præsidentens navn og fødselsdag. Første ting først, lad os hente den rå HTML fra George Washingtons Wikipedia-side.

Produktion:

Lad os igen bruge Chrome DevTools til at finde syntaksen for den kode, vi vil analysere, så vi kan udtrække navnet og fødselsdagen med Cheerio.js.

Så vi ser, at navnet er i en klasse kaldet “firstHeading”, og fødselsdagen er i en klasse kaldet “bday”. Lad os ændre vores kode for at bruge Cheerio.js til at udtrække disse to klasser.

Produktion:

Samler det hele

Perfekt! Lad os nu pakke dette ind i en funktion og eksportere det fra dette modul.

Lad os nu vende tilbage til vores originale fil potusScraper.js og kræve potusParse.js-modulet. Vi anvender det derefter på listen over wikiUrls, vi samlede tidligere.

Produktion:

Gengivelse af JavaScript-sider

Voilà! En liste over navne og fødselsdage på alle 45 amerikanske præsidenter. Brug af bare anmodningsløfte-modulet og Cheerio.js skal give dig mulighed for at skrabe langt størstedelen af ​​siderne på internettet.

For nylig er mange sider imidlertid begyndt at bruge JavaScript til at generere dynamisk indhold på deres websteder. Dette medfører et problem for anmodningsløfte og andre lignende HTTP-anmodningsbiblioteker (såsom aksios og hentning), fordi de kun får svaret fra den oprindelige anmodning, men de kan ikke udføre JavaScript, som en webbrowser kan.

For at skrabe websteder, der kræver JavaScript-udførelse, har vi brug for en anden løsning. I vores næste eksempel får vi titlerne til alle indlæg på forsiden af ​​Reddit. Lad os se, hvad der sker, når vi prøver at bruge anmodningsløfte, som vi gjorde i det foregående eksempel.

Produktion:

Her ser udgangen ud:

Hmmm ... ikke helt hvad vi vil have. Det er fordi at få det faktiske indhold kræver, at du kører JavaScript på siden! Med Puppeteer er det ikke noget problem.

Puppeteer er et ekstremt populært nyt modul, der er bragt til dig af Google Chrome-teamet, der giver dig mulighed for at styre en hovedløs browser. Dette er perfekt til programmatisk skrabning af sider, der kræver JavaScript-udførelse. Lad os hente HTML'en fra forsiden af ​​Reddit ved hjælp af Puppeteer i stedet for anmodningsløfte.

Produktion:

Pæn! Siden er fyldt med det rigtige indhold!

Nu kan vi bruge Chrome DevTools som vi gjorde i det foregående eksempel.

Det ser ud til, at Reddit lægger titlerne inde i "h2" -tags. Lad os bruge Cheerio.js til at udtrække h2-tags fra siden.

Produktion:

Yderligere ressourcer

Og der er listen! På dette tidspunkt skal du have det godt med at skrive din første webskraber for at indsamle data fra ethvert websted. Her er et par ekstra ressourcer, som du måske finder nyttige under din webskrabningsrejse:

  • Liste over proxyservices til webskrabning
  • Liste over praktiske værktøjer til webskrabning
  • Liste over tip til webskrabning
  • Sammenligning af webskrabningsproxyer
  • Cheerio-dokumentation
  • Dokumentation af dukketeater