六、学习爬虫框架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。

猜你喜欢

转载自blog.csdn.net/panchang199266/article/details/85390600
今日推荐