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*/@Overridepublic 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);}}@Overridepublic 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.mzph.cn/news/638358.shtml

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

相关文章

QT的绘图系统QPainterDevice与文件系统QIODevice

QT的绘图系统&#xff08;QPainterDevice&#xff09;与文件系统&#xff08;QIODevice&#xff09; 文章目录 1、Qt 的绘图系统1、QPainter的使用2、QPen(画笔&#xff09;及QBursh&#xff08;画刷&#xff09;3、手动更新窗口4、绘图设备1、四种绘图设备的 区别2、 QBitmap3…

零食折扣店,注定昙花一现?

年终岁末&#xff0c;又到了各类休闲零食产品一年一度的销售旺季。与过去不同的是&#xff0c;近年来的休闲零食赛道正因大量零食折扣店的涌现而显得热闹非凡。 随着主打折扣、低价的零食折扣店成为消费者特别是三四线下沉市场消费者的新宠&#xff0c;资本开始涌入并快速推动…

SpringCloud之OpenFeign的学习、快速上手

1、什么是OpenFeign OpenFeign简化了Http的开发。在RestTemplate的基础上做了封装&#xff0c;在微服务中的服务调用发送网络请求起到了重要的作用&#xff0c;简化了开发&#xff0c;可以让我们跟写接口一样调其他服务。 并且OpenFeign内置了Ribbon实现负载均衡。 官方文档…

69.使用Go标准库compress/gzip压缩数据存入Redis避免BigKey

文章目录 一&#xff1a;简介二&#xff1a;Go标准库compress/gzip包介绍ConstantsVariablestype Headertype Reader 三&#xff1a;代码实践1、压缩与解压工具包2、单元测试3、为何压缩后还要用base64编码 代码地址&#xff1a; https://gitee.com/lymgoforIT/golang-trick/t…

SpringBoot3整合OpenAPI3(Swagger3)

文章目录 一、引入依赖二、使用1. OpenAPIDefinition Info2. Tag3. Operation4. Parameter5. Schema6. ApiResponse swagger2更新到3后&#xff0c;再使用方法上发生了很大的变化&#xff0c;名称也变为OpenAPI3。 官方文档 一、引入依赖 <dependency><groupId>…

深度解析Python关键字:掌握核心语法的基石(新版本35+4)

目录 关键字 keyword 关键字列表 kwlist softkwlist 关键字分类 数据类型 True、False None 运算类型 and、or、not in is 模块导入 import 辅助关键字 from、as 上下文管理 with 占位语句 pass 流程控制 if、elif、else for while break、continue…

第十回 朱贵水亭施号箭 林冲雪夜上梁山-FreeBSD/Linux 控制台基础操作

林冲被众庄客捉住&#xff0c;吊在门楼下&#xff0c;正被打时&#xff0c;柴进来了&#xff0c;赶快把林冲救下来。原来这是柴进打猎用的小庄子&#xff0c; 林冲就把火烧草料场一事跟柴进详细的说了。柴进说兄弟真是命运多磨难啊。林冲住了几日&#xff0c;恐怕连累柴进&…

Laykefu客服系统 任意文件上传漏洞复现

0x01 产品简介 Laykefu 是一款基于workerman+gatawayworker+thinkphp5搭建的全功能webim客服系统,旨在帮助企业有效管理和提供优质的客户服务。 0x02 漏洞概述 Laykefu客服系统/admin/users/upavatar.html接口处存在文件上传漏洞,而且当请求中Cookie中的”user_name“不为…

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

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

找不到vcruntime140_1.dll无法继续执行怎么办?全面分析修复方法

当系统提示vcruntime140_1.dll文件出现错误时&#xff0c;可能会引发一系列影响计算机正常运行的问题。这个特定的动态链接库文件&#xff08;DLL&#xff09;是Microsoft Visual C Redistributable的一部分&#xff0c;对于许多基于Windows的应用程序来说至关重要。一旦vcrunt…

