Java開源爬蟲框架crawler4j

花了兩個小時把Java開源爬蟲框架crawler4j文檔翻譯了一下,由於這幾天一直在學習Java爬蟲方面的知識,今天上課時忽然感受全英文可能會阻礙不少人學習的動力,恰好本身又正在接觸這個爬蟲框架,因此決定翻譯一下。六級540多分的水平,你們見諒 。每句話都有根據本身的理解來翻譯。特別是快速開始那一部分的源代碼。這裏是: github項目地址css

crawler4j

Build Status
Maven Central
Gitter Chat

crawler4j是一個開源的Java抓取Web爬蟲,它提供了一個簡單的抓取Web的界面。 使用它,你能夠在幾分鐘內設置一個多線程的網絡爬蟲。html

內容列表

  • 下載安裝
  • 快速開始
  • 使用工廠
  • 更多實例
  • 配置詳情
  • License

下載安裝

使用Maven

要使用最新版本的crawler4j,請在您的pom.xml中使用如下代碼片斷java

<dependency>
        <groupId>edu.uci.ics</groupId>
        <artifactId>crawler4j</artifactId>
        <version>4.3</version>
    </dependency>
複製代碼

快照

您能夠添加如下內容以使用下一個快照發行版git

<repositories>
        <repository>
            <id>onebeartoe</id>
            <name>onebeartoe</name>
            <url>https://repository-onebeartoe.forge.cloudbees.com/snapshot/</url>
        </repository>
    </repositories>
    
    <dependencies>
        <dependency>
            <groupId>edu.uci.ics</groupId>
            <artifactId>crawler4j</artifactId>
            <version>4.4-SNAPSHOT</version>
        </dependency>
    </dependencies>
複製代碼

若是沒有Maven

從4.3版本開始若是你須要一個包含全部依賴的東西的jar包。你須要本身去構建它。克隆repo而且運行github

$ mvn package -Pfatjar
複製代碼

你會發如今 target/ 文件夾有一個叫作 crawler4j-X.Y-with-dependencies.jar.正則表達式

使用Gradle

請在build.gradle文件中包含如下依賴項以使用crawler4j數據庫

compile group: 'edu.uci.ics', name: 'crawler4j', version: '4.3'
複製代碼

此外,在build.gradle中添加如下存儲庫url,以得到依賴關係 sleepycatapache

maven {
            url "https://repo.boundlessgeo.com/main/"
        }
複製代碼

快速開始

您須要建立一個擴展WebCrawler的爬蟲類。 該類決定應該抓取哪些URL並處理下載的頁面。 如下是一個示例實現:bash

public class MyCrawler extends WebCrawler {
	/** * 正則表達式匹配指定的後綴文件 */
	private final static Pattern FILTERS = Pattern.compile(".*(\\.(css|js|gif|jpg" + "|png|mp3|mp4|zip|gz))$");

	/** * 這個方法主要是決定哪些url咱們須要抓取,返回true表示是咱們須要的,返回false表示不是咱們須要的Url * 第一個參數referringPage封裝了當前爬取的頁面信息 第二個參數url封裝了當前爬取的頁面url信息 * 在這個例子中,咱們指定爬蟲忽略具備css,js,git,...擴展名的url,只接受以「http://www.ics.uci.edu/」開頭的url。 * 在這種狀況下,咱們不須要referringPage參數來作出決定。 */
	@Override
	public boolean shouldVisit(Page referringPage, WebURL url) {
		String href = url.getURL().toLowerCase();// 獲得小寫的url
		return !FILTERS.matcher(href).matches() // 正則匹配,過濾掉咱們不須要的後綴文件
				&& href.startsWith("http://www.ics.uci.edu/");// 只接受以「http://www.ics.uci.edu/」開頭的url
	}

