1、前言
前一段時間修改了一個項目的功能,項目基于webmagic編寫的爬蟲。于是開始一些學習。現在整理整理(該項目基本筆者的csdn部落格的爬取為例),算是從小白到入門吧。之前使用httpclient和jsoup玩過一點點,但是感覺好麻煩。而webmagic無需配置,直接就可以二次開發,比較簡單,容易上手。
2、webmagic的編寫思路
主要流程分三步走:
- 設定抓取資料的連結,以及解析資料。這個主要使用的接口為PageProcessor,實作其基本方法即可。
- 處理抓取的資料的結果,持久化還是直接列印輸出等等。這個主要使用的接口為Pipeline,擷取結果集,即可自定義處理。
- 爬蟲的入口及啟動
3、項目依賴(基于maven)
<!-- webmagic -->
<dependency>
<groupId>us.codecraft</groupId>
<artifactId>webmagic-core</artifactId>
<version>0.7.3</version>
</dependency>
<dependency>
<groupId>us.codecraft</groupId>
<artifactId>webmagic-extension</artifactId>
<version>0.7.3</version>
</dependency>
4、抓取目标
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIzQzNwcjMxEDMyQDM4EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
5、項目搭建之實作PageProcessor
/**
* <p>@Description: 爬取csdn部落格中的資料</p>
* @author simonking
* @date 2018年4月19日 下午2:09:35
*/
public class CsdnBlogPageProcessor implements PageProcessor{
// 抓取網站的相關配置,包括編碼、抓取間隔、重試次數等
private Site site = Site.me().setRetryTimes(3).setSleepTime(1000);
public Site getSite() {
return site;
}
// process是定制爬蟲邏輯的核心接口,在這裡編寫抽取邏輯
public void process(Page page) {
// 定義如何抽取頁面資訊,并儲存下來
if (!page.getUrl().regex("(https://blog\\.csdn\\.net/static_coder/article/details/\\d+)").match()) {
// 從頁面發現後續的url位址來抓取
// 擷取目前頁面所有的清單的連結
page.addTargetRequests(page.getHtml().xpath("//div[@id='article_list']").links()
.regex("(https://blog\\.csdn\\.net/static_coder/article/details/\\d+)").all());
//抓取分頁資料 --https://blog.csdn.net/static_coder/article/list/2
page.addTargetRequests(page.getHtml().xpath("//div[@id='papelist']").links()
.regex("(https://blog\\.csdn\\.net/static_coder/article/list/\\d+)").all());
}else {
page.putField("title", page.getHtml().xpath("//h1/span[@class='link_title']/a/text()"));
page.putField("sign", page.getHtml()
.xpath("//div[@class='article_l']/span[@class='link_categories']/a/text()").all());
page.putField("date", page.getHtml()
.xpath("//div[@class='article_r']/span[@class='link_postdate']/text()"));
page.putField("view", page.getHtml()
.xpath("//div[@class='article_r']/span[@class='link_view']/text()")
.toString().replaceAll("\\D+", ""));
page.putField("comment", page.getHtml()
.xpath("//div[@class='article_r']/span[@class='link_comments']/text()")
.toString().replaceAll("\\D+", ""));
page.putField("content", page.getHtml()
.xpath("//div[@class='details']/div[@id='article_content']/html()"));
page.putField("splitline", "-----------------分割線-------------------");
}
}
}
6、項目搭建之實作Pipeline
該架構提供了預設的處理結果(ConsolePipeline):就是把擷取的資料列印在控制台。
通過Pipeline不同的實作類,可以完成不同結果集處理,該架構預設實作了好幾種,如圖:
我們來實作自己的結果集:
/**
* <p>@Description: 自定義資料處理</p>
* @author simonking
* @date 2018年4月20日 上午9:16:07
*/
public class MyConsolePipeline implements Pipeline {
public void process(ResultItems resultItems, Task task) {
System.out.println("擷取到的請求連結: " + resultItems.getRequest().getUrl());
Map<String, Object> resultMap = resultItems.getAll();
for (Map.Entry<String, Object> entry : resultMap.entrySet()) {
System.out.println(entry.getKey() + ":\t" + entry.getValue());
}
}
}
6、項目搭建之實作爬蟲啟動
public class SpiderTest {
public static void main(String[] args) {
long startTime = new Date().getTime();
System.out.println("------------spider start >>> -----------");
Spider.create(new CsdnBlogPageProcessor())
//https://blog.csdn.net/static_coder"開始抓
.addUrl("https://blog.csdn.net/static_coder")
//開啟5個線程抓取
.thread(5)
//爬取資料的處理位置(如果設定預設列印在控制台)
.addPipeline(new MyConsolePipeline())
//啟動爬蟲
.run();
System.out.println("----------------spider end -------------");
long endTime = new Date().getTime();
System.out.println("耗時:" + (endTime - startTime));
}
}
7、測試效果
本測試中添加了日志,是以列印出來的資訊比較多。
8、注意事項
webmagic預設采用log4j的方式記錄日志的,詳細的日志配置,隻需要單獨配置log4j.properties檔案即可。如果要配置logback.xml,則需要已引入logback相關的依賴。日志記錄可能會不生效。原因是和webmagic預設的日志系統沖突,在其依賴中排除即可正常使用。
9、參考文檔
官方文檔:
http://webmagic.io/
http://webmagic.io/docs/zh/
技術部落格:
https://blog.csdn.net/qq598535550/article/details/51287630