回归预测 | Python基于ALO-BiGRU蚁狮优化算法优化双向BiGRU多变量回归预测+适应度曲线+多个评价指标

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 ALO算法是Mirjalili于2015提出的一种新型元启发式群智能算法。由于引入了随机游走、轮盘赌策略及精英策略&#xff0c;使得 ALO 算法成为一种种群多样、寻优性能强、调节参数少、易于实现的搜索技术 python代码 优化参…

线段树详解

什么是线段树&#xff1f; 1、线段树是一棵二叉搜索树&#xff0c;它储存的是一个区间的信息。 2、每个节点以结构体的方式存储&#xff0c;结构体包含以下几个信息&#xff1a; 区间左端点、右端点&#xff1b;&#xff08;这两者必有&#xff09; 这个区间要维护的信息&…

【leetcode】移除元素

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家刷题&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 一.暴力求解法二.使用额外数组三.原地修改数组 点击查看题目 一.暴力求解法 若我们不考虑时间复杂度…

【题目】2023年国赛信息安全管理与评估正式赛任务书-模块3 CTF

全国职业院校技能大赛 高等职业教育组 信息安全管理与评估 任务书 模块三 网络安全渗透、理论技能与职业素养 竞赛相关资源资料可在文末关注公众号获得 比赛时间及注意事项 本阶段比赛时长为180分钟&#xff0c;时间为9:00-12:00。 【注意事项】 &#xff08;1&#xf…

算法优化:LeetCode第122场双周赛解题策略与技巧

接下来会以刷常规题为主 &#xff0c;周赛的难题想要独立做出来还是有一定难度的&#xff0c;需要消耗大量时间 比赛地址 3011. 判断一个数组是否可以变为有序 public class Solution {public int minimumCost(int[] nums) {if (nums.length < 3) {// 数组长度小于3时&a…

UG制图-创建图纸的多种方法

1、2D&#xff1a;创建独立2D图纸&#xff0c;不引用任何3D模型 在UG软件中选择新建&#xff0c;或者快捷键ctrl N&#xff0c;进入新建命令&#xff0c;然后点击图纸&#xff0c;在关系中选择独立的部件&#xff0c;就创建了一个独立的图纸&#xff0c;我们可以在装配中添加…

项目管理该考哪个证书❓NPDP还是软考❓

有小伙伴在纠结是要考NPDP认证呢还是考软考呢❓ 今天小编要给大家好好说说NPDP认证❗️ &#x1f4a1;NPDP全称New Product Development Professional&#xff0c;也就是产品经理国际资格认证。 &#x1f525;NPDP是国际公认的为一的新产品开发专业认证&#xff0c;是集理论、方…

「环境配置」使用Windows自带工具清理C盘空间

​ Windows电脑操作系统一般是安装在磁盘驱动器的C盘中&#xff0c;一旦运行&#xff0c;便会产生许多垃圾文件&#xff0c;C盘空间在一定程度上都会越来越小。伴随着电脑工作的时间越久&#xff0c;C盘常常会提示显示其内存已不足。本文记录笔者清理机器的步骤。 一、使用Win…

在Qt中通过控制按钮实现登录界面密码与明码的转换

创建控件&#xff1a; 首先&#xff0c;在Qt设计师界面界面上创建QLineEdit类文本框&#xff0c;用于输入密码&#xff0c;并且实现密码与明码相互转化。 设置初始状态&#xff1a; 默认情况下&#xff0c;输入密码的文本框应该是可见的并允许用户输入。 添加切换按钮&…

【Oracle】收集Oracle数据库内存相关的信息

文章目录 【Oracle】收集Oracle数据库内存相关的信息收集Oracle数据库内存命令例各命令的解释输出结果例参考 【声明】文章仅供学习交流&#xff0c;观点代表个人&#xff0c;与任何公司无关。 编辑|SQL和数据库技术(ID:SQLplusDB) 【Oracle】收集Oracle数据库内存相关的信息 …