En guide til Crawler4j

1. Introduktion

Vi ser webcrawlere i brug hver gang vi bruger vores foretrukne søgemaskine. De bruges også ofte til at skrabe og analysere data fra websteder.

I denne vejledning lærer vi, hvordan vi bruger crawler4j til at oprette og køre vores egne webcrawlere. crawler4j er et open source Java-projekt, der giver os mulighed for at gøre dette let.

2. Opsætning

Lad os bruge Maven Central til at finde den nyeste version og bringe Maven afhængighed:

 edu.uci.ics crawler4j 4.4.0 

3. Oprettelse af crawlere

3.1. Enkel HTML-crawler

Vi starter med at oprette en grundlæggende webcrawler, der gennemsøger HTML-siderne på //baeldung.com.

Lad os oprette vores crawler ved at udvide WebCrawler i vores crawlerklasse og definerer et mønster for at udelukke bestemte filtyper:

offentlig klasse HtmlCrawler udvider WebCrawler js

I hver crawler klasse, vi skal tilsidesætte og implementere to metoder: skal besøge og besøg.

Lad os skabe vores skal besøge metode nu ved hjælp af UDELUKKELSER mønster vi skabte:

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

Derefter kan vi udføre vores behandling af besøgte sider i besøg metode:

@Override offentligt ugyldigt besøg (side side) {String url = page.getWebURL (). GetURL (); hvis (page.getParseData () forekomst af HtmlParseData) {HtmlParseData htmlParseData = (HtmlParseData) page.getParseData (); String title = htmlParseData.getTitle (); Strengtekst = htmlParseData.getText (); Streng html = htmlParseData.getHtml (); Indstil links = htmlParseData.getOutgoingUrls (); // gør noget med de indsamlede data}}

Når vi har skrevet vores crawler, skal vi konfigurere og køre den:

Fil crawlStorage = ny fil ("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 fabrik = HtmlCrawler :: ny; controller.start (fabrik, numCrawlers);

Vi konfigurerede en midlertidig opbevaringsmappe, specificerede antallet af gennemgangstråde og såede webcrawleren med en start-URL.

Vi skal også bemærke det det CrawlController.start () metoden er en blokering. Enhver kode efter dette opkald udføres kun, når webcrawleren er færdig med at køre.

3.2. ImageCrawler

Som standard gennemgår crawler4j ikke binære data. I dette næste eksempel tænder vi for denne funktionalitet og gennemgå alle JPEG'erne på Baeldung.

Lad os starte med at definere ImageCrawler klasse med en konstruktør, der tager et bibliotek til lagring af billeder:

offentlig klasse ImageCrawler udvider WebCrawler {privat endelig statisk mønster EKSKLUSIONER = Pattern.compile (". * (\. (css | js | xml | gif | png | mp3 | mp4 | zip | gz | pdf)) $"); privat statisk endelig mønster IMG_PATTERNS = Mønster.kompil (". * (\. (jpg | jpeg)) $"); privat fil saveDir; offentlig ImageCrawler (File saveDir) {this.saveDir = saveDir; } // mere kode}

Lad os derefter implementere skal besøge 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; }

Nu er vi klar til at implementere besøg metode:

@Override offentligt ugyldigt besøg (side side) {String url = page.getWebURL (). GetURL (); hvis (IMG_PATTERNS.matcher (url) .matches () && page.getParseData () forekomst af BinaryParseData) {Strengeforlængelse = url.substring (url.lastIndexOf (".")); int contentLength = page.getContentData (). længde; // skriv indholdsdataene til en fil i gemmappen}}

Kører vores ImageCrawler svarer til at køre HttpCrawler, men vi skal konfigurere det til at omfatte binært indhold:

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

3.3. Indsamling af data

Nu hvor vi har set på et par grundlæggende eksempler, lad os udvide vores HtmlCrawler at indsamle nogle grundlæggende statistikker under vores gennemgang.

Lad os først definere en simpel klasse til at holde et par statistikker:

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

Lad os derefter ændre vores HtmlCrawler at acceptere en CrawlerStatistics eksempel via en konstruktør:

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

Med vores nye CrawlerStatistics objekt, lad os ændre besøg metode til at indsamle det, vi ønsker:

@Override offentligt ugyldigt besøg (side side) {String url = page.getWebURL (). GetURL (); stats.incrementProcessedPageCount (); hvis (page.getParseData () forekomst af HtmlParseData) {HtmlParseData htmlParseData = (HtmlParseData) page.getParseData (); String title = htmlParseData.getTitle (); Strengtekst = htmlParseData.getText (); Streng html = htmlParseData.getHtml (); Sæt links = htmlParseData.getOutgoingUrls (); stats.incrementTotalLinksCount (links.size ()); // gør noget med indsamlede data}}

Lad os nu gå tilbage til vores controller og give den HtmlCrawler med en forekomst af CrawlerStatistics:

CrawlerStatistics statistik = ny CrawlerStatistics (); CrawlController.WebCrawlerFactory fabrik = () -> ny HtmlCrawler (statistik);

3.4. Flere crawlere

Baseret på vores tidligere eksempler, lad os nu se på, hvordan vi kan kør flere crawlere fra den samme controller.

Det anbefales det hver crawler bruger sin egen midlertidige lagringsmappe, så vi er nødt til at oprette separate konfigurationer for hver enkelt, vi kører.

Det CrawlControllers kan dele en enkelt RobotstxtServer, men ellers har vi stort set brug for en kopi af alt.

Indtil videre har vi brugt CrawlController.start metode til at køre vores crawlere og bemærkede, at det er en blokeringsmetode. For at køre multipler bruger vi CrawlerControlller.startNonBlocking i forbindelse med CrawlController.waitUntilFinish.

Lad os nu oprette en controller, der skal køre HtmlCrawler og ImageCrawler samtidigt:

Fil crawlStorageBase = ny fil ("src / test / resources / crawler4j"); CrawlConfig htmlConfig = ny CrawlConfig (); CrawlConfig imageConfig = ny CrawlConfig (); // Konfigurer lagermapper og andre konfigurationer 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); // tilføj seed URLs CrawlerStatistics stats = new CrawlerStatistics (); CrawlController.WebCrawlerFactory htmlFactory = () -> ny HtmlCrawler (statistik); 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. Konfiguration

Vi har allerede set noget af det, vi kan konfigurere. Lad os nu gå over nogle andre almindelige indstillinger.

Indstillinger anvendes på CrawlConfig eksempel angiver vi i vores controller.

4.1. Begrænsning af gennemsøgningsdybde

Som standard vil vores crawlere kravle så dybt som muligt. For at begrænse, hvor dybt de går, kan vi indstille gennemsøgningsdybden:

crawlConfig.setMaxDepthOfCrawling (2);

Seed URL-adresser anses for at være på dybde 0, så en gennemsøgningsdybde på 2 vil gå to lag ud over frø-URL'en.

4.2. Maksimalt antal sider, der skal hentes

En anden måde at begrænse, hvor mange sider vores webcrawlere dækker, er at indstille det maksimale antal sider, der skal crawles:

crawlConfig.setMaxPagesToFetch (500);

4.3. Maksimum udgående links

Vi kan også begrænse antallet af udgående links, der følger efter hver side:

crawlConfig.setMaxOutgoingLinksToFollow (2000);

4.4. Høflighedsforsinkelse

Da meget effektive crawlere let kan være en belastning for webservere, har crawler4j det, det kalder en høflighedsforsinkelse. Som standard er den indstillet til 200 millisekunder. Vi kan justere denne værdi, hvis vi har brug for:

crawlConfig.setPolitenessDelay (300);

4.5. Inkluder binært indhold

Vi har allerede brugt muligheden for at inkludere binært indhold i vores ImageCrawler:

crawlConfig.setIncludeBinaryContentInCrawling (sand);

4.6. Inkluder HTTPS

Som standard inkluderer crawlere HTTPS-sider, men vi kan slå det fra:

crawlConfig.setIncludeHttpsPages (false);

4.7. Genoptagelig gennemgang

Hvis vi har en langvarig crawler, og vi ønsker, at den genoptages automatisk, kan vi indstille genoptagelig crawling. Hvis du tænder den, kan den køre langsommere:

crawlConfig.setResumableCrawling (sand);

4.8. User-Agent String

Standardstreng for brugeragent til crawler4j er crawler4j. Lad os tilpasse det:

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

Vi har lige dækket nogle af de grundlæggende konfigurationer her. Vi kan se på CrawConfig klasse, hvis vi er interesseret i nogle af de mere avancerede eller uklare konfigurationsmuligheder.

5. Konklusion

I denne artikel har vi brugt crawler4j til at oprette vores egne webcrawlere. Vi startede med to enkle eksempler på gennemgang af HTML og billeder. Derefter byggede vi på disse eksempler for at se, hvordan vi kan indsamle statistikker og køre flere crawlere samtidigt.

De fulde kodeeksempler er tilgængelige på GitHub.