無意中發現了這個框架,真正的傳說中的傻瓜爬蟲框架,用來寫簡單爬蟲很方便,也能夠通過多寫一些代碼寫復雜爬蟲,作者是中國人,看文檔就能學會這個框架的使用,我這里簡單的用cnblogs舉例介紹一下這個框架的使用。
1. 先導知識
- Java:這個就不多說了,不會Java肯定是要用Python寫爬蟲的,資料一找一大堆。
- Maven:Maven被idea集成,用起來非常傻瓜,教程一搜一大堆。
- 正則表達式的基本使用:我是看的這本書《正則表達式必知必會》,看完前幾章就夠了,目測耗時不超過1小時。
- XPath簡單語法:只談使用的話,用於本爬蟲看了這頁教程就夠了XPath語法。
2. 官方教程
官方教程位置在WebMagic in Action,官方教程非常親民易懂,如果有能力建議直接去看github上的倉庫webmagic。
3. 簡單爬蟲編寫
3.1. Maven配置
首先是添加Maven依賴,其依賴的包會自動加載。
<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. 第一個爬蟲:博客園
首先一定要閱讀官方文檔,理解其中的普通模式后,再理解注解模式。
由於官方文檔中爬github的爬蟲目前已經失效了,所以我這里用爬cnblogs為例,貢獻一下我自己的博客,講一下這個爬蟲。
直接給代碼:
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("//a[@id='cb_post_title_url']/text()")
private String title;
@ExtractBy("//div[@id='cnblogs_post_body']/tidyText()")
private String post;
@ExtractBy("//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();
}
}
其中,因為我用了代理,所以設置了setHttpProxy
方法,如果沒使用代理不需要這樣。整個類是一個添加了注解的POJO,非常適合Java編程。幾個注解意思如下:
- TargetUrl 有所有需求數據的地址,本例子中,是任意文章的位置。
- HelpUrl 輔助檢索的目錄,本例子中,是文章列表的位置。
- ExtractBy 基於XPath的定位方式,注明POJO中各元素的關聯定位。
關於OOSPider,其中參數分別為,Site對象(包含對爬蟲的配置信息),Pipeline對象(包含輸出位置信息),POJO的類名,根鏈接(從該處開始運行爬蟲)。而其thread
方法表示開啟的線程數量,run
方法表示前台運行,如果用start
則在后台運行,不阻塞主線程。
具體的詳細的內容請參考官方中文文檔。
4. 特別注意
- 在TargetUrl和HelpUrl中使用的是正則表達式,但.表示\.,*表示.*更適合描述Url。
- ExtractBy使用的XPath中增加了如下方法:
Exp | Description |
---|---|
text(n) | 第n個直接文本子節點,為0表示所有 |
allText() | 所有的直接和間接文本子節點 |
tidyText() | 所有的直接和間接文本子節點,並將一些標簽替換為換行,使純文本顯示更整潔 |
html() | 內部html,不包括標簽的html本身 |
outerHtml() | 內部html,包括標簽的html本身 |
regex(@attr,expr,group) | 這里@attr和group均可選,默認是group0 |