WebMagic框架

news2024/11/17 14:45:40

1.webmagic框架

        webmagic框架是一个Java实现的爬虫框架,底层依然是HttpClient和jsoup

        组件:

  1. downloader:下载器组件
  2. PageProcessor:页面解析组件(必须自定义)
  3. scheculer:访问队列组件
  4. pipeline:数据持久化组件(默认是输出到控制台)

2.入门程序

        2.1创建工程

  1. 创建一个Maven工程
  2. 添加坐标  
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>3.8.1</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>us.codecraft</groupId>
        <artifactId>webmagic-core</artifactId>
        <version>0.9.0</version>
    </dependency>
    <dependency>
        <groupId>us.codecraft</groupId>
        <artifactId>webmagic-extension</artifactId>
        <version>0.9.0</version>
    </dependency>
    

        2.2入门程序 

        1.创建PageProcess接口实现类

package org.example;

import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.ResultItems;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.processor.PageProcessor;
import us.codecraft.webmagic.selector.Html;

/**
 * 实现分析的业务逻辑
 */
public class MypageProcessor implements PageProcessor {
    /**
     * 页面分析
     *
     * @param page 下载结果封装成Page对象
     *             可以从page对象中获得下载的结果
     */
    @Override
    public void process(Page page) {
        Html html = page.getHtml();
        String htmlStr = html.toString();
        //把结果输出到控制台
//        ResultItems resultItems = page.getResultItems();
//        resultItems.put("html", htmlStr);
        page.putField("html", htmlStr);
    }

    /**
     * 返回一个Site对象
     * Site就是站点的配置
     * 返回默认配置使用Site.me创建一个Site对象
     *
     * @return
     */
    @Override
    public Site getSite() {
        return Site.me();
    }

    public static void main(String[] args) {
        Spider.create(new MypageProcessor())
                //设置起始的url
                .addUrl("http://www.itcast.cn")
                //启动爬虫
                //run 是同步方法在当前线程中执行
                //start 在新线程中执行爬虫
                .run();
    }
}

        2.在实现类中实现页面分析的业务逻辑

        3.初始化爬虫

        4.启动爬虫         

        5.结果

      

3.组件介绍

3.1Downloader

        下载器组件,使用HttpClient实现

        如果没有特殊需求不需要自定义,默认的组件就可以满足全部需求

        自定义时需要实现Downloader接口

        向PageProcess传递数据时,把结果封装成Page对象

3.2PageProcess(必须自定义)

        页面分析的业务组件,页面分析的逻辑在其中实现

        需要实现PageProcessor接口

         3.2.1.Site

                Site代表一个站点信息

                可以设置抓取的频率

                 重试的次数

                 超时时间

                 

            如果没有特殊需求 直接使用默认配置即可

        3.2.2Page

        getHtml(): 返回抓取的结果

        getResultItems(): 返回ResultItems对象, 向pipeline传递数据时使用

        getTargetReqyests()、getTargetReqyest(): 向scheduler对象中添加url

        3.2.3html(Selectable)

        html也是一个Selectable对象

        一个Selectable就可以表示一个dom节点

        使用html解析页面三种方式:

                1.使用原生jsoup方法进行解析

                        Document document = html.getDocument();

                2.使用框架提供的css选择器

                        html.css("选择器")

                        html.$("选择器")

                3.使用Xpath解析

        3.2.4ResultItems

        作用就是把解析的结果传递给pipeline

        可以使用page对象的getResultItems()方法获取该对象

        也可以直接使用putField方法将数据添加到ResultItems对象中

        3.2.5Request

        并不是Http请求的Request对象,就是把url封装成Request对象

        可以添加一个  也可以添加多个

3.3pipeline(自定义频率高)

        数据持久化组件

框架提供了三个实现,ConsolePipeline:向控制台输出 默认的

                                    FilePipeline:向磁盘文件中输出

                                    JsonFilePipeline: 保存Json格式的文件

也可以自定义pipeline:

        需要实现pipeline接口。

package org.example;

import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.pipeline.ConsolePipeline;
import us.codecraft.webmagic.pipeline.FilePipeline;
import us.codecraft.webmagic.processor.PageProcessor;
import us.codecraft.webmagic.selector.Html;
import us.codecraft.webmagic.selector.Selectable;

import java.util.List;

/**
 * 获取黑马网站全部网页
 */
