1. 程式人生 > >六、學習爬蟲框架WebMagic(二)---使用註解編寫爬蟲

六、學習爬蟲框架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。