Ú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.