Útmutató a Crawler4j-hez

1. Bemutatkozás

A webkeresőket minden alkalommal látjuk, amikor a kedvenc keresőmotorunkat használjuk. Ezeket gyakran használják weboldalak adatainak kaparására és elemzésére is.

Ebben az oktatóanyagban megtanuljuk, hogyan kell használni a crawler4j-t saját webrobotjaink beállításához és futtatásához. A crawler4j egy nyílt forráskódú Java projekt, amely lehetővé teszi számunkra, hogy ezt könnyen megtehessük.

2. Beállítás

A Maven Central segítségével keressük meg a legfrissebb verziót, és vigyük be a Maven függőséget:

 edu.uci.ics crawler4j 4.4.0 

3. Robotok létrehozása

3.1. Egyszerű HTML bejáró

Kezdjük azzal, hogy létrehozunk egy alapvető robotot, amely feltérképezi a HTML-oldalakat //baeldung.com.

Hosszabbítással hozzuk létre a bejárónkat WebCrawler bejáró osztályunkban, és meghatároz egy mintát bizonyos fájltípusok kizárására:

public class HtmlCrawler kiterjeszti a WebCrawler js-t

Minden lánctalpas osztályban két módszert felül kell írnunk és végrehajtanunk: shouldVisit és látogatás.

Hozzuk létre a sajátunkat shouldVisit módszer most a KIZÁRÁSOK az általunk létrehozott minta:

@Orride public boolean shouldVisit (Page referingPage, WebURL url) {String urlString = url.getURL (). ToLowerCase (); visszatér! EXCLUSIONS.matcher (urlString) .matches () && urlString.startsWith ("// www.baeldung.com/"); }

Ezután elvégezhetjük a meglátogatott oldalak feldolgozását a látogatás módszer:

@Orride public void visit (Oldaloldal) {String url = page.getWebURL (). GetURL (); if (page.getParseData () HtmlParseData példány) {HtmlParseData htmlParseData = (HtmlParseData) page.getParseData (); Karakterlánc címe = htmlParseData.getTitle (); Karakterlánc szöveg = htmlParseData.getText (); Karakterlánc html = htmlParseData.getHtml (); Set links = htmlParseData.getOutgoingUrls (); // tegyen valamit az összegyűjtött adatokkal}}

Miután beírtuk a robotunkat, konfigurálnunk és futtatnunk kell:

File crawlStorage = new File ("src / test / resources / crawler4j"); CrawlConfig config = new CrawlConfig (); config.setCrawlStorageFolder (crawlStorage.getAbsolutePath ()); int numCrawlers = 12; PageFetcher pageFetcher = új PageFetcher (konfiguráció); RobotstxtConfig robotstxtConfig = új RobotstxtConfig (); RobotstxtServer robotstxtServer = új RobotstxtServer (robotstxtConfig, pageFetcher); CrawlController vezérlő = new CrawlController (config, pageFetcher, robotstxtServer); controller.addSeed ("// www.baeldung.com/"); CrawlController.WebCrawlerFactory factory = HtmlCrawler :: new; controller.start (gyár, numCrawlers);

Konfiguráltunk egy ideiglenes tárolási könyvtárat, meghatároztuk a feltérképező szálak számát, és beindítottuk a bejárót egy kezdő URL-lel.

Azt is meg kell jegyeznünk a CrawlController.start () A módszer egy blokkoló művelet. Bármelyik kód a hívás után csak akkor fog végrehajtódni, ha a bejáró befejezte a futást.

3.2. ImageCrawler

Alapértelmezés szerint a crawler4j nem feltérképezi a bináris adatokat. Ebben a következő példában bekapcsoljuk ezt a funkciót és bejárja az összes JPEG-t a Baeldungon.

Kezdjük azzal, hogy meghatározzuk a ImageCrawler osztály egy konstruktorral, amely könyvtárat vesz a képek mentéséhez:

public class ImageCrawler kiterjeszti a WebCrawlert {private final static Pattern EXCLUSIONS = Pattern.compile (". * (\. (css | js | xml | gif | png | mp3 | mp4 | zip | gz | pdf)) $"); privát statikus végleges minta IMG_PATTERNS = Pattern.compile (". * (\. (jpg | jpeg)) $"); privát File saveDir; public ImageCrawler (File saveDir) {this.saveDir = saveDir; } // további kód}

Ezután hajtsuk végre a shouldVisit módszer:

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

Most készen állunk a látogatás módszer:

@Orride public void visit (Oldaloldal) {String url = page.getWebURL (). GetURL (); if (IMG_PATTERNS.matcher (url) .matches () && page.getParseData () instanceof BinaryParseData) {String kiterjesztés = url.substring (url.lastIndexOf (".")); int contentLength = page.getContentData (). hossz; // írja a tartalmi adatokat egy fájlba a mentési könyvtárba}}

Futva a mi ImageCrawler hasonló a HttpCrawler, de be kell állítanunk, hogy bináris tartalmat is tartalmazzon:

CrawlConfig config = new CrawlConfig (); config.setIncludeBinaryContentInCrawling (true); // ... ugyanaz, mint korábban CrawlController.WebCrawlerFactory factory = () -> new ImageCrawler (saveDir); controller.start (gyár, numCrawlers);

3.3. Adatgyűjtés

Most, hogy megnéztünk néhány alapvető példát, bővítsük ki a példáinkat HtmlCrawler hogy feltérképezésünk során összegyűjtsünk néhány alapvető statisztikát.

Először határozzunk meg egy egyszerű osztályt néhány statisztika megtartásához:

nyilvános osztály CrawlerStatistics {private int processingPageCount = 0; private int totalLinksCount = 0; public void incrementProcessedPageCount () {feldolgozottPageCount ++; } public void incrementTotalLinksCount (int linksCount) {totalLinksCount + = linksCount; } // standard getters}

Ezután módosítsuk HtmlCrawler elfogadni a Lánctalpas statisztika például egy konstruktoron keresztül:

privát CrawlerStatistics statisztikák; public HtmlCrawler (CrawlerStatistics stats) {this.stats = stats; }

Újunkkal Lánctalpas statisztika objektumot, módosítsuk a látogatás módszer a kívánt adatok gyűjtésére:

@Orride public void visit (Oldaloldal) {String url = page.getWebURL (). GetURL (); stats.incrementProcessedPageCount (); if (page.getParseData () HtmlParseData példány) {HtmlParseData htmlParseData = (HtmlParseData) page.getParseData (); Karakterlánc címe = htmlParseData.getTitle (); Karakterlánc szöveg = htmlParseData.getText (); Karakterlánc html = htmlParseData.getHtml (); Set links = htmlParseData.getOutgoingUrls (); stats.incrementTotalLinksCount (links.size ()); // tegyen valamit összegyűjtött adatokkal}}

Most térjünk vissza vezérlőnkhöz, és adjuk meg a HtmlCrawler példányával Lánctalpas statisztika:

CrawlerStatistics stats = új CrawlerStatistics (); CrawlController.WebCrawlerFactory factory = () -> new HtmlCrawler (stats);

3.4. Több robot

Korábbi példáinkra építve most nézzük meg, hogyan tudunk futtasson több robotot ugyanabból a vezérlőből.

Ezt ajánlják minden bejáró a saját ideiglenes tárolási könyvtárát használja, ezért külön konfigurációkat kell létrehoznunk mindegyik futtatáshoz.

A CrawlControllers megoszthat egyetlen RobotstxtServer, de különben alapvetően szükségünk van minden másolatára.

Eddig a CrawlController.start metódust futtatva bejáróinkat, és megjegyezte, hogy ez egy blokkoló módszer. Többszörös futtatásához használjuk CrawlerControlller.startNonBlocking összefüggésben a CrawlController.waitUntilFinish.

Most hozzunk létre egy vezérlőt a futtatáshoz HtmlCrawler és ImageCrawler egyidejűleg:

File crawlStorageBase = new File ("src / test / resources / crawler4j"); CrawlConfig htmlConfig = new CrawlConfig (); CrawlConfig imageConfig = new CrawlConfig (); // Tárolómappák és egyéb konfigurációk konfigurálása PageFetcher pageFetcherHtml = új PageFetcher (htmlConfig); PageFetcher pageFetcherImage = új PageFetcher (imageConfig); RobotstxtConfig robotstxtConfig = új RobotstxtConfig (); RobotstxtServer robotstxtServer = új RobotstxtServer (robotstxtConfig, pageFetcherHtml); CrawlController htmlController = új CrawlController (htmlConfig, pageFetcherHtml, robotstxtServer); CrawlController imageController = új CrawlController (imageConfig, pageFetcherImage, robotstxtServer); // mag URL-ek hozzáadása CrawlerStatistics stats = new CrawlerStatistics (); CrawlController.WebCrawlerFactory htmlFactory = () -> new HtmlCrawler (stats); File saveDir = új fájl ("src / test / resources / crawler4j"); CrawlController.WebCrawlerFactory imageFactory = () -> új ImageCrawler (saveDir); imageController.startNonBlocking (imageFactory, 7); htmlController.startNonBlocking (htmlFactory, 10); htmlController.waitUntilFinish (); imageController.waitUntilFinish ();

4. Konfiguráció

Már láthattunk néhányat, amit beállíthatunk. Most nézzük át néhány más általános beállítást.

A beállítások a CrawlConfig példányt adunk meg a kontrollerünkben.

4.1. A feltérképezési mélység korlátozása

Alapértelmezés szerint bejáróink a lehető legmélyebben fognak feltérképezni. Annak érdekében, hogy korlátozzuk a mélységüket, beállíthatjuk a feltérképezési mélységet:

crawlConfig.setMaxDepthOfCrawling (2);

A mag URL-eket 0 mélységűnek tekintjük, így a 2 feltérképezési mélység két réteggel megy túl a mag URL-jén.

4.2. Maximális letöltendő oldalak száma

A bejárók által lefedett oldalak korlátozásának másik módja az, ha beállítja a feltérképezni kívánt oldalak maximális számát:

crawlConfig.setMaxPagesToFetch (500);

4.3. Kimenő linkek maximális száma

Korlátozhatjuk az egyes oldalakról követett kimenő linkek számát is:

crawlConfig.setMaxOutgoingLinksToFollow (2000);

4.4. Udvariasság késése

Mivel a nagyon hatékony bejárók könnyen megterhelhetik a webszervereket, a crawler4j-nek udvariassági késése van. Alapértelmezés szerint 200 milliszekundumra van állítva. Beállíthatjuk ezt az értéket, ha:

crawlConfig.setPolitenessDelay (300);

4.5. Tartalmazza a bináris tartalmat

Már alkalmaztuk a bináris tartalom beépítésének lehetőségét a mi fájlunkba ImageCrawler:

crawlConfig.setIncludeBinaryContentInCrawling (true);

4.6. Tartalmazza a HTTPS-t

Alapértelmezés szerint a robotok tartalmazzák a HTTPS-oldalakat, de ezt kikapcsolhatjuk:

crawlConfig.setIncludeHttpsPages (hamis);

4.7. Folytatható feltérképezés

Ha régóta futó bejárónk van, és azt akarjuk, hogy automatikusan folytatódjon, beállíthatjuk a folytatható bejárást. Bekapcsolása lassabb futást okozhat:

crawlConfig.setResumableCrawling (true);

4.8. Felhasználó-ügynök karakterlánc

A crawler4j alapértelmezett user-agent karakterlánca crawler4j. Testreszabjuk ezt:

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

Az alábbiakban bemutattuk az alapvető konfigurációk néhányat. Megnézhetjük CrawConfig osztály, ha érdekel néhány fejlettebb vagy homályosabb konfigurációs lehetőség.

5. Következtetés

Ebben a cikkben a crawler4j segítségével készítettük saját webrobotjainkat. Két egyszerű példával kezdtük a HTML és a képek feltérképezését. Ezután ezekre a példákra építettük, hogy lássuk, hogyan lehet statisztikákat gyűjteni és több robotot egyidejűleg futtatni.

A teljes kód példák a GitHub oldalon érhetők el.


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