08. Springboot集成webmagic实现网页爬虫

目录

1、前言

2、WebMagic

3、Springboot集成Webmagic

3.1、创建Springboot,并引入webmagic依赖

3.2、定义PageProcessor

3.3、元素选择

3.3.1、F12查看网页元素

3.3.2、元素选择

3.3.3、注意事项

4、小结


1、前言

在信息化的时代,网络爬虫已经成为我们获取和处理大规模网络数据的重要工具。如果将现有网络上的海量数据使用爬虫工具将数据爬取保存下来,并进行分析,就可以挖掘出一些潜在的价值。而现在市面上也出现了很多爬虫工具以及爬虫框架,今天将介绍下Java体系下一款简单使用的爬虫框架WebMagic,并可以很简单的与Springboot进行集成。

2、WebMagic

WebMagic是一款基于Java的开源爬虫框架,支持注解和设计模式,简化了爬取任务的实现。官网地址:Introduction · WebMagic Documents。

官网给出的概述:

WebMagic项目代码分为核心和扩展两部分。核心部分(webmagic-core)是一个精简的、模块化的爬虫实现,而扩展部分则包括一些便利的、实用性的功能。WebMagic的架构设计参照了Scrapy,目标是尽量的模块化,并体现爬虫的功能特点。

这部分提供非常简单、灵活的API,在基本不改变开发模式的情况下,编写一个爬虫。

扩展部分(webmagic-extension)提供一些便捷的功能,例如注解模式编写爬虫等。同时内置了一些常用的组件,便于爬虫开发。

另外WebMagic还包括一些外围扩展和一个正在开发的产品化项目webmagic-avalon。

官网给出的总体架构设计图:

总架构图中我们可以发现几个核心模块,分别为Pipeline,Scheduler,Downloader,PageProcesser。其中PageProcesser便是我们今天会用到的用于实现网页内容处理的类。

3、Springboot集成Webmagic

需求场景:爬取百度搜索引擎上的热搜数据,包含标题和连接。也就是首页右侧的内容。

3.1、创建Springboot,并引入webmagic依赖

目前webmagic最新依赖版本为0.10.0。

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.2.1</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>springboot-webmagic</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot-webmagic</name>
    <description>springboot-webmagic</description>
    <properties>
        <java.version>17</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <!-- webmagic核心库 -->
        <dependency>
            <groupId>us.codecraft</groupId>
            <artifactId>webmagic-core</artifactId>
            <version>0.10.0</version>
        </dependency>


        <!-- webmagic扩展库 -->
        <dependency>
            <groupId>us.codecraft</groupId>
            <artifactId>webmagic-extension</artifactId>
            <version>0.10.0</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

3.2、定义PageProcessor

创建一个网页内容处理器类BaiduHotSearchPageProcessor,用于访问http://www.baidu.com地址,以及对他的网页内容进行解析。

public class BaiduHotSearchPageProcessor implements PageProcessor {

    // 抓取网站的相关配置,包括编码、抓取间隔、重试次数等
    private Site site = Site.me().setRetryTimes(3).setSleepTime(100);

    /**
     * 定制爬虫逻辑的核心接口,在这里编写抽取逻辑
     * @param page
     */
    @Override
    public void process(Page page) {

        System.out.println(page.getHtml());
        /**
         * 通过page.getHtml()可以获取到main函数中Spider.create(new BaiduHotSearchPageProcessor()).addUrl中的地址的网页内容
         * 1、通过$或css()方法获取到该page html下某元素dom
         */
        Selectable selectable = page.getHtml().$(".theme-hot").select(
                new XpathSelector("a[@class='item-wrap_2oCLZ']")
        );
        List<Selectable> nodes = selectable.nodes();

        /**
         * 获取到指定的dom后,从这些dom中提取元素内容。
         */
        System.out.println("今日百度热搜:");
        for (int i = 1; i <= nodes.size() - 1; i++) {
            Selectable node = nodes.get(i);
            String link = node.$(".item-wrap_2oCLZ", "href").get();
            String title = node.$(".c-single-text-ellipsis", "text").get();
            System.out.printf("%d、%s,访问地址:%s%n", i, title, link);
        }
    }

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