	/** * 當一個頁面被提取並準備好被你的程序處理時,這個函數被調用。 */
	@Override
	public void visit(Page page) {
		String url = page.getWebURL().getURL();// 獲取url
		System.out.println("URL: " + url);

		if (page.getParseData() instanceof HtmlParseData) {// 判斷是不是html數據
			HtmlParseData htmlParseData = (HtmlParseData) page.getParseData();//// 強制類型轉換,獲取html數據對象
			String text = htmlParseData.getText();//獲取頁面純文本(無html標籤)
			String html = htmlParseData.getHtml();//獲取頁面Html
			Set<WebURL> links = htmlParseData.getOutgoingUrls();// 獲取頁面輸出連接

			System.out.println("純文本長度: " + text.length());
			System.out.println("html長度: " + html.length());
			System.out.println("連接個數 " + links.size());
		}
	}
}
複製代碼

從上面的代碼能夠看出,有兩個主要的方法應該被覆蓋服務器

  • shouldVisit: 這個方法主要是決定哪些url咱們須要抓取,返回true表示是咱們須要的,返回false表示不是咱們須要的Url第一個參數referringPage封裝了當前爬取的頁面信息 第二個參數url封裝了當前爬取的頁面url信息
  • visit: 該功能在URL內容下載成功後調用。 您能夠輕鬆獲取下載頁面的網址,文本,連接,html和惟一ID。

您還應該實現一個控制器類,指定抓取的種子,抓取數據應該存儲在哪一個文件夾以及併發線程的數量:

public class Controller {
	public static void main(String[] args) throws Exception {
		String crawlStorageFolder = "E:/crawler";// 定義爬蟲數據存儲位置
		int numberOfCrawlers = 7;// 定義了7個爬蟲,也就是7個線程

		CrawlConfig config = new CrawlConfig();// 定義爬蟲配置
		config.setCrawlStorageFolder(crawlStorageFolder);// 設置爬蟲文件存儲位置

		/* * 實例化爬蟲控制器。 */
		PageFetcher pageFetcher = new PageFetcher(config);// 實例化頁面獲取器
		RobotstxtConfig robotstxtConfig = new RobotstxtConfig();// 實例化爬蟲機器人配置
		// 實例化爬蟲機器人對目標服務器的配置,每一個網站都有一個robots.txt文件
		// 規定了該網站哪些頁面能夠爬,哪些頁面禁止爬,該類是對robots.txt規範的實現
		RobotstxtServer robotstxtServer = new RobotstxtServer(robotstxtConfig, pageFetcher);
		// 實例化爬蟲控制器
		CrawlController controller = new CrawlController(config, pageFetcher, robotstxtServer);

		/* * 對於每次抓取,您須要添加一些種子網址。 這些是抓取的第一個URL,而後抓取工具開始跟隨這些頁面中的連接 */
		controller.addSeed("http://www.ics.uci.edu/~lopes/");
		controller.addSeed("http://www.ics.uci.edu/~welling/");
		controller.addSeed("http://www.ics.uci.edu/");

		/** * 啓動爬蟲,爬蟲今後刻開始執行爬蟲任務,根據以上配置 */
		controller.start(MyCrawler.class, numberOfCrawlers);
	}
}
複製代碼

結果(eclipse+Marven測試):

使用工廠

使用工廠能夠方便地將crawler4j集成到IoC環境中(如Spring,Guice)或者將信息或協做者傳遞給每一個「WebCrawler」實例。

public class CsiCrawlerCrawlerControllerFactory implements CrawlController.WebCrawlerFactory {

    Map<String, String> metadata;
    SqlRepository repository;

    public CsiCrawlerCrawlerControllerFactory(Map<String, String> metadata, SqlRepository repository) {
        this.metadata = metadata;
        this.repository = repository;
    }

    @Override
    public WebCrawler newInstance() {
        return new MyCrawler(metadata, repository);
    }
}
複製代碼

要使用工廠只須要調用CrawlController中的正確方法(若是你在Spring或Guice中,可能會想使用startNonBlocking):

MyCrawlerFactory factory = new MyCrawlerFactory(metadata, repository);
            controller.startNonBlocking(factory, numberOfCrawlers);
複製代碼