public class FilePipelinePageProcessor implements PageProcessor {
    @Override
    public void process(Page page) {
        //访问黑马首页
        Html html = page.getHtml();
        //解析首页中所有的链接地址
//        Selectable css = html.css("a", "href");
        Selectable links = html.links();
        List<String> all = links.all();
        //把链接地址添加到访问队列中
        page.addTargetRequests(all);
        //把页面传递给pipeline 保存到磁盘
        page.putField("html",html.get());

    }

    @Override
    public Site getSite() {
        return PageProcessor.super.getSite();
    }

    public static void main(String[] args) {
        FilePipeline filePipeline = new FilePipeline();
        filePipeline.setPath("Z:\\html");
        //使用spider初始化爬虫
        Spider.create(new FilePipelinePageProcessor())
        //设置起始的url
                .addUrl("http://www.itheima.com")
        //设置使用的pipeline
                .addPipeline(new ConsolePipeline())
                .addPipeline(filePipeline)
        //启动
                .run();

    }
}

3.4Scheduler

        访问url队列

        1.默认使用的内存队列

                url数据量大时会占用大量的内存

        2.文件形式的队列

                需要制定保存队列文档的文件路径和文件名

        3.redis分布式队列

                实现分布式爬虫时 大规模爬虫时使用

3.4.1url去重

webmagic框架中可以对url进行去重处理

        1.默认使用HashSet进行去重 

                需要占用大量的内存

        2.规模大时 应该是用redis去重

                使用redis成本高,需要搭建集群

         3.布隆过滤器去重

                内存小,速度快,成本低

                缺点是有可能误判,不能删除

3.4.2布隆过滤器的使用

        1.添加guava的jar包

        

<dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>16.0.1</version>
        </dependency>

        

public static void main(String[] args) {
        FilePipeline filePipeline = new FilePipeline();
        filePipeline.setPath("Z:\\html");

        //创建一个Scheduler
        QueueScheduler scheduler = new QueueScheduler();

        //指定队列使用布隆过滤器去重
        //初始化一个布隆过滤器 参数就是容量
        scheduler.setDuplicateRemover(new BloomFilterDuplicateRemover(10000000));
        //使用spider初始化爬虫
        Spider.create(new FilePipelinePageProcessor())
                //设置起始的url
                .addUrl("http://www.itheima.com")
                //设置使用的pipeline
                .addPipeline(new ConsolePipeline())
                .addPipeline(filePipeline)
                //设置使用的Scheduler对象
                .setScheduler(scheduler)
                //启动
                .run();

    }

3.5Spider

        工具类,可以初始化爬虫

        在spider中配置各个组件

        启动爬虫

4.页面解析

4.1jsoup

package org.example;

import org.jsoup.nodes.Document;
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.processor.PageProcessor;
import us.codecraft.webmagic.selector.Html;

public class MypageProcessor1 implements PageProcessor {
    @Override
    public void process(Page page) {
        //使用原生Jsoup的api解析页面
        Html html = page.getHtml();
        //得到一个jsoup的Document对象
        Document document = html.getDocument();
        String title = document.getElementsByTag("title").text();
        //传递给pipeline
        page.putField("title", title);
    }

    @Override
    public Site getSite() {
        return PageProcessor.super.getSite();
    }

    public static void main(String[] args) {
        Spider.create(new MypageProcessor1())
                .addUrl("https://www.jd.com")
                .start();
    }
}

        4.2css选择器解析

//使用css解析器解析页面
        Selectable domTitle = html.$("title","text");
//        String title1 = domTitle.toString();
        String title2 = domTitle.get();
        page.putField("title2",title2);

                Selectable元素 两个方法 get()、toString() 都可以把结果转换为字符串

                 如果返回的是一个dom列表,那么只返回第一个元素

                all()就可以得到列表

        4.3Xpath解析

                 这个是webmagic框架中实现的

XPath 教程 (w3school.com.cn)

package org.example;

import org.jsoup.nodes.Document;
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.processor.PageProcessor;
import us.codecraft.webmagic.selector.Html;
import us.codecraft.webmagic.selector.Selectable;

import java.util.List;

