天天看點

基于webmagic爬蟲的簡單編寫

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、抓取目标

基于webmagic爬蟲的簡單編寫

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不同的實作類,可以完成不同結果集處理,該架構預設實作了好幾種,如圖:

基于webmagic爬蟲的簡單編寫

我們來實作自己的結果集:

/**
 * <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、測試效果

本測試中添加了日志,是以列印出來的資訊比較多。

基于webmagic爬蟲的簡單編寫

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