1. 程式人生 > >Java 通過gecco快速搭建一個爬蟲框架

Java 通過gecco快速搭建一個爬蟲框架

Java gecco 爬蟲Demo


Gecco是一款用java語言開發的輕量化的易用的網路爬蟲框架。
官網:http://www.geccocrawler.com/

1.匯入依賴

<dependency>
            <groupId>com.geccocrawler</groupId>
            <artifactId>gecco</artifactId>
            <version>1.0.8</version>
</dependency>

2.建立爬蟲類

  • 介面HtmlBean說明該爬蟲是一個解析html頁面的爬蟲(gecco還支援json格式的解析)
  • 註解@Gecco告知該爬蟲匹配的url格式(matchUrl)和內容抽取後的bean處理類(pipelines處理類採用管道過濾器模式,可以定義多個處理類)。
import com.geccocrawler.gecco.GeccoEngine;
import com.geccocrawler.gecco.annotation.Gecco;
import com.geccocrawler.gecco.annotation.HtmlField;
import com.geccocrawler.gecco.annotation.Request;
import com.geccocrawler.gecco.annotation.Text;
import com.geccocrawler.gecco.request.HttpRequest;
import com.geccocrawler.gecco.spider.HtmlBean;

import java.util.List;

/**
 * @Auther: lianjc
 * @Date: 2018/11/19 0019 09:54
 * @Description:
 */
@Gecco(matchUrl = "https://blog.csdn.net/u013396133/article/details/84255590",pipelines = "testPipelines")
public class Test implements HtmlBean {

    @Request
    private HttpRequest request;


    @Text
    @HtmlField(cssPath = "#mainBox > main > div.blog-content-box > div > div > div.article-title-box > h1")
    private String title;

    @HtmlField(cssPath = "#content_views > p:nth-child(5)")
    private String content;

    @HtmlField(cssPath = "#mainBox > main > div.blog-content-box > article")
    private List<String> contents;


    public List<String> getContents() {
        return contents;
    }

    public void setContents(List<String> contents) {
        this.contents = contents;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public HttpRequest getRequest() {
        return request;
    }

    public void setRequest(HttpRequest request) {
        this.request = request;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }
    
    }

2.建立一個Pipelines(通道),用來接收爬來的資料

import com.geccocrawler.gecco.annotation.PipelineName;
import com.geccocrawler.gecco.pipeline.Pipeline;

/**
 * @Auther: lianjc
 * @Date: 2018/11/22 0022 11:29
 * @Description:
 */
@PipelineName(value="testPipelines")
public class TestPipelines implements Pipeline<Test> {
    @Override
    public void process(Test test) {

        System.out.println("獲取到的標題:"+test.getTitle());

        System.out.println(test.getContent());

        for (int i = 0; i <test.getContents().size() ; i++) {

            System.out.println(test.getContents().get(i));
        }

    }
}

3.main方法測試

public static void main(String[] args) {
        GeccoEngine.create()
                //Gecco搜尋的包路徑
                .classpath("com.higo.model")
                //開始抓取的頁面地址
                .start("https://blog.csdn.net/u013396133/article/details/84255590")
                //開啟幾個爬蟲執行緒
                .thread(1)
                //單個爬蟲每次抓取完一個請求後的間隔時間
                .interval(2000)
                .run();
    }

4.效果圖
在這裡插入圖片描述

5.程式碼解讀

  • 介面HtmlBean說明該爬蟲是一個解析html頁面的爬蟲(gecco還支援json格式的解析)
  • 註解@Gecco告知該爬蟲匹配的url格式(matchUrl)和內容抽取後的bean處理類
    (例如:http://www.123.com?id={id}&user={user} ) 定義url的格式通過 @RequestParameter傳遞引數
  • @Gecco中pipelines屬性來定義輸出通道可以自己來定義通道也可以輸出到控制檯
    如:pipelines=“consolePipeline”
  • 註解@RequestParameter可以注入url中的請求引數,如@RequestParameter(“user”)表示匹配url中的{user}
  • 註解@Request 發起一個request請求
  • 註解@Text表示獲取@HtmlField抽取出來的元素的text內容
  • 註解@Html表示獲取@HtmlField抽取出來的元素的html內容(如果不指定預設為@Html)
  • GeccoEngine表示爬蟲引擎,通過create()初始化,通過start()/run()執行。可以配置一些啟動引數如:掃描@Gecco註解的包名classpath;開始抓取的url地址star;抓取執行緒數thread;抓取完一個頁面後的間隔時間interval(ms)等

6.注意

  • GeccoEngine.classpath()指定的必須是爬蟲類的目錄否則會報 can’t match url錯誤
  • 以上註解都是來自gecoo包的 比如 @Request,@RequestParameter
    [email protected]的cssPath 是什麼?
    指定掃描的路徑吧,類似於Jquery的選擇器
    獲取技巧 可以開啟瀏覽器除錯臺
    在這裡插入圖片描述
    右鍵選單的Copy - Copy selector