public class MypageProcessor1 implements PageProcessor {
    @Override
    public void process(Page page) {


        //使用原生Jsoup的api解析页面
        Html html = page.getHtml();
        //得到一个jsoup的Document对象
        Document document = html.getDocument();
        String title = document.getElementsByTag("title").text();
        //传递给pipeline
        page.putField("title", title);


        //使用css解析器解析页面
        Selectable domTitle = html.$("title", "text");
//        String title1 = domTitle.toString();
        String title2 = domTitle.get();
        page.putField("title2", title2);

        //选择一个节点列表
        // 只返回第一个
        String s = html.css("link", "href").get();
        // 返回列表
        List<String> all = html.css("link", "href").all();
        System.out.println(s);
        System.out.println(all);

        //使用Xpath进行解析
        Selectable xpath = html.xpath("//*[@id=\"navitems-group1\"]/li[1]/a/text()");
        String addr = xpath.get();
        page.putField("addr", addr);
    }

    @Override
    public Site getSite() {
        return PageProcessor.super.getSite();
    }

    public static void main(String[] args) {
        Spider.create(new MypageProcessor1())
                .addUrl("https://www.jd.com")
                .start();
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1506411.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

跨境电商三大趋势

跨境电商有着不断发展的三大趋势&#xff1a; 个性化定制&#xff1a;随着消费者需求的不断变化和个性化定制的潮流&#xff0c;跨境电商平台开始提供更多的定制化服务。消费者可以根据自己的需求选择产品的款式、材料和设计&#xff0c;从而获得更加个性化的产品体验。 无界销…

JDBC的学习记录

JDBC就是使用java语言操作关系型数据库的一套API。 JDBC&#xff08;Java Database Connectivity&#xff09;是Java语言中用于连接和操作数据库的一种标准接口。它提供了一组方法和类&#xff0c;使Java程序能够与各种不同类型的关系型数据库进行交互。 JDBC的主要功能包括建…

【notepad++工具使用之】批量加逗号

背景 在使用sql语句in关键字查询时&#xff0c;我们需要把数据用逗号进行隔开&#xff0c;在数据量非常少的时候&#xff08;十几二十个这样&#xff09;&#xff0c;可以手动的去加逗号分隔符&#xff1b; 但是遇到1000个怎么弄呢&#xff1f; 强大的Notepad 批量处理数据时…

讲解Python3内置模块之json编码解码方法

简介 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式&#xff0c;它基于ECMAScript的一个子集。 JSON采用完全独立于语言的文本格式&#xff0c;这些特性使JSON成为理想的数据交换格式&#xff0c;易于人阅读和编写&#xff0c;同时也易于机器解析和生成&#…

学习笔记docker——容器通过网络通信

inspect-a&#xff1a;查看Linux中的网络细节。 docker inspect 容器id/容器名&#xff1a;查看容器的细节。 注意&#xff1a;上面有误&#xff0c;应该是接在docker0网桥上的容器只能通过容器的ip(eth0)之间进行通信&#xff0c;不能通过容器名称通信&#xff0c;要用容器名…

git搜索历史上曾经的文本内容

文章目录 问题在命令行搜索历史内容参考 问题 我们知道&#xff0c;github有文本搜索功能&#xff1a; 比如想搜哪些文件内容包括 aaa &#xff0c;在搜索框中输入 aaa &#xff1a; 但是&#xff0c;如果是历史上曾经有过的文本&#xff0c;这个办法貌似不行。 比如文件 tes…

Babel:现代JavaScript的桥梁

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

实时工业控制系统的创新整合:PLC4X与CnosDB的高效数据采集与存储

在当代工业自动化系统中&#xff0c;实时监测和数据分析变得至关重要。本文将介绍如何通过集成Apache PLC4X与CnosDB&#xff0c;实现对工业控制系统中的PLC设备进行高效数据采集和存储&#xff0c;为工程师们提供更强大的数据分析和监测工具。 PLC的定义 PLC是可编程逻辑控制…

C++_lambda表达式

目录 前言-lambda表达式的介绍&#xff1a; 1、lambda表达式的作用 2、lambda表达式的优势 2.1 用lambda构建lambda变量 3、lambda表达式的类型 4、捕捉列表说明 4.1 传值捕捉 4.2 mutable 4.3 传引用捕捉 4.4 混合捕捉 5、lambda的大小 结语 前言-lambda表达…

基于springboot+vue实现早餐店点餐系统项目【项目源码+论文说明】计算机毕业设计

基于springbootvue实现早餐店点餐系统演示 摘要 多姿多彩的世界带来了美好的生活&#xff0c;行业的发展也是形形色色的离不开技术的发展。作为时代进步的发展方面&#xff0c;信息技术至始至终都是成就行业发展的重要秘密。不论何种行业&#xff0c;大到国家、企业&#xff0…

基于51单片机的直流电机调速系统设计

基于51单片机的直流电机调速系统设计[proteus仿真] 电机调速系统这个题目算是课程设计和毕业设计中常见的题目了&#xff0c;本期是一个基于51单片机的直流电机调速系统设计 需要的源文件和程序的小伙伴可以关注公众号【阿目分享嵌入式】&#xff0c;赞赏任意文章 2&#xff…

【Web】浅聊Java反序列化之Rome——EqualsBeanObjectBean

目录 简介 原理分析 ToStringBean EqualsBean ObjectBean EXP ①EqualsBean直球纯享版 ②EqualsBean配合ObjectBean优化版 ③纯ObjectBean实现版 关于《浅聊Java反序列化》系列&#xff0c;纯是记录自己的学习历程&#xff0c;宥于本人水平有限&#xff0c;内容很水&a…

AI相关的实用工具分享

AI实用工具大赏&#xff1a;赋能科研与生活&#xff0c;探索AI的无限可能 前言 在数字化浪潮汹涌而至的今天&#xff0c;人工智能&#xff08;AI&#xff09;已经渗透到我们生活的方方面面&#xff0c;无论是工作还是生活&#xff0c;都在悄然发生改变。AI的崛起不仅为我们带…

搭建Android Studio开发环境

一、JDK 1、下载 2、安装 双击进行安装&#xff0c;修改安装路径为&#xff1a;D:\Java\jdk-17.0.4.1即可&#xff0c;安装完成后目录如下&#xff1a; 配置环境变量 3、测试 WinR&#xff0c;输入cmd&#xff0c;按Enter后&#xff0c;键入&#xff1a;java --version&…

云上攻防-云产品篇堡垒机场景JumpServer绿盟SASTeleport麒麟齐治

知识点 1、云产品-堡垒机-产品介绍&攻击事件 2、云产品-堡垒机-安全漏洞&影响产品 章节点&#xff1a; 云场景攻防&#xff1a;公有云&#xff0c;私有云&#xff0c;混合云&#xff0c;虚拟化集群&#xff0c;云桌面等 云厂商攻防&#xff1a;阿里云&#xff0c;腾讯…

力扣难题:重排链表

首先通过快慢指针找到中间节点&#xff0c;然后将中间节点之后和之前的部分分为两个链表&#xff0c;然后翻转后面的链表&#xff0c;注意方法&#xff0c;然后将两个链表交替链接。 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode…

【数理统计实验(三)】假设检验的R实现

&#x1f349;CSDN小墨&晓末:https://blog.csdn.net/jd1813346972 个人介绍: 研一&#xff5c;统计学&#xff5c;干货分享          擅长Python、Matlab、R等主流编程软件          累计十余项国家级比赛奖项&#xff0c;参与研究经费10w、40w级横向 文…

uglityjs非集成方式混淆js代码

文章目录 uglityjs非集成方式混淆js代码一、前言1.简介2.环境3.bat和ps1.ps1 文件.bat 文件 二、正文1.安装Node.js2.安装UglityJS3.代码混淆1&#xff09;单个文件2&#xff09;多个文件 uglityjs非集成方式混淆js代码 一、前言 1.简介 UglifyJS 是一个 JavaScript 解析器、…

3.10复试专业课日报【周末总结】

数据结构 考点一&#xff0c;考点二 操作系统 计算机网络 组成原理 1.什么是中断向量 2. 数据库 选择题80-100 1.数据库的逻辑模型&#xff08;数据模型&#xff09; 2.DCL,DML,DQL,DDL 3.数据库特点 算法 1.复习 对称二叉树&#xff0c;二叉树最大深度 2.只出现一…

计算机考研|保姆级择校+资料+全年规划

本科211&#xff0c;研究生上岸某985 计算机考研备考过程中走了不少弯路&#xff0c;希望我的经验能够帮助大家少走弯路 大家决定考研之前&#xff0c;一定要认真思考自己考研的目的是什么&#xff0c;有的人是随大流&#xff0c;别人考研&#xff0c;就跟风考研&#xff0c;有…