Java爬虫—WebMagic

一,WebMagic介绍

WebMagic企业开发,比HttpClient和JSoup更方便

一),WebMagic架构介绍

WebMagic有DownLoad,PageProcessor,Schedule,Pipeline四大组件,并有Spider将他们组织起来,这四大组件对应就是爬虫的下载,处理,管理,持久化等功能。

Spider将这几个组件串联起来,让他们可以相互交互,流程化执行,可以认为Spider是一个巨大的容器,他也是webMagic逻辑的核心

WebMagic框架:

1,DownLoad负责从互联网上下载页面交给PageProcessor处理,WebMagic使用Apache HttpClient作为下载工具。

2,PageProcessor负责解析页面,抽取有用数据,以及发现新的链接。WebMagic使用Jsoup作为解析HTML工具,并基于其开发了解析Xpath的Xsoup。

四个组件中,PageProcessor对于每个站点都不一样,需要使用者自行定义。

3,Schedule负责管理抓取的URL,以及一些去重工作。WebMagic默认提供了JDK的内存队列来管理URL,并用集合进行去重。也支持Redis的分布式管理。

4,Pipeline负责抽取结果的计算,持久化到文件,数据库等。WebMagic默认提供“输出到控制台”和保存到文件两种处理方案。

如果需要保存到数据库,则需要编写对应的Pipeline,对于一类需求,一般只需要编写一个Pipeline。

二),用于数据流转的对象

1,request

request是对URL地址的一层封装,一个request对应一个URL;

他是PageProcessor和DownLoad交互的载体,也是PageProdessor控制Download的唯一方式。

除了URL本身,还包含一盒key-value结构的完整字段extra,可以在extra中保存一些特殊的属性,然后在其他地方进行读取,以及完成不同的功能。

2,page

Page及使用Download下载的页面——可能是一个HTML,也可能是JSON或者其他文本。

Page是WebMagic抽取数据的核心对象,他提供了一些方法可供抽取、结果保存等。

3,ResuleItems

ResultItems相当于一个Map,他用于保存PageProcessor处理的结果,供Pipeline使用。他的API和Map类似,但有一个字段skip,若设置为true,则不会被Pipeline处理。

二,入门程序

添加打印日志配置文件

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🇲🇲ss,SSS} [%t] [%c]-[%p] %m%n

引入WebMagic的依赖

<!--webMagic依赖-->
        <dependency>
            <groupId>us.codecraft</groupId>
            <artifactId>webmagic-core</artifactId>
            <version>0.7.4</version>
        </dependency>
        <dependency>
            <groupId>us.codecraft</groupId>
            <artifactId>webmagic-extension</artifactId>
            <version>0.7.4</version>
        </dependency>
public class JobProcessor implements PageProcessor {
    //page:解析的页面,由Spider容器处理。
    public void process(Page page) {
        //解析page,并将结果以key——value的形式保存在ResultItems中
        //page.getHtml():获取html,也就是dom文档
        //.css():selector选择器
        //"head > title":head的直接子标签
        //以css方式获取
        page.putField("title",page.getHtml().css("head > title"));

        //Xpath方式获取
        page.putField("div",page.getHtml().xpath("//div[@id=shortcut-2014]/div/ul/li/a"));
        //css方式获取
        page.putField("div1",page.getHtml().css("div#shortcut-2014 div.w ul.fr > li > a"));
        //正则表达式
        page.putField("div2",page.getHtml().css("div#shortcut-2014 div.w ul.fr > li > a").regex(".*你好.*").all());
    }

    private Site site = Site.me();
    public Site getSite() {
        return site;
    }

    public static void main(String[] args) {
        Spider.create(new JobProcessor())
                .addUrl("https://kuaibao.jd.com/")//添加需要爬取的网页url
                .run();//执行
        //不需要执行打印,不设置输入流的位置,WebMagic默认输出在控制台
    }
}

三,PageProcessor分析抽取页面元素

  • Xpath, 使用路径表达式来选取 XML 文档中的节点或节点集

  • CSS选择器 (同jquery选择器用法)

  • 正则表达式, 一般用于获取url地址

WebMagic下Selectable抽取元素API

WebMagic处理结果的API

        page.putField("div3",page.getHtml().xpath("//div[@id=shortcut-2014]/div/ul/li/a").get());//在结果中抽取一条数据,默认第一条
        page.putField("div3",page.getHtml().xpath("//div[@id=shortcut-2014]/div/ul/li/a").toString());//在结果中抽取一条数据,默认第一条
        page.putField("div3",page.getHtml().xpath("//div[@id=shortcut-2014]/div/ul/li/a").all());//获取结果的全部数据

Schedule获取链接:page.addTargetRequest()

        page.addTargetRequest(page.getHtml().xpath("//div[@id=shortcut-2014]/div/ul/li/a").links().get());//获取查询结果的第一条超链接
        page.putField("title",page.getHtml().css("head > title"));

四,Pipeline保存结果

WebMagic用于保存结果的组件叫做Pipeline,默认输出到控制是同一个内置的Pipeline——consolePipeline,如果想要输出到文件,只讲Pipeline换成FilePipeline就可以。

 public static void main(String[] args) {
        Spider.create(new JobProcessor())
                .addUrl("https://kuaibao.jd.com/")//添加需要爬取的网页url
                //不添加addPipeline则会将结果输出在控制台
                .addPipeline(new FilePipeline("C:\\Users\\admin\\Desktop\\result\\"))//将结果保存在文件中
                .thread(5)//设置多线程
                .run();//执行
        //不需要执行打印,不设置输入流的位置,WebMagic默认输出在控制台
    }

五,爬虫的配置、启动和终止

Sipder是爬虫启动的入口,我们需要在启动爬虫前使用一个pageProcessor创建一个Spider对象,然后使用run()启动。

设置Spider组件都可以采用set方法进行设置

爬虫设置Site

Site.me()可以对爬虫进行一些配置,包括编码,抓取间隔,超时时间,重复次数等。

    private Site site = Site.me()
            .setCharset("utf8") //设置编码
            .setTimeOut(10 * 1000) //设置超时间
            .setRetryTimes(3) // 设置重复次数
            .setRetrySleepTime(3 * 1000); // 设置重试时间间隔
    public Site getSite() {
        return site;
    }

六, 爬虫分类

网络爬虫按照系统结构和实现技术,大致可以分为以下几种类型:通用网络爬虫、聚焦网络爬虫、增量式网络爬虫、深层网络爬虫。 实际的网络爬虫系统通常是几种爬虫技术相结合实现的

通用网络爬虫

通用网络爬虫又称全网爬虫(Scalable Web Crawler),爬行对象从一些种子 URL 扩充到整个 Web,主要为门户站点搜索引擎和大型 Web 服务提供商采集数据。

这类网络爬虫的爬行范围和数量巨大,对于爬行速度和存储空间要求较高,对于爬行页面的顺序要求相对较低,同时由于待刷新的页面太多,通常采用并行工作方式,但需要较长时间才能刷新一次页面。 简单的说就是互联网上抓取所有数据。

聚焦网络爬虫

聚焦网络爬虫(Focused Crawler),又称主题网络爬虫(Topical Crawler),是指选择性地爬行那些与预先定义好的主题相关页面的网络爬虫。

和通用网络爬虫相比,聚焦爬虫只需要爬行与主题相关的页面,极大地节省了硬件和网络资源,保存的页面也由于数量少而更新快,还可以很好地满足一些特定人群对特定领域信息的需求 。简单的说就是互联网上只抓取某一种数据。

增量式网络爬虫

增量式网络爬虫(Incremental Web Crawler)是 指 对 已 下 载 网 页 采 取 增量式更新和只爬行新产生的或者已经发生变化网页的爬虫,它能够在一定程度上保证所爬行的页面是尽可能新的页面。

和周期性爬行和刷新页面的网络爬虫相比,增量式爬虫只会在需要的时候爬行新产生或发生更新的页面 ,并不重新下载没有发生变化的页面,可有效减少数据下载量,及时更新已爬行的网页,减小时间和空间上的耗费,但是增加了爬行算法的复杂度和实现难度。简单的说就是互联网上只抓取刚刚更新的数据。

Deep Web 爬虫

Web 页面按存在方式可以分为表层网页(Surface Web)和深层网页(Deep Web,也称 Invisible Web Pages 或 Hidden Web)。

表层网页是指传统搜索引擎可以索引的页面,以超链接可以到达的静态网页为主构成的 Web 页面。Deep Web 是那些大部分内容不能通过静态链接获取的、隐藏在搜索表单后的,只有用户提交一些关键词或者登陆后才能获得的 Web 页面

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值