Node.js abil veebi kraapimise ülim juhend

Mis siis ikkagi on veebi kraapimine? See hõlmab veebisaitidelt teabe kogumise töömahuka ülesande automatiseerimist.

Veebikraapimiseks on palju kasutusjuhtumeid: võiksite koguda erinevatelt e-kaubanduse saitidelt hindu võrdlussaidi jaoks. Või vajate ehk reisisaiti lennuaegu ja hotellide / AirBNB nimekirju. Võib-olla soovite koguda müügijuhtide jaoks erinevatest kataloogidest e-kirju või kasutada masinaõppe / tehisintellekti mudelite koolitamiseks Interneti-andmeid. Või võiksite isegi tahta luua sellist otsingumootorit nagu Google!

Veebikraapimisega alustamine on lihtne ja protsessi saab jagada kaheks põhiosaks:

  • andmete hankimine HTML-i päringute kogu või peata brauseri abil,
  • ja parsides andmeid soovitud täpse teabe saamiseks.

Selles juhendis tutvustatakse teid populaarse Node.js päringu-lubaduse mooduli, CheerioJS ja Puppeteeriga. Selle juhendi näidete abil saate Node.js-iga vajalike andmete kogumisel teada kõik nõuanded ja nõuanded, mis on vajalikud profiks saamiseks.

Kogume Wikipediast kõigi USA presidentide nimede ja sünnipäevade loetelu ning kõigi Redditi esilehel olevate postituste pealkirjad.

Kõigepealt kõigepealt: installime selles juhendis kasutatavad teegid (Puppeteeri installimine võtab natuke aega, kuna see vajab ka Chromiumi allalaadimist).

Esimese taotluse esitamine

Järgmisena avame uue tekstifaili (nimetage fail potusScraper.js) ja kirjutame kiire funktsiooni, et saada Wikipedia lehe “Presidendi loend” HTML.

Väljund:

Chrome DevToolsi kasutamine

Lahe, saime toore HTML-i veebisaidilt! Kuid nüüd peame selle hiiglasliku tekstimõtte mõtestama. Selleks peame kasutama Chrome DevToolsi, et saaksime hõlpsalt veebilehe HTML-i kaudu otsida.

Chrome DevToolsi kasutamine on lihtne: avage lihtsalt Google Chrome ja paremklõpsake elemendil, mida soovite kraapida (antud juhul klõpsan paremklõpsuga George Washingtonil, sest soovime saada linke kõigi üksikute presidentide Wikipedia lehtedele) :

Nüüd klõpsake lihtsalt nuppu inspekteeri ja Chrome avab oma DevToolsi paani, mis võimaldab teil hõlpsalt kontrollida lehe lähtekoodi HTML-i.

HTML-i sõelumine saidiga Cheerio.js

Äge, Chrome DevTools näitab meile nüüd täpset mustrit, mida peaksime koodist otsima ("suur" silt, mille sees on hüperlink). Kasutame Cheerio.js-i varem saadud HTML-i sõelumiseks, et tuua tagasi USA presidentide Vikipeedia üksikute lehtede linkide loend.

Väljund:

Kontrollime, et tagastatud oleks täpselt 45 elementi (USA presidentide arv), mis tähendab, et mujal lehel pole ühtegi ekstra peidetud "suurt" silti. Nüüd saame läbi vaadata ja haarata kõigi Vikipeedia presidendi 45 lehe linkide loendi, hankides need iga elemendi jaotisest „atribuudid”.

Väljund:

Nüüd on meil nimekiri kõigist 45 presidendi Vikipeedia lehest. Loome uue faili (nimega potusParse.js), mis sisaldab funktsiooni presidendi Vikipeedia lehe võtmiseks ning presidendi nime ja sünnipäeva tagastamiseks. Kõigepealt võtame toore HTML-i George Washingtoni Wikipedia lehelt.

Väljund:

Kasutame veel kord Chrome DevToolsi, et leida parsitava koodi süntaks, et saaksime Cheerio.js-iga nime ja sünnipäeva välja tõmmata.

Nii näeme, et see nimi on klassis nimega “firstHeading” ja sünnipäev klassis nimega “bday”. Muutkem oma koodi, et kasutada nende kahe klassi väljavõtmiseks Cheerio.js-i.

Väljund:

Kõike kokku panema

Täiuslik! Pange see nüüd funktsiooniks ja eksportige see sellest moodulist.

Naaseme nüüd oma algse faili potusScraper.js juurde ja nõuame moodulit potusParse.js. Seejärel rakendame selle varem kogutud wikiUrlite loendisse.

Väljund:

JavaScripti lehtede renderdamine

Voilà! Kõigi 45 USA presidendi nimede ja sünnipäevade loend. Ainult päringu-lubaduse mooduli ja Cheerio.js kasutamine peaks võimaldama teil enamikku Interneti-saite kraapida.

Viimasel ajal on aga paljud saidid hakanud JavaScripti kasutama oma veebisaitidel dünaamilise sisu loomiseks. See tekitab probleeme päringu-lubaduse ja muude sarnaste HTTP-päringute teekide (nt axios ja fetch) puhul, kuna nad saavad vastuse ainult algsest päringust, kuid nad ei saa JavaScripti käivitada nii, nagu veebibrauser saab.

Seega vajame JavaScripti käivitamist vajavate saitide kraapimiseks teist lahendust. Järgmises näites saame kõigi Redditi esilehel olevate postituste pealkirjad. Vaatame, mis juhtub, kui proovime kasutada taotlust-lubadust nagu eelmises näites.

Väljund:

Väljund näeb välja selline:

Hmmm ... mitte päris see, mida me tahame. Seda seetõttu, et tegeliku sisu hankimiseks peate lehel JavaScripti käitama! Puppeteeriga pole see probleem.

Puppeteer on äärmiselt populaarne uus moodul, mille tõi Google Chrome'i meeskond ja mis võimaldab teil juhtida peata brauserit. See sobib suurepäraselt JavaScripti käivitamist vajavate lehtede programmeerimiseks. Hakkame HTML-i Redditi esilehelt, kasutades taotluse-lubamise asemel Puppeteerit.

Väljund:

Tore! Leht on õige sisuga täidetud!

Nüüd saame kasutada Chrome DevToolsi nagu eelmises näites.

Tundub, et Reddit paneb pealkirjad “h2” siltide sisse. Kasutame lehelt h2 siltide väljavõtmiseks Cheerio.js-i.

Väljund:

Lisaressursid

Ja seal on nimekiri! Siinkohal peaksite end mugavalt kirjutama oma esimese veebikaabitsaga, et mis tahes veebisaidilt andmeid koguda. Siin on mõned täiendavad ressursid, mis võivad teie veebi kraapimise ajal kasulikud olla:

  • Veebipõhiste puhverserveriteenuste loend
  • Käepäraste veebikraapimisvahendite loend
  • Veebikraapimisnõuannete loend
  • Veebi kraapimise volikirjade võrdlus
  • Cheerio dokumentatsioon
  • Nukupidaja dokumentatsioon