無意中發(fā)現(xiàn)了這個(gè)框架,真正的傳說中的傻瓜爬蟲框架,用來寫簡(jiǎn)單爬蟲很方便,也能夠通過多寫一些代碼寫復(fù)雜爬蟲,作者是中國人,看文檔就能學(xué)會(huì)這個(gè)框架的使用,我這里簡(jiǎn)單的用cnblogs舉例介紹一下這個(gè)框架的使用。
1. 先導(dǎo)知識(shí)
- Java:這個(gè)就不多說了,不會(huì)Java肯定是要用Python寫爬蟲的,資料一找一大堆。
- Maven:Maven被idea集成,用起來非常傻瓜,教程一搜一大堆。
- 正則表達(dá)式的基本使用:我是看的這本書《正則表達(dá)式必知必會(huì)》,看完前幾章就夠了,目測(cè)耗時(shí)不超過1小時(shí)。
- XPath簡(jiǎn)單語法:只談使用的話,用于本爬蟲看了這頁教程就夠了XPath語法。
2. 官方教程
官方教程位置在WebMagic in Action,官方教程非常親民易懂,如果有能力建議直接去看github上的倉庫webmagic。
3. 簡(jiǎn)單爬蟲編寫
3.1. Maven配置
首先是添加Maven依賴,其依賴的包會(huì)自動(dòng)加載。
<dependencies>
<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>
</dependencies>
之后,就可以愉快的開始寫爬蟲啦~
3.2. 第一個(gè)爬蟲:博客園
首先一定要閱讀官方文檔,理解其中的普通模式后,再理解注解模式。
由于官方文檔中爬github的爬蟲目前已經(jīng)失效了,所以我這里用爬cnblogs為例,貢獻(xiàn)一下我自己的博客,講一下這個(gè)爬蟲。
直接給代碼:
package com.spider.main;
import org.apache.http.HttpHost;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.model.ConsolePageModelPipeline;
import us.codecraft.webmagic.model.OOSpider;
import us.codecraft.webmagic.model.annotation.ExtractBy;
import us.codecraft.webmagic.model.annotation.HelpUrl;
import us.codecraft.webmagic.model.annotation.TargetUrl;
/**
* Created by 63289 on 2017/5/9.
*/
@HelpUrl("http://www.cnblogs.com/cielosun/default.html\\?page=\\d+")
@TargetUrl("http://www.cnblogs.com/cielosun/p/\\d+.html")
public class CnBlogPo {
@ExtractBy("http://a[@id='cb_post_title_url']/text()")
private String title;
@ExtractBy("http://div[@id='cnblogs_post_body']/tidyText()")
private String post;
@ExtractBy("http://div[@class='postDesc']//span[@id='post-date']/text()")
private String date;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getPost() {
return post;
}
public void setPost(String post) {
this.post = post;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public static void main(String[] args){
OOSpider.create(Site.me().setSleepTime(1000).setHttpProxy(new HttpHost("127.0.0.1",1080)),new ConsolePageModelPipeline(),CnBlogPo.class)
.addUrl("http://www.cnblogs.com/cielosun").thread(5).run();
}
}
其中,因?yàn)槲矣昧舜?,所以設(shè)置了setHttpProxy
方法,如果沒使用代理不需要這樣。整個(gè)類是一個(gè)添加了注解的POJO,非常適合Java編程。幾個(gè)注解意思如下:
- TargetUrl 有所有需求數(shù)據(jù)的地址,本例子中,是任意文章的位置。
- HelpUrl 輔助檢索的目錄,本例子中,是文章列表的位置。
- ExtractBy 基于XPath的定位方式,注明POJO中各元素的關(guān)聯(lián)定位。
關(guān)于OOSPider,其中參數(shù)分別為,Site對(duì)象(包含對(duì)爬蟲的配置信息),Pipeline對(duì)象(包含輸出位置信息),POJO的類名,根鏈接(從該處開始運(yùn)行爬蟲)。而其thread
方法表示開啟的線程數(shù)量,run
方法表示前臺(tái)運(yùn)行,如果用start
則在后臺(tái)運(yùn)行,不阻塞主線程。
具體的詳細(xì)的內(nèi)容請(qǐng)參考官方中文文檔。
4. 特別注意
- 在TargetUrl和HelpUrl中使用的是正則表達(dá)式,但.表示\.,*表示.*更適合描述Url。
- ExtractBy使用的XPath中增加了如下方法:
Exp | Description |
---|---|
text(n) | 第n個(gè)直接文本子節(jié)點(diǎn),為0表示所有 |
allText() | 所有的直接和間接文本子節(jié)點(diǎn) |
tidyText() | 所有的直接和間接文本子節(jié)點(diǎn),并將一些標(biāo)簽替換為換行,使純文本顯示更整潔 |
html() | 內(nèi)部html,不包括標(biāo)簽的html本身 |
outerHtml() | 內(nèi)部html,包括標(biāo)簽的html本身 |
regex(@attr,expr,group) | 這里@attr和group均可選,默認(rèn)是group0 |