【Java】11k star,一個強大的 Java 版爬蟲框架,幾行代碼即可實現一個爬蟲

From: https://mp.weixin.qq.com/s/rQf4bmHlSucAUlQy7jPNiQ

webmagic 是一個無須配置、便於二次開發的爬蟲框架,它提供簡單靈活的API,只需少量代碼即可實現一個爬蟲。

圖片

本項目在GitHub上有11.1K Star,非常熱門,讓不熟悉爬蟲的小白也可以玩轉爬蟲。

申明:此教程僅供爬蟲學習交流使用,切忌非法使用爬蟲!

主要特色

  • 完全模塊化的設計,強大的可擴展性。
  • 核心簡單但是涵蓋爬蟲的全部流程,靈活而強大,也是學習爬蟲入門的好材料。
  • 提供豐富的抽取頁面API。
  • 無配置,但是可通過POJO+註解形式實現一個爬蟲。
  • 支持多線程。
  • 支持分佈式。
  • 支持爬取js動態渲染的頁面。
  • 無框架依賴,可以靈活的嵌入到項目中去。

歡迎關注公衆號:SpringForAll社區(spring4all.com),專注分享關於Spring的一切!回覆“加羣”還可加入Spring技術交流羣!

總體架構

WebMagic的結構分爲Downloader、PageProcessor、Scheduler、Pipeline四大組件,並由Spider將它們彼此組織起來。這四大組件對應爬蟲生命週期中的下載、處理、管理和持久化等功能。

圖片

快速開始

引入依賴

webmagic使用maven管理依賴,在項目中添加對應的依賴即可使用webmagic:

<dependency>
    <groupId>us.codecraft</groupId>
    <artifactId>webmagic-core</artifactId>
    <version>0.7.5</version>
</dependency>
<dependency>
    <groupId>us.codecraft</groupId>
    <artifactId>webmagic-extension</artifactId>
    <version>0.7.5</version>
</dependency>

WebMagic 使用slf4j-log4j12作爲slf4j的實現.如果你自己定製了slf4j的實現,請在項目中去掉此依賴。

<exclusions>
    <exclusion>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
    </exclusion>
</exclusions>

第一個爬蟲

定製PageProcessor

PageProcessor是webmagic-core的一部分,定製一個PageProcessor即可實現自己的爬蟲邏輯。

以下是抓取osc博客的一段代碼:

public class OschinaBlogPageProcessor implements PageProcessor {

    private Site site = Site.me().setDomain("my.oschina.net");

    @Override
    public void process(Page page) {
        List<String> links = page.getHtml().links().regex("http://my\\.oschina\\.net/flashsword/blog/\\d+").all();
        page.addTargetRequests(links);
        page.putField("title", page.getHtml().xpath("//div[@class='BlogEntity']/div[@class='BlogTitle']/h1").toString());
        page.putField("content", page.getHtml().$("div.content").toString());
        page.putField("tags",page.getHtml().xpath("//div[@class='BlogTags']/a/text()").all());
    }

    @Override
    public Site getSite() {
        return site;

    }

    public static void main(String[] args) {
        Spider.create(new OschinaBlogPageProcessor()).addUrl("http://my.oschina.net/flashsword/blog")
             .addPipeline(new ConsolePipeline()).run();
    }
}

這裏通過page.addTargetRequests()方法來增加要抓取的URL,並通過page.putField()來保存抽取結果。page.getHtml().xpath()則是按照某個規則對結果進行抽取,這裏抽取支持鏈式調用。調用結束後,toString()表示轉化爲單個String,all()則轉化爲一個String列表。

Spider是爬蟲的入口類。Pipeline是結果輸出和持久化的接口,這裏ConsolePipeline表示結果輸出到控制檯。

執行這個main方法,即可在控制檯看到抓取結果。webmagic默認有3秒抓取間隔,請耐心等待。

使用註解

webmagic-extension包括了註解方式編寫爬蟲的方法,只需基於一個POJO增加註解即可完成一個爬蟲。以下仍然是抓取oschina博客的一段代碼,功能與OschinaBlogPageProcesser完全相同:

@TargetUrl("http://my.oschina.net/flashsword/blog/\\d+")
public class OschinaBlog {

    @ExtractBy("//title")
    private String title;

    @ExtractBy(value = "div.BlogContent",type = ExtractBy.Type.Css)
    private String content;

    @ExtractBy(value = "//div[@class='BlogTags']/a/text()", multi = true)
    private List<String> tags;

    public static void main(String[] args) {
        OOSpider.create(
         Site.me(),
   new ConsolePageModelPipeline(), OschinaBlog.class).addUrl("http://my.oschina.net/flashsword/blog").run();
    }
}

這個例子定義了一個Model類,Model類的字段'title'、'content'、'tags'均爲要抽取的屬性。這個類在Pipeline裏是可以複用的。

開源地址

  • https://github.com/code4craft/webmagic

給大家推薦我們團隊開發的Chrome插件:YouTube中文配音。如果您跟我們一樣,熱愛看國外的視頻學習前沿知識或者其他內容,該插件可以很好的幫助您講外語視頻一鍵轉化爲中文視頻,官網:https://www.youtube-dubbing.com/

 
程序猿DD
 
 
,贊16




END

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章