专栏首页强仔仔如何用java中的webmagic爬取网页

如何用java中的webmagic爬取网页

说到爬虫,大家第一个想到的肯定是python的scrapyd爬虫。但是大家不知道吧,我们的java也有相应的爬虫工具。今天就给大家介绍一下我们java的爬虫工具。

我们今天要介绍的爬虫工具,名字叫做webmagic,webmagic的架构图如下所示:

如图所示,它主要分为四个部分:

  • Downloader(页面下载)
  • PageProcessor(页面分析及链接抽取)
  • Scheduler(URL管理)
  • Pipeline(后续处理和持久化)

webmagic的用法其实很简单,复杂的部分webmagic都替我们封装好了,接下来开始我们爬虫历程。

1.首先引入webmagic的依赖

<!--webmagic依赖开始-->
        <dependency>
            <groupId>us.codecraft</groupId>
            <artifactId>webmagic-core</artifactId>
            <version>0.6.1</version>
        </dependency>

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

        <dependency>
            <groupId>us.codecraft</groupId>
            <artifactId>webmagic-selenium</artifactId>
            <version>0.6.1</version>
        </dependency>

        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>3.3.1</version>
        </dependency>
        <!--webmagic依赖结束-->

2.创建PageProcessor,用来处理网页数据

/**
 * @author linzhiqiang
 */
public class CsdnBlogProcessor implements PageProcessor {
    private Site site = Site
            .me()
            .setDomain("csdn.net")
            .setSleepTime(3000)
            .setUserAgent(
                    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31");

    @Override
    public void process(Page page) {
        System.out.println("html:"+page.getHtml());
    }

    @Override
    public Site getSite() {
        return site;
    }
}

site中放置爬取的网站域名、cookie、请求头等信息。 process用来处理爬取到的网页数据,处理完的数据可以通过page.putField(),再通过Pipeline获取存储到数据库。

3.创建Pipeline,存储处理好的网页数据

public class CsdnPipeline implements Pipeline {
    @Override
    public void process(ResultItems resultItems, Task task) {
        //文章题目
        String title = resultItems.get("title");
        //文章内容
        String context = resultItems.get("context");
        System.out.println("title:" + title);
        System.out.println("context:" + context);
    }
}

在process中通过resultItems来获取PageProcessor存储的page数据,最后我们可以将数据存储到redis、数据库、文件等地方。

4.利用Scheduler调度爬取任务

public class RedisScheduler extends DuplicateRemovedScheduler implements
        MonitorableScheduler, DuplicateRemover {
    @Override
    public int getLeftRequestsCount(Task task) {
        return 0;
    }

    @Override
    public boolean isDuplicate(Request request, Task task) {
        return false;
    }

    @Override
    public void resetDuplicateCheck(Task task) {
    }

    @Override
    public int getTotalRequestsCount(Task task) {
        return 0;
    }

    private int num = 0;

    @Override
    public Request poll(Task task) {
        Request request = new Request("http://my.oschina.net/flashsword/blog/180623");
        return request;
    }
}

我们可以将我们要爬虫的任务,添加到Scheduler中,然后按照顺序一一爬取。

5.启动爬虫程序,开始爬取数据

    public static void main(String[] args) {
        RedisScheduler redisScheduler = new RedisScheduler();
        Spider.create(new CsdnBlogProcessor())
                .setScheduler(redisScheduler)
                .addPipeline(new CsdnPipeline())
                .thread(1)
                .run();
    }

从打印结果中,我们可以看到我们已经成功爬取到数据了。

官方文档:http://webmagic.io/

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 分布式任务框架实现原理

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.n...

    林老师带你学编程
  • 幕后英雄的用武之地——浅谈Java内部类的四个应用场景

    ——浅谈Java内部类的四个应用场景

    林老师带你学编程
  • 【Hexo实战】SEO(百度、Google)设置

    推广是一个烦人的事情啊喂,特别是对于我们搞技术的来说,可能就不擅长推广,那么怎么才能让别人知道我们呢,我们就要想办法让别人通过搜索就可以搜索到你博客的内容,给我...

    林老师带你学编程
  • 数据一致包装策略

    对于controller返回的结果(http接口),虽然一直有约定的json结构,但是在代码层面还是由程序员手动去拼写。这样有个缺点,就是程序员的不稳定性,在这...

    逝兮诚
  • c#开源消息队列中间件EQueue 教程

    一、简介 EQueue是一个参照RocketMQ实现的开源消息队列中间件,兼容Mono,具体可以参看作者的文章《分享一个c#写的开源分布式消息队列equeue》...

    张善友
  • java之门面模式详解

    本文先给个例子让你看懂了这个设计模式的概念,再分析这个这设计模式的优点,最后再具体的去看看实现方式。 1.一个例子来让你理解门面设计模式概念 最直观的需求是...

    如来
  • 通用RecylerAdapter,内置XRecyclerView,兼容上下拉与动画,高复用,一个Adapter通用所有页面,支持空页面,懒人专属

    这是欢迎各位践踏的Github:https://github.com/CarGuo

    恋猫
  • [享学Netflix] 十、Archaius对Commons Configuration核心API Configuration的扩展实现

    上篇文章体验了一把Netflix Archaius的使用,感受到了它对配置管理上的便捷性。或许有小伙伴会说,配置管理上它和Apache Commons Conf...

    YourBatman
  • Java 23种设计模式全归纳 | 已打包请带走

    设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。

    Jingbin
  • 设计模式之状态模式(二)

    在上一次的文章里,我们看到,需求的变更,迫使我们需要重新改造现有的糖果机代码来符合这个新提的需求。但是,也并没有难倒我们,至少我们在文末给出了思路和类图,不知道...

    程序员小跃

扫码关注云+社区

领取腾讯云代金券