En guide til Crawler4j

1. Introduksjon

Vi ser web-crawlere i bruk hver gang vi bruker vår favoritt søkemotor. De brukes også ofte til å skrape og analysere data fra nettsteder.

I denne opplæringen skal vi lære hvordan vi bruker crawler4j til å sette opp og kjøre våre egne webcrawlere. crawler4j er et open source Java-prosjekt som lar oss gjøre dette enkelt.

2. Oppsett

La oss bruke Maven Central for å finne den nyeste versjonen og hente inn Maven-avhengigheten:

 edu.uci.ics crawler4j 4.4.0 

3. Opprette crawlere

3.1. Enkel HTML-crawler

Vi begynner med å lage en grunnleggende søkerobot som gjennomsøker HTML-sidene på //baeldung.com.

La oss lage crawleren vår ved å utvide den WebCrawler i vår crawler-klasse og definere et mønster for å ekskludere visse filtyper:

offentlig klasse HtmlCrawler utvider WebCrawler js

I hver båndklasse, vi må overstyre og implementere to metoder: bør besøke og besøk.

La oss lage våre bør besøke metoden nå bruker EKSKLUSJONER mønster vi opprettet:

@ Override public boolean shouldVisit (Page referringPage, WebURL url) {String urlString = url.getURL (). ToLowerCase (); returner! EXCLUSIONS.matcher (urlString) .matches () && urlString.startsWith ("// www.baeldung.com/"); }

Deretter kan vi behandle for besøkte sider i besøk metode:

