六、學習爬蟲框架WebMagic(二)---使用註解編寫爬蟲

(一)案例

package org.pc.webmagic;

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.ExtractByUrl;
import us.codecraft.webmagic.model.annotation.HelpUrl;
import us.codecraft.webmagic.model.annotation.TargetUrl;

/**
 * TargetUrl是我們最終要抓取的URL,最終想要的數據都來自這裏
 * HelpUrl則是爲了發現這個最終URL,我們需要訪問的頁面
 * 例:對於博客頁,HelpUrl是列表頁,TargetUrl是文章頁;
 *     對於電商網站,HelpUrl是分類列表,TargetUrl是商品詳情
 * TargetUrl中的自定義正則表達式:
 *     將URL中常用的字符.默認做了轉義,變成了\.
 *     將"*"替換成了".*",直接使用可表示通配符。(例如:
 *     https://github.com/*在這裏是一個合法的表達式,它表示https://github.com/下的所有URL。)
 *     屬性 sourceRegion:這個參數是一個XPath表達式,指定了這個URL從哪裏得到——不在sourceRegion的URL不會被抽取
 * @author 鹹魚
 * @date 2018/12/30 9:42
 */
@TargetUrl("https://github.com/\\w+/\\w+")
@HelpUrl("https://github.com/\\w+")
public class GithubRepo {
    /**
     * 默認抽取規則是XPath,若需其他類型抽取規則,則可通過 Type 屬性指定
     */
    @ExtractBy(value = "//h1[@class='entry-title public']/strong/a/text()", notNull = true)
    private String name;
    /**
     * 註解@ExtractByUrl:從URL中抽取
     */
    @ExtractByUrl("https://github\\.com/(\\w+)/.*")
    private String author;

    @ExtractBy("//div[@id='readme']/tidyText()")
    private String readme;

    public static void main(String[] args) {
        /**
         * 註解模式的入口是OOSpider,它繼承了Spider類
         * public static OOSpider create(Site site, PageModelPipeline pageModelPipeline, Class... pageModels);
         * PageModelPipeline:註解模式下,處理結果的類叫做PageModelPipeline,通過實現它,你可以自定義自己的結果處理方式
         *                    PageModelPipeline與Model類是對應的,多個Model可以對應一個PageModelPipeline。除了創建時,
         *                    你還可以通過 public OOSpider addPageModel(PageModelPipeline pageModelPipeline, Class... pageModels)
         *                    方法,在添加一個PageModelPipeline的同時,可以添加多個pageModels。
         */
        OOSpider.create(Site.me().setSleepTime(1000),
                new ConsolePageModelPipeline(), GithubRepo.class)
                .addUrl("https://github.com/code4craft")
                .thread(5)
                .run();
    }
}

(二)知識要點

1、@TargetUrl:TargetUrl是我們最終要抓取的URL,最終想要的數據都來自這裏

(1)TargetUrl中的自定義正則表達式:

(2)屬性 sourceRegion
  這個參數是一個XPath表達式,指定了這個URL從哪裏得到——不在sourceRegion的URL不會被抽取。

2、@HelpUrl:HelpUrl則是爲了發現這個最終URL,我們需要訪問的頁面

  • 對於博客頁,HelpUrl是列表頁,TargetUrl是文章頁;
  • 對於電商網站,HelpUrl是分類列表,TargetUrl是商品詳情。

3、@ExtractBy:默認抽取規則是XPath,若需其他類型抽取規則,則可通過 Type 屬性指定

4、@ExtractByUrl:從URL中抽取目標元素

5、OOSpider:註解模式的入口是OOSpider,它繼承了Spider類

public static OOSpider create(Site site, PageModelPipeline pageModelPipeline, Class... pageModels);

參數PageModelPipeline:註解模式下,處理結果的類叫做PageModelPipeline,通過實現它,你可以自定義自己的結果處理方式。ageModelPipeline與Model類是對應的,多個Model可以對應一個PageModelPipeline。除了創建時,你還可以通過 public OOSpider addPageModel(PageModelPipeline pageModelPipeline, Class… pageModels)方法,在添加一個PageModelPipeline的同時,可以添加多個pageModels。

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