crawler4j:輕量級多執行緒網路爬蟲
crawler4j是Java實現的開源網路爬蟲。提供了簡單易用的介面,可以在幾分鐘內建立一個多執行緒網路爬蟲。
安裝
使用Maven
使用最新版本的crawler4j,在pom.xml中新增如下片段:
XHTML1 2 3 4 5 |
<dependency> |
不使用Maven
crawler4j的JAR包可以從releases page和Maven Central下載。 需要注意crawler4j包有幾個要依賴的包。在releases page下的crawler4j-X.Y-with-dependencies.jar包含了crawler4j的所有的依賴包。可以下載並新增到你的classpath中。
快速開始
使用crawler4j需要建立一個繼承WebCrawler的爬蟲類。下面是個簡單的例子:
Java1 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)、中間資料儲存的資料夾、併發執行緒的數目:
Java1 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。結構如下:
Java1 | A-->B-->C-->D |
A是種子頁面深度為0,B為1,C、D以此類推。如:當設定抓取深度是2是,就不會抓取頁面D。抓取最大深度通過以下程式碼配置:
Java1 | crawlConfig.setMaxDepthOfCrawling(maxDepthOfCrawling); |
頁面抓取的最大數量
預設情況下沒有抓取數量限制,可以通過以下程式碼配置:
Java1 | crawlConfig.setMaxPagesToFetch(maxPagesToFetch); |
其他限制
crawler4j是高效的,有著極快的抓取能力(比如:每秒可以抓取200個Wikipedia頁面)。然而,這會給伺服器帶來很大的負荷(而伺服器可能會阻斷你的請求!)。所以,從1.3版開始,預設情況下,crawler4j每次請求前等待200毫秒。但是這個引數可以修改:
Java1 | crawlConfig.setPolitenessDelay(politenessDelay); |
代理
使用下程式碼配置爬蟲通過代理:
Java1 2 | crawlConfig.setProxyHost("proxyserver.example.com"); crawlConfig.setProxyPort(8080); |
如果你的代理需要認證:
Java1 2 | crawlConfig.setProxyUsername(username); crawlConfig.getProxyPassword(password); |
抓取恢復
有時爬蟲需要執行很長時間,但中途可能意外終止了。這種情況下,可以通過以下配置恢復停止/崩潰的爬蟲:
Java1 | crawlConfig.setResumableCrawling(true); |
然而,這可能對抓取速度稍有影響。
User-agent字串
User-agent字串用於向web伺服器表明你的爬蟲。User-agent詳解。 預設情況下crawler4j使用如下字串: “crawler4j (https://github.com/yasserg/crawler4j/)” 你可以通過配置修改:
Java1 | crawlConfig.setUserAgentString(userAgentString); |
許可
Copyright (c) 2010-2015 Yasser Ganjisaffar