@ Overstyr offentlig ugyldig besøk (side side) {String url = page.getWebURL (). GetURL (); hvis (page.getParseData () forekomst av HtmlParseData) {HtmlParseData htmlParseData = (HtmlParseData) page.getParseData (); Streng tittel = htmlParseData.getTitle (); Strengtekst = htmlParseData.getText (); Streng html = htmlParseData.getHtml (); Sett lenker = htmlParseData.getOutgoingUrls (); // gjør noe med de innsamlede dataene}}

Når vi har skrevet crawler, må vi konfigurere og kjøre den:

File crawlStorage = new File ("src / test / resources / crawler4j"); CrawlConfig config = ny CrawlConfig (); config.setCrawlStorageFolder (crawlStorage.getAbsolutePath ()); int numCrawlers = 12; PageFetcher pageFetcher = ny PageFetcher (config); RobotstxtConfig robotstxtConfig = ny RobotstxtConfig (); RobotstxtServer robotstxtServer = ny RobotstxtServer (robotstxtConfig, pageFetcher); CrawlController controller = ny CrawlController (config, pageFetcher, robotstxtServer); controller.addSeed ("// www.baeldung.com/"); CrawlController.WebCrawlerFactory fabrikk = HtmlCrawler :: ny; controller.start (fabrikk, numCrawlers);

Vi konfigurerte en midlertidig lagringskatalog, spesifiserte antall gjennomsøkende tråder og sådd søkeroboten med en start-URL.

Vi bør også merke oss det de CrawlController.start () metoden er en blokkeringsoperasjon. Enhver kode etter samtalen vil bare kjøres etter at søkeroboten er ferdig kjørt.

3.2. ImageCrawler

Som standard gjennomsøker ikke crawler4j binære data. I dette neste eksemplet slår vi på den funksjonaliteten og gjennomsøke alle JPEG-ene på Baeldung.

La oss starte med å definere ImageCrawler klasse med en konstruktør som tar en katalog for lagring av bilder:

offentlig klasse ImageCrawler utvider WebCrawler {private final static Pattern EXCLUSIONS = Pattern.compile (". * (\. (css | js | xml | gif | png | mp3 | mp4 | zip | gz | pdf)) $"); privat statisk sluttmønster IMG_PATTERNS = Pattern.compile (". * (\. (jpg | jpeg)) $"); private File saveDir; public ImageCrawler (File saveDir) {this.saveDir = saveDir; } // mer kode}

La oss deretter implementere bør besøke metode:

@ Override public boolean shouldVisit (Page referringPage, WebURL url) {String urlString = url.getURL (). ToLowerCase (); hvis (EXCLUSIONS.matcher (urlString) .matches ()) {return false; } hvis (IMG_PATTERNS.matcher (urlString) .matches () || urlString.startsWith ("// www.baeldung.com/")) {return true; } returner falsk; }

Nå er vi klare til å implementere besøk metode:

@ Overstyr offentlig ugyldig besøk (side side) {String url = page.getWebURL (). GetURL (); hvis (IMG_PATTERNS.matcher (url) .matches () && page.getParseData () forekomst av BinaryParseData) {Strengforlengelse = url.substring (url.lastIndexOf (".")); int contentLength = page.getContentData (). lengde; // skriv innholdsdataene til en fil i lagringskatalogen}}

Kjører vår ImageCrawler ligner på å kjøre HttpCrawler, men vi må konfigurere den til å inkludere binært innhold:

CrawlConfig config = ny CrawlConfig (); config.setIncludeBinaryContentInCrawling (true); // ... samme som før CrawlController.WebCrawlerFactory fabrikk = () -> ny ImageCrawler (saveDir); controller.start (fabrikk, numCrawlers);

3.3. Samle data

Nå som vi har sett på et par grunnleggende eksempler, la oss utvide vårt HtmlCrawler for å samle inn noen grunnleggende statistikker under gjennomgangen.

La oss først definere en enkel klasse for å holde et par statistikker:

offentlig klasse CrawlerStatistics {private int prosessertPageCount = 0; private int totalLinksCount = 0; offentlig ugyldig incrementProcessedPageCount () {prosessertPageCount ++; } public void incrementTotalLinksCount (int linksCount) {totalLinksCount + = linksCount; } // standard getters}

La oss deretter endre vår HtmlCrawler å godta a CrawlerStatistics eksempel via en konstruktør:

privat CrawlerStatistics statistikk; public HtmlCrawler (CrawlerStatistics stats) {this.stats = stats; }

Med vår nye CrawlerStatistics objekt, la oss endre besøk metode for å samle det vi ønsker:

@ Overstyr offentlig ugyldig besøk (side side) {String url = page.getWebURL (). GetURL (); stats.incrementProcessedPageCount (); hvis (page.getParseData () forekomst av HtmlParseData) {HtmlParseData htmlParseData = (HtmlParseData) page.getParseData (); Streng tittel = htmlParseData.getTitle (); Strengtekst = htmlParseData.getText (); Streng html = htmlParseData.getHtml (); Sett lenker = htmlParseData.getOutgoingUrls (); stats.incrementTotalLinksCount (links.size ()); // gjør noe med innsamlede data}}

La oss nå gå tilbake til kontrolleren vår og gi den HtmlCrawler med en forekomst av CrawlerStatistics:

CrawlerStatistics stats = new CrawlerStatistics (); CrawlController.WebCrawlerFactory fabrikk = () -> ny HtmlCrawler (statistikk);

3.4. Flere crawlere

Basert på våre tidligere eksempler, la oss nå se på hvordan vi kan kjør flere crawlere fra samme kontroller.

Det anbefales det hver crawler bruker sin egen midlertidige lagringskatalog, så vi må opprette separate konfigurasjoner for hver enkelt vi skal kjøre.

De CrawlControllers kan dele en singel RobotstxtServer, men ellers trenger vi i utgangspunktet en kopi av alt.

Så langt har vi brukt CrawlController.start metode for å kjøre crawlerne våre og bemerket at det er en blokkeringsmetode. For å kjøre multipler bruker vi CrawlerControlller.startNonBlocking i forbindelse med CrawlController.waitUntilFinish.

La oss nå lage en kontroller for å kjøre HtmlCrawler og ImageCrawler samtidig:

Fil crawlStorageBase = ny fil ("src / test / resources / crawler4j"); CrawlConfig htmlConfig = ny CrawlConfig (); CrawlConfig imageConfig = ny CrawlConfig (); // Konfigurer lagringsmapper og andre konfigurasjoner PageFetcher pageFetcherHtml = ny PageFetcher (htmlConfig); PageFetcher pageFetcherImage = ny PageFetcher (imageConfig); RobotstxtConfig robotstxtConfig = ny RobotstxtConfig (); RobotstxtServer robotstxtServer = ny RobotstxtServer (robotstxtConfig, pageFetcherHtml); CrawlController htmlController = ny CrawlController (htmlConfig, pageFetcherHtml, robotstxtServer); CrawlController imageController = ny CrawlController (imageConfig, pageFetcherImage, robotstxtServer); // legg til seed URL-er CrawlerStatistics stats = new CrawlerStatistics (); CrawlController.WebCrawlerFactory htmlFactory = () -> ny HtmlCrawler (statistikk); File saveDir = new File ("src / test / resources / crawler4j"); CrawlController.WebCrawlerFactory imageFactory = () -> ny ImageCrawler (saveDir); imageController.startNonBlocking (imageFactory, 7); htmlController.startNonBlocking (htmlFactory, 10); htmlController.waitUntilFinish (); imageController.waitUntilFinish ();

4. Konfigurasjon

Vi har allerede sett noe av det vi kan konfigurere. La oss nå gå over noen andre vanlige innstillinger.

Innstillinger brukes på CrawlConfig eksempel vi spesifiserer i kontrolleren vår.

4.1. Begrenset gjennomsøkingsdybde

Som standard vil crawlerne våre krype så dypt de kan. For å begrense hvor dypt de skal gå, kan vi stille inn gjennomsøkingsdybden:

crawlConfig.setMaxDepthOfCrawling (2);

Seed URL-er anses å være på dybde 0, så en gjennomsøkingsdybde på 2 vil gå to lag utover frø-URL-en.

4.2. Maksimalt antall sider du skal hente

En annen måte å begrense hvor mange sider som søkerobotene våre dekker, er å angi maksimalt antall sider som skal gjennomsøkes:

crawlConfig.setMaxPagesToFetch (500);

4.3. Maksimum utgående lenker

Vi kan også begrense antall utgående lenker fulgt av hver side:

crawlConfig.setMaxOutgoingLinksToFollow (2000);

4.4. Høflighetsforsinkelse

Siden svært effektive crawlere lett kan være en belastning på webservere, har crawler4j det det kaller en høflighetsforsinkelse. Som standard er den satt til 200 millisekunder. Vi kan justere denne verdien hvis vi trenger å:

crawlConfig.setPolitenessDelay (300);

4.5. Inkluder binært innhold

Vi har allerede brukt alternativet for å inkludere binært innhold med vårt ImageCrawler:

crawlConfig.setIncludeBinaryContentInCrawling (true);

4.6. Inkluder HTTPS

Som standard vil crawlere inkludere HTTPS-sider, men vi kan slå det av:

crawlConfig.setIncludeHttpsPages (false);

4.7. Gjenvinnbar gjennomgang

Hvis vi har en langvarig crawler og vi vil at den skal gjenopptas automatisk, kan vi angi resumable crawling. Hvis du slår den på, kan den gå saktere:

crawlConfig.setResumableCrawling (true);

4.8. User-Agent String

Standard brukeragentstreng for crawler4j er crawler4j. La oss tilpasse det:

crawlConfig.setUserAgentString ("baeldung demo (//github.com/yasserg/crawler4j/)");

Vi har nettopp dekket noen av de grunnleggende konfigurasjonene her. Vi kan se på CrawConfig klasse hvis vi er interessert i noen av de mer avanserte eller uklare konfigurasjonsalternativene.

5. Konklusjon

I denne artikkelen har vi brukt crawler4j til å lage våre egne web-crawlere. Vi startet med to enkle eksempler på gjennomsøking av HTML og bilder. Så bygde vi på disse eksemplene for å se hvordan vi kan samle statistikk og kjøre flere crawlere samtidig.

De fulle kodeeksemplene er tilgjengelige på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found