Sprievodca po Crawler4j

1. Úvod

Vidíme, ako sa webové prehľadávače používajú zakaždým, keď používame náš obľúbený vyhľadávací nástroj. Bežne sa tiež používajú na zoškrabanie a analýzu údajov z webových stránok.

V tomto výučbe sa naučíme, ako používať crawler4j na nastavenie a spustenie našich vlastných webových prehľadávačov. crawler4j je open source projekt Java, ktorý nám to umožňuje ľahko.

2. Inštalácia

Použime Maven Central na nájdenie najnovšej verzie a zavedenie závislosti Maven:

 edu.uci.ics crawler4j 4.4.0 

3. Vytváranie crawlerov

3.1. Jednoduchý indexový prehľadávač HTML

Začneme vytvorením základného prehľadávača, ktorý prehľadáva stránky HTML //baeldung.com.

Vytvorme náš prehľadávač rozšírením WebCrawler v našej triede prehľadávača a definovanie vzoru na vylúčenie určitých typov súborov:

verejná trieda HtmlCrawler rozširuje WebCrawler js

V každej triede prehľadávačov musíme prekonať a implementovať dve metódy: mali by ste navštíviť a navštíviť.

Poďme vytvoriť naše mali by ste navštíviť metóda, ktorá teraz používa VÝLUKY vzor, ​​ktorý sme vytvorili:

@Override public boolean shouldVisit (stránka referringPage, adresa URL WebURL) {String urlString = url.getURL (). ToLowerCase (); vráťte sa! EXCLUSIONS.matcher (urlString) .matches () && urlString.startsWith ("// www.baeldung.com/"); }

Potom môžeme vykonať naše spracovanie navštívených stránok v serveri navštíviť metóda:

@ Override verejná neplatná návšteva (stránka stránky) {String url = page.getWebURL (). GetURL (); if (page.getParseData () instanceof HtmlParseData) {HtmlParseData htmlParseData = (HtmlParseData) page.getParseData (); Názov reťazca = htmlParseData.getTitle (); Reťazec text = htmlParseData.getText (); Reťazec html = htmlParseData.getHtml (); Nastaviť odkazy = htmlParseData.getOutgoingUrls (); // urob niečo so zhromaždenými údajmi}}

Keď už máme náš prehľadávač napísaný, musíme ho nakonfigurovať a spustiť:

Súbor crawlStorage = nový súbor ("src / test / resources / crawler4j"); Konfigurácia CrawlConfig = nová CrawlConfig (); config.setCrawlStorageFolder (crawlStorage.getAbsolutePath ()); int numCrawlers = 12; PageFetcher pageFetcher = nový PageFetcher (konfigurácia); RobotstxtConfig robotstxtConfig = nový RobotstxtConfig (); RobotstxtServer robotstxtServer = nový RobotstxtServer (robotstxtConfig, pageFetcher); Ovládač CrawlController = nový CrawlController (config, pageFetcher, robotstxtServer); controller.addSeed ("// www.baeldung.com/"); CrawlController.WebCrawlerFactory factory = HtmlCrawler :: nový; controller.start (továreň, numCrawlers);

Nakonfigurovali sme adresár dočasného úložiska, určili sme počet prehľadávacích vlákien a naštartovali sme prehľadávač počiatočnou adresou URL.

Mali by sme si to tiež uvedomiť the CrawlController.start () metóda je blokujúca operácia. Akýkoľvek kód po tomto hovore sa vykoná až po dokončení spustenia prehľadávača.

3.2. ImageCrawler

V predvolenom nastavení crawler4j neprechádza binárne údaje. V tomto ďalšom príklade zapneme túto funkcionalitu a prehľadávať všetky JPEG na Baeldungu.

Začnime definovaním ImageCrawler trieda s konštruktorom, ktorý prevezme adresár na ukladanie obrázkov:

public class ImageCrawler extends WebCrawler {private final static Pattern EXCLUSIONS = Pattern.compile (". * (\. (css | js | xml | gif | png | mp3 | mp4 | zip | gz | pdf)) $"); private static final Pattern IMG_PATTERNS = Pattern.compile (". * (\. (jpg | jpeg)) $"); súkromný súbor saveDir; public ImageCrawler (File saveDir) {this.saveDir = saveDir; } // ďalší kód}

Ďalej poďme implementovať mali by ste navštíviť metóda:

@Override public boolean shouldVisit (stránka referringPage, adresa URL WebURL) {String urlString = url.getURL (). ToLowerCase (); if (EXCLUSIONS.matcher (urlString) .matches ()) {return false; } if (IMG_PATTERNS.matcher (urlString) .matches () || urlString.startsWith ("// www.baeldung.com/")) {return true; } return false; }

Teraz sme pripravení implementovať navštíviť metóda:

@ Override verejná neplatná návšteva (stránka stránky) {String url = page.getWebURL (). GetURL (); if (IMG_PATTERNS.matcher (url) .matches () && page.getParseData () instanceof BinaryParseData) {rozšírenie reťazca = url.substring (url.lastIndexOf (".")); int contentLength = page.getContentData (). dĺžka; // zapíše údaje o obsahu do súboru v ukladacom adresári}}

Beží náš ImageCrawler je podobné spusteniu HttpCrawler, ale musíme ho nakonfigurovať tak, aby obsahoval binárny obsah:

Konfigurácia CrawlConfig = nová CrawlConfig (); config.setIncludeBinaryContentInCrawling (true); // ... rovnako ako predtým CrawlController.WebCrawlerFactory factory = () -> nový ImageCrawler (saveDir); controller.start (továreň, numCrawlers);

3.3. Zhromažďovanie údajov

Teraz, keď sme sa pozreli na niekoľko základných príkladov, rozviňme sa ďalej HtmlCrawler zhromažďovať niektoré základné štatistiky počas nášho indexového prehľadávania.

Najskôr definujme jednoduchú triedu na uchovávanie niekoľkých štatistík:

verejná trieda CrawlerStatistics {private int processingPageCount = 0; private int totalLinksCount = 0; public void incrementProcessedPageCount () {processingPageCount ++; } public void incrementTotalLinksCount (int linksCount) {totalLinksCount + = linksCount; } // štandardné vyhľadávače}

Ďalej upravme naše HtmlCrawler prijať a CrawlerStatistics inštancia prostredníctvom konštruktora:

súkromné ​​štatistiky CrawlerStatistics; public HtmlCrawler (CrawlerStatistics statistics) {this.stats = stats; }

S našou novinkou CrawlerStatistics objekt, upravme navštíviť metóda zhromažďovania toho, čo chceme:

@ Verejná neplatná návšteva (stránka stránky) {String url = page.getWebURL (). GetURL (); stats.incrementProcessedPageCount (); if (page.getParseData () instanceof HtmlParseData) {HtmlParseData htmlParseData = (HtmlParseData) page.getParseData (); Názov reťazca = htmlParseData.getTitle (); Reťazec text = htmlParseData.getText (); Reťazec html = htmlParseData.getHtml (); Nastaviť odkazy = htmlParseData.getOutgoingUrls (); stats.incrementTotalLinksCount (links.size ()); // urob niečo so zhromaždenými údajmi}}

Poďme späť k nášmu kontrolórovi a poskytnime HtmlCrawler s inštanciou CrawlerStatistics:

CrawlerStatistics statistics = new CrawlerStatistics (); CrawlController.WebCrawlerFactory factory = () -> nový HtmlCrawler (štatistika);

3.4. Viac crawlerov

Na základe našich predchádzajúcich príkladov sa poďme teraz pozrieť na to, ako môžeme spustiť viac prehľadávačov z rovnakého radiča.

Odporúča sa to každý prehľadávač používa svoj vlastný adresár dočasného úložiska, takže musíme vytvoriť samostatnú konfiguráciu pre každú z nich, ktorú budeme používať.

The CrawlControlers môže zdieľať jediný RobotstxtServer, ale inak v podstate potrebujeme kópiu všetkého.

Doteraz sme používali CrawlController.start spustiť naše prehľadávače a všimli sme si, že je to metóda blokovania. Na spustenie násobkov použijeme CrawlerControlller.startNonBlocking v súvislosti s CrawlController.waitUntilFinish.

Teraz vytvorme radič, ktorý sa má spustiť HtmlCrawler a ImageCrawler súčasne:

Súbor crawlStorageBase = nový súbor ("src / test / resources / crawler4j"); CrawlConfig htmlConfig = nový CrawlConfig (); CrawlConfig imageConfig = nový CrawlConfig (); // Konfigurácia priečinkov úložiska a ďalších konfigurácií PageFetcher pageFetcherHtml = nový PageFetcher (htmlConfig); PageFetcher pageFetcherImage = nový PageFetcher (imageConfig); RobotstxtConfig robotstxtConfig = nový RobotstxtConfig (); RobotstxtServer robotstxtServer = nový RobotstxtServer (robotstxtConfig, pageFetcherHtml); CrawlController htmlController = nový CrawlController (htmlConfig, pageFetcherHtml, robotstxtServer); CrawlController imageController = nový CrawlController (imageConfig, pageFetcherImage, robotstxtServer); // pridať počiatočné adresy URL CrawlerStatistics statistics = new CrawlerStatistics (); CrawlController.WebCrawlerFactory htmlFactory = () -> nový HtmlCrawler (štatistika); Súbor saveDir = nový súbor ("src / test / resources / crawler4j"); CrawlController.WebCrawlerFactory imageFactory = () -> nový ImageCrawler (saveDir); imageController.startNonBlocking (imageFactory, 7); htmlController.startNonBlocking (htmlFactory, 10); htmlController.waitUntilFinish (); imageController.waitUntilFinish ();

4. Konfigurácia

Niektoré z toho, čo môžeme nakonfigurovať, sme už videli. Poďme si prejsť na niektoré ďalšie bežné nastavenia.

Nastavenia sa použijú pre CrawlConfig inštanciu, ktorú zadáme v našom radiči.

4.1. Obmedzenie hĺbky indexového prehľadávania

Naše prehľadávače budú predvolene prechádzať čo najhlbšie. Aby sme obmedzili ich hĺbku, môžeme nastaviť hĺbku prehľadávania:

crawlConfig.setMaxDepthOfCrawling (2);

Počiatočné adresy URL sa považujú za hĺbku 0, takže hĺbka indexového prehľadávania 2 presiahne dve vrstvy za pôvodnú adresu URL.

4.2. Maximálny počet stránok na načítanie

Ďalším spôsobom, ako obmedziť počet stránok, ktoré naše prehľadávače pokryjú, je nastavenie maximálneho počtu stránok na prehľadávanie:

crawlConfig.setMaxPagesToFetch (500);

4.3. Maximálny počet odchádzajúcich odkazov

Môžeme tiež obmedziť počet odchádzajúcich odkazov sledovaných na každej stránke:

crawlConfig.setMaxOutgoingLinksToFollow (2000);

4.4. Oneskorenie zdvorilosti

Pretože veľmi efektívne prehľadávače môžu byť pre webové servery ľahko záťažou, má crawler4j takzvané zdvorilostné oneskorenie. Predvolene je nastavená na 200 milisekúnd. Túto hodnotu môžeme upraviť, ak potrebujeme:

crawlConfig.setPolitenessDelay (300);

4.5. Zahrnúť binárny obsah

Možnosť zahrnutia binárneho obsahu do našej sme už využili ImageCrawler:

crawlConfig.setIncludeBinaryContentInCrawling (true);

4.6. Zahrnúť HTTPS

V predvolenom nastavení budú prehľadávače obsahovať stránky HTTPS, môžeme to však vypnúť:

crawlConfig.setIncludeHttpsPages (false);

4.7. Obnoviteľné indexové prehľadávanie

Ak máme dlho bežiaci prehľadávač a chceme, aby sa automaticky obnovoval, môžeme nastaviť obnoviteľné prehľadávanie. Zapnutie môže spôsobiť pomalšie fungovanie:

crawlConfig.setResumableCrawling (true);

4.8. Reťazec User-Agent

Predvolený reťazec user-agent pre crawler4j je crawler4j. Prispôsobme si to:

crawlConfig.setUserAgentString ("ukážka baeldung (//github.com/yasserg/crawler4j/)");

Práve sme tu prebrali niektoré základné konfigurácie. Môžeme sa pozrieť na CrawConfig triedy, ak nás zaujímajú niektoré z pokročilejších alebo nejasných možností konfigurácie.

5. Záver

V tomto článku sme použili crawler4j na vytvorenie vlastných webových prehľadávačov. Začali sme dvoma jednoduchými príkladmi prehľadávania HTML a obrázkov. Potom sme na týchto príkladoch stavali, aby sme zistili, ako môžeme zhromažďovať štatistické údaje a súčasne spúšťať viac prehľadávačov.

Príklady úplného kódu sú k dispozícii na GitHub.