Vodič za Crawler4j

1. Uvod

Alati za indeksiranje weba vidimo svaki put kada koristimo našu omiljenu tražilicu. Također se često koriste za struganje i analizu podataka s web stranica.

U ovom uputstvu naučit ćemo kako koristiti crawler4j za postavljanje i pokretanje vlastitih web alata za indeksiranje. crawler4j je otvoreni izvorni Java projekt koji nam omogućuje da to lako učinimo.

2. Postavljanje

Upotrijebimo Maven Central za pronalaženje najnovije verzije i uvođenje ovisnosti o Mavenu:

 edu.uci.ics crawler4j 4.4.0 

3. Stvaranje alata za indeksiranje

3.1. Jednostavan HTML alat za indeksiranje

Za početak ćemo stvoriti osnovni alat za indeksiranje koji indeksira HTML stranice //baeldung.com.

Stvorimo svoj alat za indeksiranje proširivanjem WebCrawler u našoj klasi indeksiranja i definiranje uzorka za izuzeće određenih vrsta datoteka:

javna klasa HtmlCrawler proširuje WebCrawler js

U svakoj klasi indeksiranja, moramo nadjačati i primijeniti dvije metode: treba posjetiti i posjetiti.

Stvorimo svoje treba posjetiti metoda koja sada koristi ISKLJUČENJA uzorak koji smo stvorili:

@Override public boolean shouldVisit (Stranica koja se odnosi na stranicu, url za WebURL) {String urlString = url.getURL (). ToLowerCase (); return! ISKLJUČENJA.matcher (urlString) .matches () && urlString.startsWith ("// www.baeldung.com/"); }

Zatim možemo obaviti obradu posjećenih stranica u posjetiti metoda:

@Preuzmi javni void posjet (stranica stranice) {String url = page.getWebURL (). GetURL (); if (page.getParseData () instanceof HtmlParseData) {HtmlParseData htmlParseData = (HtmlParseData) page.getParseData (); Naslov niza = htmlParseData.getTitle (); Tekst niza = htmlParseData.getText (); Niz html = htmlParseData.getHtml (); Postavi veze = htmlParseData.getOutgoingUrls (); // učinite nešto sa prikupljenim podacima}}

Nakon što napišemo svoj alat za indeksiranje, moramo ga konfigurirati i pokrenuti:

Datoteka crawlStorage = nova datoteka ("src / test / resources / crawler4j"); CrawlConfig config = novi CrawlConfig (); config.setCrawlStorageFolder (crawlStorage.getAbsolutePath ()); int numCrawlers = 12; PageFetcher pageFetcher = novi PageFetcher (konfiguracija); RobotstxtConfig robotstxtConfig = novi RobotstxtConfig (); RobotstxtServer robotstxtServer = novi RobotstxtServer (robotstxtConfig, pageFetcher); CrawlController kontroler = novi CrawlController (config, pageFetcher, robotstxtServer); controller.addSeed ("// www.baeldung.com/"); CrawlController.WebCrawlerFactory factory = HtmlCrawler :: novo; controller.start (tvornica, numCrawlers);

Konfigurirali smo privremeni direktorij za pohranu, odredili broj niti za indeksiranje i pokrenuli indeksiranje s početnim URL-om.

To bismo također trebali primijetiti the CrawlController.start () metoda je operacija blokiranja. Bilo koji kod nakon tog poziva izvršit će se tek nakon što indeksiranje završi s radom.

3.2. ImageCrawler

Prema zadanim postavkama, crawler4j ne indeksira binarne podatke. U sljedećem ćemo primjeru uključiti tu funkcionalnost i indeksirajte sve JPEG-ove na Baeldungu.

Počnimo s definiranjem ImageCrawler klasa s konstruktorom koji uzima direktorij za spremanje slika:

javna klasa ImageCrawler proširuje WebCrawler {privatni završni statički uzorak ISKLJUČENJA = Uzorak.compile (". * (\. (css | js | xml | gif | png | mp3 | mp4 | zip | gz | pdf)) $"); privatni statički konačni uzorak IMG_PATTERNS = Uzorak.compile (". * (\. (jpg | jpeg)) $"); private File saveDir; javni ImageCrawler (Datoteka saveDir) {this.saveDir = saveDir; } // više koda}

Dalje, provedimo treba posjetiti metoda:

@Override public boolean shouldVisit (Stranica koja se odnosi na stranicu, url za WebURL) {String urlString = url.getURL (). ToLowerCase (); if (ISKLJUČENJA.matcher (urlString) .matches ()) {return false; } if (IMG_PATTERNS.matcher (urlString) .matches () || urlString.startsWith ("// www.baeldung.com/")) {return true; } return false; }

Sada smo spremni za implementaciju posjetiti metoda:

@Preuzmi javni void posjet (Stranica stranice) {String url = page.getWebURL (). GetURL (); if (IMG_PATTERNS.matcher (url) .matches () && page.getParseData () instanceof BinaryParseData) {String extension = url.substring (url.lastIndexOf (".")); int contentLength = page.getContentData (). length; // zapisivanje podataka o sadržaju u datoteku u direktorijumu spremanja}}

Trčanje naše ImageCrawler je slično pokretanju HttpCrawler, ali moramo ga konfigurirati tako da uključuje binarni sadržaj:

CrawlConfig config = novi CrawlConfig (); config.setIncludeBinaryContentInCrawling (true); // ... isto kao i prije CrawlController.WebCrawlerFactory factory = () -> novi ImageCrawler (saveDir); controller.start (tvornica, numCrawlers);

3.3. Prikupljanje podataka

Sad kad smo pogledali nekoliko osnovnih primjera, proširimo naš HtmlCrawler prikupiti neke osnovne statistike tijekom našeg indeksiranja.

Prvo definirajmo jednostavnu klasu koja će sadržavati nekoliko statistika:

javna klasa CrawlerStatistics {private int processingPageCount = 0; private int totalLinksCount = 0; javna praznina incrementProcessedPageCount () {obradenoPageCount ++; } javna void inkrementTotalLinksCount (int linksCount) {totalLinksCount + = linksCount; } // standardni dohvatnici}

Dalje, izmijenimo naš HtmlCrawler prihvatiti a Statistički podaci alata za indeksiranje primjer putem konstruktora:

privatne statistike CrawlerStatistics; javni HtmlCrawler (statistika CrawlerStatistics) {this.stats = statistika; }

S našim novim Statistički podaci alata za indeksiranje objekt, izmijenimo posjetiti metoda za prikupljanje onoga što želimo:

@Preuzmi javni void posjet (Stranica stranice) {String url = page.getWebURL (). GetURL (); stats.incrementProcessedPageCount (); if (page.getParseData () instanceof HtmlParseData) {HtmlParseData htmlParseData = (HtmlParseData) page.getParseData (); Naslov niza = htmlParseData.getTitle (); Tekst niza = htmlParseData.getText (); Niz html = htmlParseData.getHtml (); Postavi veze = htmlParseData.getOutgoingUrls (); stats.incrementTotalLinksCount (links.size ()); // učiniti nešto sa prikupljenim podacima}}

Vratimo se našem kontroloru i pružimo HtmlCrawler s primjerom od Statistički podaci alata za indeksiranje:

Statistika CrawlerStatistics = nova CrawlerStatistics (); CrawlController.WebCrawlerFactory factory = () -> novi HtmlCrawler (statistika);

3.4. Višestruki alati za indeksiranje

Nadovezujući se na naše prethodne primjere, pogledajmo sada kako možemo pokrenite više alata za indeksiranje iz istog kontrolera.

Preporučuje se da svaki alat za indeksiranje koristi svoj vlastiti direktorij za privremenu pohranu, tako da moramo stvoriti zasebne konfiguracije za svaku koju ćemo pokretati.

The CrawlControllers mogu dijeliti jednu RobotstxtServer, ali inače, u osnovi trebamo kopiju svega.

Do sada smo koristili CrawlController.start metodu za pokretanje naših alata za indeksiranje i primijetio sam da je to metoda blokiranja. Za pokretanje višestrukih vrijednosti koristit ćemo CrawlerControlller.startNonBlocking u spoju sa CrawlController.waitUntilFinish.

Sada, kreirajmo kontroler za pokretanje HtmlCrawler i ImageCrawler istovremeno:

Datoteka crawlStorageBase = nova datoteka ("src / test / resources / crawler4j"); CrawlConfig htmlConfig = novi CrawlConfig (); CrawlConfig imageConfig = novi CrawlConfig (); // Konfiguriranje mapa za pohranu i druge konfiguracije PageFetcher pageFetcherHtml = novi PageFetcher (htmlConfig); PageFetcher pageFetcherImage = novi PageFetcher (imageConfig); RobotstxtConfig robotstxtConfig = novi RobotstxtConfig (); RobotstxtServer robotstxtServer = novi RobotstxtServer (robotstxtConfig, pageFetcherHtml); CrawlController htmlController = novi CrawlController (htmlConfig, pageFetcherHtml, robotstxtServer); CrawlController imageController = novi CrawlController (imageConfig, pageFetcherImage, robotstxtServer); // dodavanje početnih URL-ova CrawlerStatistics statistika = novi CrawlerStatistics (); CrawlController.WebCrawlerFactory htmlFactory = () -> novi HtmlCrawler (statistika); Datoteka saveDir = nova datoteka ("src / test / resources / crawler4j"); CrawlController.WebCrawlerFactory imageFactory = () -> novi ImageCrawler (saveDir); imageController.startNonBlocking (imageFactory, 7); htmlController.startNonBlocking (htmlFactory, 10); htmlController.waitUntilFinish (); imageController.waitUntilFinish ();

4. Konfiguracija

Već smo vidjeli nešto od onoga što možemo konfigurirati. Idemo sada preko nekih drugih uobičajenih postavki.

Postavke se primjenjuju na CrawlConfig instancu koju specificiramo u našem kontroloru.

4.1. Ograničavanje dubine indeksiranja

Prema zadanim postavkama, naši će alati puzati što dublje mogu. Da bismo ograničili koliko duboko će ići, možemo postaviti dubinu indeksiranja:

crawlConfig.setMaxDepthOfCrawling (2);

Smatra se da su URL-ovi sjemena na dubini 0, pa će dubina indeksiranja 2 ići dva sloja dalje od URL-a sjemena.

4.2. Dohvat maksimalnog broja stranica

Drugi način da ograničite koliko će stranica obuhvaćati naši alati za indeksiranje je postavljanje maksimalnog broja stranica za indeksiranje:

crawlConfig.setMaxPagesToFetch (500);

4.3. Maksimalni broj odlaznih veza

Također možemo ograničiti broj odlaznih veza koje slijede sa svake stranice:

crawlConfig.setMaxOutgoingLinksToFollow (2000);

4.4. Kašnjenje uljudnosti

Budući da vrlo učinkoviti alati za indeksiranje lako mogu nategnuti web poslužitelje, crawler4j ima ono što naziva odgodom pristojnosti. Prema zadanim postavkama postavljeno je na 200 milisekundi. Ovu vrijednost možemo prilagoditi ako trebamo:

crawlConfig.setPolitenessDelay (300);

4.5. Uključite binarni sadržaj

Već smo koristili opciju za uključivanje binarnog sadržaja s našim ImageCrawler:

crawlConfig.setIncludeBinaryContentInCrawling (true);

4.6. Uključite HTTPS

Popisivači će prema zadanim postavkama uključivati ​​HTTPS stranice, ali to možemo isključiti:

crawlConfig.setIncludeHttpsPages (netačno);

4.7. Obnovljivo puzanje

Ako imamo dugotrajno indeksiranje i želimo da se automatski nastavi, možemo postaviti ponovno indeksiranje. Uključivanje može uzrokovati sporije pokretanje:

crawlConfig.setResumableCrawling (true);

4.8. Niz korisničkog agenta

Zadani niz korisničkog agenta za crawler4j je crawler4j. Prilagodimo to:

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

Ovdje smo upravo pokrili neke od osnovnih konfiguracija. Možemo pogledati CrawConfig klase ako nas zanimaju neke naprednije ili nejasne opcije konfiguracije.

5. Zaključak

U ovom smo članku koristili crawler4j za stvaranje vlastitih web alata za indeksiranje. Počeli smo s dva jednostavna primjera indeksiranja HTML-a i slika. Zatim smo na tim primjerima nastavili kako bismo vidjeli kako možemo prikupiti statistiku i istodobno pokretati više alata za indeksiranje.

Cjeloviti primjeri koda dostupni su na GitHubu.