1. 程式人生 > >crawler4j:輕量級多執行緒網路爬蟲

crawler4j:輕量級多執行緒網路爬蟲

crawler4j是Java實現的開源網路爬蟲。提供了簡單易用的介面,可以在幾分鐘內建立一個多執行緒網路爬蟲。

crawler4j

安裝

使用Maven

使用最新版本的crawler4j,在pom.xml中新增如下片段:

XHTML
1 2 3 4 5 <dependency>
<groupId>edu.uci.ics</groupId> <artifactId>crawler4j</artifactId> <version>4.1</version> </dependency>

不使用Maven

crawler4j的JAR包可以從releases pageMaven Central下載。 需要注意crawler4j包有幾個要依賴的包。在releases page下的crawler4j-X.Y-with-dependencies.jar包含了crawler4j的所有的依賴包。可以下載並新增到你的classpath中。

快速開始

使用crawler4j需要建立一個繼承WebCrawler的爬蟲類。下面是個簡單的例子:

Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 publicclassMyCrawlerextendsWebCrawler{ privatefinalstaticPattern FILTERS=Pattern.compile(".*(\\.(css|js|gif|jpg" +"|png|mp3|mp3|zip|gz))$"); /**      * This method receives two parameters. The first parameter is the page      * in which we have discovered this new url and the second parameter is      * the new url. You should implement this function to specify whether      * the given url should be crawled or not (based on your crawling logic).      * In this example, we are instructing the crawler to ignore urls that      * have css, js, git, ... extensions and to only accept urls that start      * with "http://www.ics.uci.edu/". In this case, we didn't need the      * referringPage parameter to make the decision.      */ @Override publicbooleanshouldVisit(Page referringPage,WebURL url){ Stringhref=url.getURL().toLowerCase(); return!FILTERS.matcher(href).matches() &&href.startsWith("http://www.ics.uci.edu/"); } /**       * This function is called when a page is fetched and ready       * to be processed by your program.       */ @Override publicvoidvisit(Page page){ Stringurl=page.getWebURL().getURL(); System.out.println("URL: "+url); if(page.getParseData()instanceofHtmlParseData){ HtmlParseData htmlParseData=(HtmlParseData)page.getParseData(); Stringtext=htmlParseData.getText(); Stringhtml=htmlParseData.getHtml(); Set<WebURL>links=htmlParseData.getOutgoingUrls(); System.out.println("Text length: "+text.length()); System.out.println("Html length: "+html.length()); System.out.println("Number of outgoing links: "+links.size()); } } }

上面的例子覆蓋了兩個主要方法:

  • shouldVisit:這個方法決定了要抓取的URL及其內容,例子中只允許抓取“www.ics.uci.edu”這個域的頁面,不允許.css、.js和多媒體等檔案。
  • visit:當URL下載完成會呼叫這個方法。你可以輕鬆獲取下載頁面的url, 文字, 連結, html,和唯一id等內容。

實現控制器類以制定抓取的種子(seed)、中間資料儲存的資料夾、併發執行緒的數目:

Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 publicclassController{ publicstaticvoidmain(String[]args)throwsException{ StringcrawlStorageFolder ="/data/crawl/root"; intnumberOfCrawlers =7; CrawlConfig config=newCrawlConfig(); config.setCrawlStorageFolder(crawlStorageFolder); /*          * Instantiate the controller for this crawl.          */ PageFetcher pageFetcher=newPageFetcher(config); RobotstxtConfig robotstxtConfig =newRobotstxtConfig(); RobotstxtServer robotstxtServer=newRobotstxtServer(robotstxtConfig,pageFetcher); CrawlController controller=newCrawlController(config,pageFetcher,robotstxtServer); /*          * For each crawl, you need to add some seed urls. These are the first          * URLs that are fetched and then the crawler starts following links          * which are found in these pages          */ controller.addSeed("http://www.ics.uci.edu/~lopes/"); controller.addSeed("http://www.ics.uci.edu/~welling/"); controller.addSeed("http://www.ics.uci.edu/"); /*          * Start the crawl. This is a blocking operation, meaning that your code          * will reach the line after this only when crawling is finished.          */ controller.start(MyCrawler.class,numberOfCrawlers); } }

例子介紹

  • Image crawler:一個簡單的圖片爬蟲:從指定域下載圖片並存在指定資料夾。這個例子演示了怎樣用crawler4j抓取二進位制內容。
  • Shutdown crawling:這個例子演示了可以通過向控制器傳送“shutdown”命令優雅的關閉抓取過程。

配置介紹

控制器類必須傳一個型別為CrawlConfig的引數,用於配置crawler4j。下面描述了一些關於配置的細節。

抓取深度

預設情況下沒有抓取深度的限制。可以通過配置來限制深度,比如,你有個種子頁面A連線到B,B又連線到C,C又連線到D。結構如下:

Java
1 A-->B-->C-->D

A是種子頁面深度為0,B為1,C、D以此類推。如:當設定抓取深度是2是,就不會抓取頁面D。抓取最大深度通過以下程式碼配置:

Java
1 crawlConfig.setMaxDepthOfCrawling(maxDepthOfCrawling);

頁面抓取的最大數量

預設情況下沒有抓取數量限制,可以通過以下程式碼配置:

Java
1 crawlConfig.setMaxPagesToFetch(maxPagesToFetch);

其他限制

crawler4j是高效的,有著極快的抓取能力(比如:每秒可以抓取200個Wikipedia頁面)。然而,這會給伺服器帶來很大的負荷(而伺服器可能會阻斷你的請求!)。所以,從1.3版開始,預設情況下,crawler4j每次請求前等待200毫秒。但是這個引數可以修改:

Java
1 crawlConfig.setPolitenessDelay(politenessDelay);

代理

使用下程式碼配置爬蟲通過代理:

Java
1 2 crawlConfig.setProxyHost("proxyserver.example.com"); crawlConfig.setProxyPort(8080);

如果你的代理需要認證:

Java
1 2 crawlConfig.setProxyUsername(username); crawlConfig.getProxyPassword(password);

抓取恢復

有時爬蟲需要執行很長時間,但中途可能意外終止了。這種情況下,可以通過以下配置恢復停止/崩潰的爬蟲:

Java
1 crawlConfig.setResumableCrawling(true);

然而,這可能對抓取速度稍有影響。

User-agent字串

User-agent字串用於向web伺服器表明你的爬蟲。User-agent詳解。 預設情況下crawler4j使用如下字串: “crawler4j (https://github.com/yasserg/crawler4j/)” 你可以通過配置修改:

Java
1 crawlConfig.setUserAgentString(userAgentString);

許可

Copyright (c) 2010-2015 Yasser Ganjisaffar