使用webmagic編寫Java爬蟲獲取博客園文章內容


無意中發現了這個框架,真正的傳說中的傻瓜爬蟲框架,用來寫簡單爬蟲很方便,也能夠通過多寫一些代碼寫復雜爬蟲,作者是中國人,看文檔就能學會這個框架的使用,我這里簡單的用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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM