Java爬蟲項(xiàng)目簡介
大型的:
Nutch apache/nutch · GitHub
apache下的開源爬蟲程序慰枕,功能豐富,文檔完整。有數(shù)據(jù)抓取解析以及存儲(chǔ)的模塊。適合做搜索引擎以政,分布式爬蟲是其中一個(gè)功能。
Heritrix internetarchive/heritrix3 · GitHub
比較成熟的爬蟲伴找。經(jīng)歷過很多次更新盈蛮,使用的人比較多,功能齊全技矮,文檔完整抖誉,網(wǎng)上的資料也多。有自己的web管理控制臺(tái)穆役,包含了一個(gè)HTTP 服務(wù)器寸五。操作者可以通過選擇Crawler命令來操作控制臺(tái)梳凛。
小型的:
Crawler4j yasserg/crawler4j · GitHub
因?yàn)橹粨碛信老x的核心功能耿币,所以上手極為簡單,幾分鐘就可以寫一個(gè)多線程爬蟲程序
WebCollector CrawlScript/WebCollector · GitHub(國人作品)
目標(biāo)是在讓你在5分鐘之內(nèi)寫好一個(gè)爬蟲韧拒。參考了crawler4j淹接,如果經(jīng)常需要寫爬蟲,需要寫很多爬蟲叛溢,還是不錯(cuò)的塑悼,因?yàn)樯鲜挚隙ú恢?分鐘。缺點(diǎn)是它的定制性不強(qiáng)楷掉。
WebMagic code4craft/webmagic · GitHub(國人作品厢蒜,推薦)
垂直、全棧式烹植、模塊化爬蟲斑鸦。更加適合抓取特定領(lǐng)域的信息。它包含了下載草雕、調(diào)度巷屿、持久化、處理頁面等模塊墩虹。每一個(gè)模塊你都可以自己去實(shí)現(xiàn)嘱巾,也可以選擇它已經(jīng)幫你實(shí)現(xiàn)好的方案。這就有了很強(qiáng)的定制性诫钓。
WebMagic初探
WebMagic的結(jié)構(gòu)分為Downloader旬昭、PageProcessor、Scheduler菌湃、Pipeline四大組件问拘,并由Spider將它們彼此組織起來。更多信息可見 http://webmagic.io/docs
第一個(gè)爬蟲項(xiàng)目
爬取干貨集中營的歷史數(shù)據(jù)為例子:
- 使用maven來構(gòu)建項(xiàng)目,pom配置
<dependency>
<groupId>us.codecraft</groupId>
<artifactId>webmagic-core</artifactId>
<version>0.6.1</version>
</dependency>
<dependency>
<groupId>us.codecraft</groupId>
<artifactId>webmagic-extension</artifactId>
<version>0.6.1</version>
</dependency>
代碼如下:
package com.sima.crawler;
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.pipeline.ConsolePipeline;
import us.codecraft.webmagic.processor.PageProcessor;
/**
* Created by maple on 2017-04-28.
*/
public class GankRepoPageProcessor implements PageProcessor {
//抓取網(wǎng)站的相關(guān)配置场梆,包括編碼墅冷、抓取間隔、重試次數(shù)等
private Site site = Site.me().setRetryTimes(3).setSleepTime(100);
// process是定制爬蟲邏輯的核心接口或油,在這里編寫抽取邏輯
public void process(Page page) {
//定義如何抽取頁面信息
//爬取干貨集中營歷史數(shù)據(jù)寞忿,http://gank.io/2017/04/26
page.addTargetRequests(page.getHtml().links().regex("(http://gank\\.io/\\d+/\\d+/\\d+)").all());
page.putField("title", page.getHtml().$("h1").toString());//獲取標(biāo)題
page.putField("content", page.getHtml().$("div.outlink").toString());//獲取頁面內(nèi)容
if (page.getResultItems().get("title") == null) {
//跳過沒有數(shù)據(jù)的頁面
page.setSkip(true);
}
}
public Site getSite() {
return site;
}
public static void main(String[] args) {
Spider.create(new GankRepoPageProcessor())
.addUrl("http://gank.io")//從該url開始
.addPipeline(new ConsolePipeline())
.thread(5)
.run();
}
}
運(yùn)行結(jié)果如下:
頁面元素的抽取說明
對(duì)于下載到的Html頁面,如何從中抽取到想要的信息顶岸?WebMagic里主要使用了三種抽取技術(shù):XPath腔彰、正則表達(dá)式和CSS選擇器。另外辖佣,對(duì)于JSON格式的內(nèi)容霹抛,可使用JsonPath進(jìn)行解析。
- XPath
XPath 是一門在 XML 文檔中查找信息的語言卷谈。XPath 可用來在 XML 文檔中對(duì)元素和屬性進(jìn)行遍歷杯拐。用于Html也是比較方便的。例如:
page.putField("title", page.getHtml().xpath("http://div[@class='blog-heading']/div[@class='title']/text()").toString());
該語句的意思“查找所有Class屬性為‘blog-heading’的div世蔗,并找它的div子節(jié)點(diǎn)(Class屬性為‘blog-title’)端逼,提取該子節(jié)點(diǎn)的文本信息”
- CSS選擇器
在 CSS 中,選擇器是一種模式污淋,用于選擇需要添加樣式的元素顶滩。
page.putField("content", page.getHtml().$("div.outlink").toString());
該語句的意思“查找所有Class屬性為‘outlink’的div”
- 正則表達(dá)式
正則表達(dá)式是一種特殊的字符串模式,用于匹配一組字符串寸爆,就好比用模具做產(chǎn)品礁鲁,而正則就是這個(gè)模具,定義一種規(guī)則去匹配符合規(guī)則的字符赁豆。
page.addTargetRequests(page.getHtml().links().regex("(http://gank\\.io/\\d+/\\d+/\\d+)").all());
- JsonPath
JsonPath是于XPath很類似的一個(gè)語言仅醇,它用于從Json中快速定位一條內(nèi)容。WebMagic中使用的JsonPath格式可以參考這里:https://code.google.com/p/json-path/
鏈接的發(fā)現(xiàn)
一個(gè)站點(diǎn)的頁面是很多的歌憨,一開始我們不可能全部列舉出來着憨,如何發(fā)現(xiàn)后續(xù)的鏈接?
page.addTargetRequests(page.getHtml().links().regex("(http://gank\\.io/\\d+/\\d+/\\d+)").all());
這段代碼的分為兩部分,page.getHtml().links().regex("(http: //gank\.io/\d+/\d+/\d+)").all()用于獲取所有滿足"(http: //gank\.io/\d+/\d+/\d+)"這個(gè)正則表達(dá)式的鏈接务嫡,page.addTargetRequests()則將這些鏈接加入到待抓取的隊(duì)列中去甲抖。即可完成對(duì)該站點(diǎn)的頁面爬取。