    public static void main(String[] args) {
        // 创建一个Spider,并把我们的处理器放进去
        Spider.create(new BaiduHotSearchPageProcessor())
                // 添加这个Spider要爬取的网页地址
                .addUrl("https://top.baidu.com/board?platform=pc&sa=pcindex_entry")
                // 开启5个线程执行,并开始爬取
                .thread(5).run();
    }
}

运行后,来看下效果:

与百度上的热搜数据比对一下,发现数据如此简单就被我们爬取下来了。

3.3、元素选择

通过上面的例子你会发现,其实整个爬虫的难点不在于工具的使用,而在于我们要爬取内容的元素选择。也就是我们爬取之前需要先定位到我们需要爬取的内容元素规则,按照这些规则在进行proessor的编写。

WebMagic定义了Selectable来进行相关元素的抽取。从上面的例子中可以看到page.getHtml()返回的是最原始的网页内容,多且繁杂,并不是都是我们需要的。Selectable定义了很多API来供我们进行元素选择和抽取,如可以采用xpath,css,或者正则表达式来进行选择。

3.3.1、F12查看网页元素

打开百度热搜网页,按F12出现开发控制台,然后点击左上角的一个小箭头(1的位置),在移动到热搜上的条目(2的位置),然后控制台上就会自动定位到该段内容的元素代码(3的位置)。

接下来就要考察我们的眼力了,通过观察发现,热搜的每一条条目对应的是一个a标签,而这些a标签有一个通用的属性“href”,即该条热搜内容的访问连接。而每个a标签下都有一个class="c-single-text-ellipsis"的div元素。该元素下的文字内容即为标题。

3.3.2、元素选择

既然我们已经找到了合适的规则,那么我们就要选取一种方式来定位这些元素。常用的有xpath,或css定位。我们可以观察到,热搜整个代码块是包含在一个class="theme-hot"的div下的(通常此类的布局都会有一个相应的class或id用来对该布局进行样式定义)。所以我们可以用以下代码定位到热搜的代码片段:

page.getHtml().$(".theme-hot")

然后需要在此片段的基础上,继续一层一层往下找,找到我们前面说到的a标签,由于a标签可能会有很多个,所以我们使用xpath选择器选择a标签且class定义为item-wrap_2oCLZ的元素。

Selectable selectable = page.getHtml().$(".theme-hot").select(
        new XpathSelector("a[@class='item-wrap_2oCLZ']")
);

到此,就可以把我们的a标签全部都找出来了,接下来就是要一条一条的解析a中的内容:

for (int i = 1; i <= nodes.size() - 1; i++) {
    Selectable node = nodes.get(i);
    String link = node.$(".item-wrap_2oCLZ", "href").get();
    String title = node.$(".c-single-text-ellipsis", "text").get();
    System.out.printf("%d、%s,访问地址:%s%n", i, title, link);
}

其中$("", "")第二个参数就是对应的属性值,这样就可以顺利的爬取到我们所需的内容了。

3.3.3、注意事项

其实,有些朋友已经发现了,我们上面所选取的class=‘item-wrap_2oCLZ’感觉很奇怪,像是动态生成的。确实是,不同网站实现都不一样,如果有遇到动态生成的class,那么采用这种class来定位,可能网页每次刷新每次获取到的都会不一样。因此在选择元素的时候,选取的class或id也要慎重选择。

4、小结

此类爬虫的规则其实就是依靠元素定位来获取我们所需的内容。如果网页元素发生变更,或者xpath路径发生变化,又或者是网页进行了更新,那么都有可能会使当前规则失效,此时就需要重新寻找规律并重新获取元素。因此,如果有想要爬取的朋友要稍微注意下:

  1. 注意网页元素规则的更新
  2. 注意爬虫频率,很多网页或接口都具备限流或者IP流量检测的机制,如果爬取的频率太频繁,很容易把别人网站搞崩,又或者是IP被封禁。因此还是要礼貌爬取,文明爬取,合法爬取。
  3. 注意隐私和版权,如果爬取到了一些数据,且这些数据使用不当,就很容易侵权或成为非法使用者,这点要切记。

因此,科学上网,文明爬取。爬虫虽好,可不要贪杯哦!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