更多例子

  • Basic crawler: 上面的例子的完整的源代碼更多的細節。
  • Image crawler: 一個簡單的圖像爬蟲,從爬取網站下載圖像內容,並將其存儲在一個文件夾中。本示例演示如何使用crawler4j獲取二進制內容。
  • Collecting data from threads:此示例演示了控制器如何從爬取線程收集數據/統計信息。
  • Multiple crawlers:這是一個示例,顯示了兩個不一樣的抓取工具如何同時運行。 例如,您可能但願將抓取劃分到不一樣的域中,而後爲每一個組採用不一樣的抓取策略。 每一個抓取控制器能夠有本身的配置。
  • Shutdown crawling: 這個例子顯示經過向控制器發送'shutdown'命令能夠正常終止爬行。
  • Postgres/JDBC integration: 這個實例展現了了如何將抓取的內容保存到Postgres數據庫(或任何其餘JDBC存儲庫)中。

配置詳情

控制器類具備類型爲CrawlConfig的必需參數 這個類的實例能夠用來配置crawler4j。如下部分描述配置的一些細節。

爬取深度

默認狀況下,爬取深度沒有限制。 可是你能夠限制爬取的深度。 例如,假設你有一個種子頁面「A」,連接到「B」,連接到「C」,連接到「D」。 因此,咱們有如下連接結構: A -> B -> C -> D

由於「A」是一個種子頁面,它的深度爲0.「B」的深度爲1,依此類推。 您能夠設置crawler4j抓取的網頁的深度限制。 例如,若是將此限制設置爲2,則不會抓取頁面「D」。 要設置您可使用的最大深度:

crawlConfig.setMaxDepthOfCrawling(maxDepthOfCrawling);
複製代碼

啓用SSL

簡單地啓用SSL:

CrawlConfig config = new CrawlConfig();

config.setIncludeHttpsPages(true);
複製代碼

要抓取的最大頁數

雖然默認狀況下,要抓取的頁面數量沒有限制,但您能夠對此設置一個限制:

crawlConfig.setMaxPagesToFetch(maxPagesToFetch);
複製代碼

啓用二進制內容爬取

默認狀況下,抓取二進制內容(即圖像,音頻等)被關閉。要啓用才能抓取這些文件:

crawlConfig.setIncludeBinaryContentInCrawling(true);
複製代碼

看一個例子 here 來獲取更多細節。

文明性問題(禮貌的爬取)

crawler4j的設計很是高效,可以很是快地抓取域名 (例如,它已經可以每秒抓取200個維基百科頁面)。 不過如今是反對爬取網站的,由於這樣在服務器上給他們承受巨大的負載(他們可能會阻止你!), 從版本1.3開始,默認狀況下,crawler4j會在請求之間等待至少200毫秒。 不過,這個參數能夠調整:

crawlConfig.setPolitenessDelay(politenessDelay);
複製代碼

代理

你的爬取應該在代理以後運行嗎? 若是是這樣,你可使用:

crawlConfig.setProxyHost("proxyserver.example.com");
crawlConfig.setProxyPort(8080);
複製代碼

若是你的代理也須要認證:

crawlConfig.setProxyUsername(username);
crawlConfig.setProxyPassword(password);
複製代碼

可恢復的爬取

有時您須要長時間運行爬蟲。 搜索器可能意外終止。 在這種狀況下,可能須要恢復抓取。您可使用如下設置恢復之前中止/崩潰的抓取:

crawlConfig.setResumableCrawling(true);
複製代碼

可是,您應該注意,它可能會使爬行速度稍慢。

User agent string

用戶代理字符串用於將您的搜尋器表示爲Web服務器。 查看 here獲取更過詳細內容.默認狀況下,crawler4j使用如下用戶代理字符串:

"crawler4j (https://github.com/yasserg/crawler4j/)"
複製代碼

可是,您能夠覆蓋它:

crawlConfig.setUserAgentString(userAgentString);
複製代碼

License

Copyright (c) 2010-2017 Yasser Ganjisaffar

Published under Apache License 2.0, see LICENSE

相關文章
相關標籤/搜索