WebMagic入门案例

WebMagic总体架构图如下:

在这里插入图片描述

项目结构图

在这里插入图片描述

配置文件

  1. pom.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.xiaoge</groupId>
        <artifactId>xiaoge-crawler-webmagic</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <dependencies>
            <!-- webmagic 核心包 -->
            <!-- https://mvnrepository.com/artifact/us.codecraft/webmagic-core -->
            <dependency>
                <groupId>us.codecraft</groupId>
                <artifactId>webmagic-core</artifactId>
                <version>0.7.3</version>
            </dependency>
    
            <!-- webmagic 扩展包 -->
            <!-- https://mvnrepository.com/artifact/us.codecraft/webmagic-extension -->
            <dependency>
                <groupId>us.codecraft</groupId>
                <artifactId>webmagic-extension</artifactId>
                <version>0.7.3</version>
            </dependency>
    
        </dependencies>
    
    </project>
    
  2. log4j.properties

    log4j.rootLogger=INFO,A1
    log4j.appender.A1=org.apache.log4j.ConsoleAppender
    log4j.appender.A1.layout=org.apache.log4j.PatternLayout
    log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c]-[%p] %m%n
    

实现类

  1. JobProcessor

    package com.xiaoge.webmagic.test;
    
    import us.codecraft.webmagic.Page;
    import us.codecraft.webmagic.Site;
    import us.codecraft.webmagic.Spider;
    import us.codecraft.webmagic.pipeline.FilePipeline;
    import us.codecraft.webmagic.processor.PageProcessor;
    
    /**
     * @Author: 潇哥
     * @DateTime: 2020/10/2 下午10:14
     * @Description: TODO
     */
    public class JobProcessor implements PageProcessor {
    
        /**
         * 负责解析页面, 抽取元素/获取链接
         * @param page page
         */
        public void process(Page page) {
            /*
                解析元素
             */
            // 解析返回的数据page, 并且把解析的结果放到ResultItems中
            // css选择器
            page.putField("a", page.getHtml().css("a[rel=nofollow]").all());
    
            // XPath
            page.putField("a2", page.getHtml().xpath("//a[@rel=nofollow]"));
    
            // 正则表达式
            page.putField("a3", page.getHtml().css("a[rel=nofollow]").regex(".*我们.*").all());
    
    
    
    
            /*
                处理结果的api
             */
            // get/toString都是处理结果的第一条
            page.putField("a4", page.getHtml().css("a[rel=nofollow]").regex(".*我们.*").get());
            page.putField("a5", page.getHtml().css("a[rel=nofollow]").regex(".*我们.*").toString());
            // 获取所有数据
            page.putField("a6", page.getHtml().css("a[rel=nofollow]").regex(".*我们.*").all());
    
    
    
    
            /*
                获取链接
                page.addTargetRequests抓取page.getHtml().css("a[rel=nofollow]").links().all()获取的所有链接网址
             */
            page.addTargetRequests(page.getHtml().css("a[rel=nofollow]").links().all());
            page.putField("url", page.getHtml().css(".title").all());
    
        }
    
    
        /**
         * 配置
         */
        // Site是爬虫的配置, Site.me()可以对爬虫进行一些配置
        private Site site = Site.me()
                .setCharset("utf8") // 设置编码
                .setTimeOut(10000) // 设置超时时间 单位/毫秒
                .setRetrySleepTime(3000) // 设置重试的间隔时间  单位/毫秒
                .setSleepTime(3)    // 设置重试次数
                ;
        public Site getSite() {
            return site;
        }
    
    
        /**
         * 启动与设置Pipeline保存数据的方式
         * @param args
         */
        // 主函数, 执行爬虫, 不写输出到哪里(默认输出到控制台)
        public static void main(String[] args) {
            // 创建解析器(这个解析器是自己写的解析器)
            Spider.create(new JobProcessor())
                    // 设置爬取数据的页面
                    .addUrl("https://plus.jd.com/index?flow_system=appicon&flow_entrance=appicon11&flow_channel=pc")
                    // 以文件的形式输出, 没设置默认使用内置的控制台pipeline输出到控制台
                    .addPipeline(new FilePipeline("/Users/xiaoge/Desktop/result"))
                    // 设置5条线程做处理
                    .thread(5)
                    // 执行爬虫
                    .run();
        }
    
    }
    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

只因为你而温柔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值