二叉树简单OJ题(及其后续函数补充)

OJ题 单值二叉树 首先呢&#xff0c;我们还是把问题分化一下&#xff0c;求一棵二叉树是否为单值二叉树&#xff0c;还是可以分为几个部分&#xff1a;根节点 左子树 右子树 而我们向下遍历的时候&#xff0c;其实就是在这个节点以及其左子树和右子树中找&#xff0c;是否值都…

本地git切换地区后,无法使用ssh访问github 22端口解决方案

问题 由于放假回家&#xff0c;发现之前一直使用正常的git&#xff0c;与github无法通讯&#xff0c;pull和push都无法连接。报错如下&#xff1a; connect to host github.com port 22: Connection timed out fatal: Could not read from remote repository. 原因 可能是所…

[学习笔记]刘知远团队大模型技术与交叉应用L3-Transformer_and_PLMs

RNN存在信息瓶颈的问题。 注意力机制的核心就是在decoder的每一步&#xff0c;都把encoder的所有向量提供给decoder模型。 具体的例子 先获得encoder隐向量的一个注意力分数。 注意力机制的各种变体 一&#xff1a;直接点积 二&#xff1a;中间乘以一个矩阵 三&#xff1a;…

常见Linux 命令,可以解决日常99%的问题

1、基本命令 uname -m 显示机器的处理器架构uname -r 显示正在使用的内核版本dmidecode -q 显示硬件系统部件(SMBIOS / DMI) hdparm -i /dev/hda 罗列一个磁盘的架构特性hdparm -tT /dev/sda 在磁盘上执行测试性读取操作系统信息arch 显示机器的处理器架构uname -m 显示机器的处…

【代码编辑器】VS Code安装下载教程及后续基本配置(一)[小白看这一篇足够了,手把手教会]

前言 Visual Studio Code&#xff08;简称“VS Code” &#xff09;是Microsoft在2015年4月30日[Build]开发者大会上正式宣布一个运行于 [Mac OS X]、[Windows]和[ Linux]之上的&#xff0c;针对于编写现代[Web]和[云应用]的跨平台[源代码编辑器],可在桌面上运行&#xff0c;并…

打折:阿里云国外服务器价格购买优惠活动

阿里云国外服务器优惠活动「全球云服务器精选特惠」&#xff0c;国外服务器租用价格24元一个月起&#xff0c;免备案适合搭建网站&#xff0c;部署独立站等业务场景&#xff0c;阿里云服务器网aliyunfuwuqi.com分享阿里云国外服务器优惠活动&#xff1a; 全球云服务器精选特惠…

vectorCast添加边界值分析测试用例

1.1创建项目成功后会自动生成封装好的函数,在这些封装好的函数上点击右键,添加边界值分析测试用例,如下图所示。 1.2生成的用例模版是不可以直接运行的,需要我们分别点击它们,让它们自动生成相应测试用例。如下图所示,分别为变化前和变化后。 1.3点击选中生成的测试用例,…

【轮式平衡机器人】——角度/速度/方向控制分析软件控制框架

轮式平衡机器人具有自不稳定性&#xff0c;可类比一级倒立摆系统的控制方法&#xff0c;常见有反馈线性化方法、非线性PID控制、自适应控制、自抗扰控制&#xff0c;还有改进的传统缺乏对外界干扰和参数改变鲁棒性的滑模变结构控制。我们采用较为简单的双闭环PID控制实现平衡模…

指标异常检测和诊断

检测 是发现问题 诊断 是找到原因 误差的分类 系统误差&#xff1a;系统误差是由于仪器本身不精确&#xff0c;或实验方法粗略&#xff0c;或实验原理不完善而产生的。随机误差&#xff1a;随机误差是由各种偶然因素对实验者、测量仪器、被测物理量的影响而产生的。粗大误差&…

【C++】用wxWidgets实现多文档窗体程序

一、基本步骤和示例代码 在wxWidgets中&#xff0c;要实现多文档窗体程序&#xff0c;通常会使用wxMDIParentFrame和wxMDIChildFrame类来创建一种标准的MDI&#xff08;多文档接口&#xff09;应用。以下是基本步骤和示例代码&#xff0c;演示如何使用wxWidgets创建多文档界面…

