花了兩個小時把Java開源爬蟲框架crawler4j文檔翻譯了一下,由於這幾天一直在學習Java爬蟲方面的知識,今天上課時忽然感受全英文可能會阻礙不少人學習的動力,恰好本身又正在接觸這個爬蟲框架,因此決定翻譯一下。六級540多分的水平,你們見諒 。每句話都有根據本身的理解來翻譯。特別是快速開始那一部分的源代碼。這裏是: github項目地址css
crawler4j是一個開源的Java抓取Web爬蟲,它提供了一個簡單的抓取Web的界面。 使用它,你能夠在幾分鐘內設置一個多線程的網絡爬蟲。html
要使用最新版本的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>
複製代碼
從4.3版本開始若是你須要一個包含全部依賴的東西的jar包。你須要本身去構建它。克隆repo而且運行github
$ mvn package -Pfatjar
複製代碼
你會發如今 target/
文件夾有一個叫作 crawler4j-X.Y-with-dependencies.jar
.正則表達式
請在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());
}
}
}
複製代碼
從上面的代碼能夠看出,有兩個主要的方法應該被覆蓋服務器
您還應該實現一個控制器類,指定抓取的種子,抓取數據應該存儲在哪一個文件夾以及併發線程的數量:
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);
}
}
複製代碼
使用工廠能夠方便地將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);
複製代碼
控制器類具備類型爲CrawlConfig的必需參數 這個類的實例能夠用來配置crawler4j。如下部分描述配置的一些細節。
默認狀況下,爬取深度沒有限制。 可是你能夠限制爬取的深度。 例如,假設你有一個種子頁面「A」,連接到「B」,連接到「C」,連接到「D」。 因此,咱們有如下連接結構: A -> B -> C -> D
由於「A」是一個種子頁面,它的深度爲0.「B」的深度爲1,依此類推。 您能夠設置crawler4j抓取的網頁的深度限制。 例如,若是將此限制設置爲2,則不會抓取頁面「D」。 要設置您可使用的最大深度:
crawlConfig.setMaxDepthOfCrawling(maxDepthOfCrawling);
複製代碼
簡單地啓用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);
複製代碼
可是,您應該注意,它可能會使爬行速度稍慢。
用戶代理字符串用於將您的搜尋器表示爲Web服務器。 查看 here獲取更過詳細內容.默認狀況下,crawler4j使用如下用戶代理字符串:
"crawler4j (https://github.com/yasserg/crawler4j/)"
複製代碼
可是,您能夠覆蓋它:
crawlConfig.setUserAgentString(userAgentString);
複製代碼
Copyright (c) 2010-2017 Yasser Ganjisaffar
Published under Apache License 2.0, see LICENSE