ChatGLM vs ChatGPT

所有的NLP大模型 都是transformer结构 1.Mask attention 的策略不同 2.训练任务目标不同 国内大模型nb公司&#xff1a;百度、清华智谱 一、主流大模型 粉色&#xff1a;Encoder-only。 绿色&#xff1a;Encoder-Decoder&#xff0c;尽头智谱ChatGLM。 蓝色&#xff1a;…

机械设计-哈工大课程学习-螺旋传动

二、摩擦类型 1、静态摩擦&#xff1a;这是身体静止时所经历的摩擦。换句话说&#xff0c;就是身体有运动倾向时的摩擦力。 2、动态摩擦&#xff1a;这是身体在运动时所经历的摩擦。也称为动摩擦。动摩擦有以下两种类型&#xff1a; ①滑动摩擦&#xff1a;一个物体在另一个…

声明式注解对XXL-JOB的定时任务代码生效吗?

说明&#xff1a;源于博主的思考&#xff0c;本文验证一下声明式注解&#xff0c;即Transactional注解&#xff0c;对XXL-JOB的定时任务是否生效。 准备 首先&#xff0c;创建一个需要事务的场景。有两张表&#xff0c;一张部门表&#xff0c;一张用户表&#xff0c;用户隶属…

huggingface学习 | 云服务器使用hf_hub_download下载huggingface上的模型文件

系列文章目录 huggingface学习 | 云服务器使用git-lfs下载huggingface上的模型文件 文章目录 系列文章目录一、hf_hub_download介绍二、找到需要下载的huggingface文件三、准备工作及下载过程四、全部代码 一、hf_hub_download介绍 hf_hub_download是huggingface官方支持&…

【Godot4自学手册】第二节主人公设置

继续学习Godot&#xff0c;今天是第二节的内容&#xff0c;本节主要完成游戏玩家的设置&#xff0c;将玩家展现在场景中。 一、新建一个主场景 首先在场景面板中单击2D场景&#xff0c;如图。 这样我们就有了一个2D场景&#xff0c;我们将Node2D重新命名为“Main”&#xff…

核密度曲线(python

目录 1.代码&#xff1a;2.效果&#xff1a;小结&#xff1a; 1.代码&#xff1a; import pandas as pd import matplotlib.pyplot as plt # 读入数据 file r123.xlsx sheet Sheet2 col S213 # 标题名称 title col 供订比曲线 xlabel 供订比 # 横轴显示范围 xleft 0 xr…

数据操作——缺失值处理

缺失值处理 缺失值的处理思路 如果想探究如何处理无效值, 首先要知道无效值从哪来, 从而分析可能产生的无效值有哪些类型, 在分别去看如何处理无效值 什么是缺失值 一个值本身的含义是这个值不存在则称之为缺失值, 也就是说这个值本身代表着缺失, 或者这个值本身无意义, 比如…

各省份经济不平等和家庭支出分布数据:恩格尔系数和泰尔指数(2000-2022年)

中国各省的恩格尔系数和泰尔指数数据为我们提供了关于这些地区居民消费结构和收入差距的了解。 恩格尔系数是衡量居民生活水平和消费结构的一个重要指标&#xff0c;它表示食品支出占家庭总支出的比例。通常&#xff0c;恩格尔系数较低表明居民的生活水平较高。 泰尔指数则是…

ChatGPT时代对大数据应用的展望

前言&#xff1a; 2022年底&#xff0c;科技圈有个爆炸性新闻&#xff0c;ChatGPT的诞生&#xff0c;引发了世界范围内的震惊&#xff1b;人工智能在与人交流上有了划时代的技术突破&#xff0c;可以和人深入的理解交流&#xff0c;让许多公司和领域对这项技术有了更多遐想。对…

ElasticSearch(ES) 搜索入门笔记

文章目录 ElasticSearch(ES) 搜索入门笔记环境准备-本地安装ES和Kibanamapping字段类型mapping 参数Analyzer自定义分析器分析器的测试中文分词 ik_maxNormalizer 其他关于mapping的要点 ES 搜索[match all 查询](https://www.elastic.co/guide/en/elasticsearch/reference/cur…
最新文章