java爬虫框架—WebMagic

article/2025/10/17 3:03:05

什么是网络爬虫

从功能上来讲,爬虫一般分为数据采集,处理,储存三个部分。爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件。

网络爬虫常用的技术

底层实现 HttpClient + Jsoup

 HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。HttpClient 已经应用在很多的项目中,比如 Apache Jakarta 上很著名的另外两个开源项目 Cactus 和 HTMLUnit 都使用了 HttpClient。更多信息请关注http://hc.apache.org/。
 Jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
 HttpClient 是用来下载网页源代码的,Jsoup 用来从网页源代码中解析需要的内容。

Webmagic框架

webmagic是一个开源的Java爬虫框架,目标是简化爬虫的开发流程,让开发者专注于逻辑功能的开发。webmagic 的核心非常简单,但是覆盖爬虫的整个流程,也是很好的学习爬虫开发的材料。

爬虫框架 Webmagic 介绍

架构的四大组件

WebMagic的结构分为Downloader、PageProcessor、Scheduler、Pipeline四大组件,并由Spider将它们彼此组织起来。这四大组件对应爬虫生命周期中的下载、处理、管理和持久化等功能。而Spider则将这几个组件组织起来,让它们可以互相交互,流程化的执行,可以认为Spider是一个大的容器,它也是WebMagic逻辑的核心。
在这里插入图片描述
简单解释一下:Downloader 负责将网页的源代码爬取下来,PageProcesser 指定爬取的规则(即指定爬取什么内容),然后交由 Pipeline 进行将爬取的内容存储,同时将 网址 交给 Scheduler 管理,防止 Downloader 再次爬取到这个页面,防止爬取重复内容。

  • Downloader
    Downloader负责从互联网上下载页面,以便后续处理。WebMagic默认使用了 ApacheHttpClient 作为下载工具。

  • PageProcessor
    PageProcessor负责解析页面,抽取有用信息,以及发现新的链接。WebMagic使用 Jsoup 作为HTML解析工具,并基于其开发了解析XPath的工具Xsoup。在这四个组件中,PageProcessor对于每个站点每个页面都不一样,是需要使用者定制的部分。

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

  • Pipeline
    Pipeline 负责抽取结果的处理,包括计算、持久化到文件、数据库等。WebMagic 默认提供了“输出到控制台”和“保存到文件”两种结果处理方案,也可以自定义 Pipeline。

PageProcessor

爬取页面全部内容

需求:编写爬虫程序,爬取csdn中博客的内容 https://blog.csdn.net/
1)引入依赖

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

2)编写类实现网页内容的爬取

public class MyProcessor implements PageProcessor {public void process(Page page) {// 将爬取的网页源代码输出到控制台System.out.println(page.getHtml().toString());}public Site getSite() {return Site.me().setSleepTime(100).setRetryTimes(3);}public static void main(String[] args) {Spider.create(new MyProcessor()).addUrl("https://blog.csdn.net/").run();}
}

Spider是爬虫启动的入口。在启动爬虫之前,我们需要使用一个 PageProcessor 创建一个 Spider 对象,然后使用 run() 进行启动。
Spider 的一些方法:
在这里插入图片描述
在这里插入图片描述
同时 Spider 的其他组件(Downloader、Scheduler、Pipeline)都可以通过set方法来进行设置。
​Page代表了从Downloader下载到的一个页面——可能是HTML,也可能是JSON或者其他文本格式的内容。Page 是 WebMagic 抽取过程的核心对象,它提供一些方法可供抽取、结果保存等。
​Site 用于定义站点本身的一些配置信息,例如编码、HTTP头、超时时间、重试策略等、代理等,都可以通过设置Site对象来进行配置。
Site 的一些方法:
在这里插入图片描述

爬取指定内容(Xpath)

如果我们想爬取网页中部分的内容,需要指定 xpath。 XPath,即为XML路径语言(XMLPathLanguage),它是一种用来确定XML文档中某部分位置的语言。XPath 使用路径表达式来选取 XML 文档中的节点或者节点集。这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似。
我们通过指定xpath来抓取网页的部分内容:

System.out.println(page.getHtml().xpath("//*[@id=\"mainBox\"]/main/div[1]/div/div/div[1]/h1").toString());

获取 xpath 的简单方法:打开网页,按 F12
在这里插入图片描述

添加目标地址

我们可以通过添加目标地址,从种子页面爬取到更多的页面:
在这里插入图片描述

目标地址正则匹配

有时候我们需要将当前页面里 只有符合要求的链接 才添加到目标页中,这时候我们就可以利用正则表达式对 链接 进行筛选:

// 添加目标地址,从一个页面爬到另一个页面
page.addTargetRequests(page.getHtml().links().regex("https://blog.csdn.net/[a-z 0-9 _]+/article/details/[0-9]{8}").all());
System.out.println(page.getHtml().xpath("//*[@id=\"mainBox\"]/main/div[1]/div/div/div[1]/h1").toString());

PipeLine

ConsolePipeline 控制台输出

在这里插入图片描述
将处理结果输出到控制台

FilePipeline 文件保存

在这里插入图片描述

以 json 方式保存

在这里插入图片描述

自定义 Pipeline

一般我们需要将爬取的数据放到数据库中,这时候我们就可以自定义 Pipeline
创建一个类,实现 Pipeline 接口:
在这里插入图片描述
修改 main 方法:
在这里插入图片描述

Scheduler

我们刚才完成的功能,每次运行可能会爬取重复的页面,这样做是没有任何意义的。Scheduler(URL管理) 最基本的功能是实现对已经爬取的 URL 进行标示。可以实现 URL 的增量去重。
目前scheduler主要有三种实现方式:

  • 内存队列 QueueScheduler:地址存于内存中,适合于单次爬取
  • 文件队列 FileCacheQueueScheduler:地址存于本机文件中,适合于单机爬取
  • Redis队列 RedisScheduler:地址存于 redis 中,适合于分布式爬取

内存队列

使用 setScheduler来设置 Scheduler:
在这里插入图片描述

文件队列

使用文件保存抓取 URL,可以在关闭程序并下次启动时,从之前抓取到的 URL 继续抓取
不过使用这种方式首先要保证 文件目录 存在,所以先创建 文件的保存目录:
在这里插入图片描述
运行后文件夹 E:\scheduler 会产生两个文件 blog.csdn.net.urls.txt 和 blog.csdn.net.cursor.txt

Redis 队列

使用Redis保存抓取队列,可进行多台机器同时合作抓取
首先运行 redis 服务端
在这里插入图片描述

实例(爬取 csdn 博客的用户昵称 和 头像)

1)引入依赖

<dependency><groupId>us.codecraft</groupId><artifactId>webmagic-core</artifactId><version>0.7.3</version><exclusions><exclusion><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId></exclusion></exclusions>
</dependency>
<dependency><groupId>us.codecraft</groupId><artifactId>webmagic-extension</artifactId><version>0.7.3</version>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency><groupId>com.tensquare</groupId><artifactId>tensquare_common</artifactId><version>1.0-SNAPSHOT</version>
</dependency>

2)创建配置文件

server:port: 9014
spring:application:name: tensquare-article-crawler #指定服务名datasource:driverClassName: com.mysql.jdbc.Driverurl: jdbc:mysql://192.168.227.129:3306/tensquare_article?characterEncoding=UTF8username: rootpassword: 123456jpa:database: MySQLshow-sql: trueredis:host: 192.168.227.129

3)创建启动类

@SpringBootApplication
public class ArticleCrawlerApplication {public static void main(String[] args) {SpringApplication.run(ArticleCrawlerApplication.class);}@Value("${spring.redis.host}")private String redis_host;@Beanpublic IdWorker idWorker(){return new IdWorker(1,1);}@Beanpublic RedisScheduler redisScheduler(){return new RedisScheduler(redis_host);}
}

4)创建爬取类
打开网页,按 F12,找到头像和昵称
在这里插入图片描述
如上图:头像是标签里的一个属性,如何获取呢?

@Component
public class UserProcessor implements PageProcessor {@Overridepublic void process(Page page) {// 添加目标地址,从一个页面爬到另一个页面page.addTargetRequests(page.getHtml().links().regex("https://blog.csdn.net/[a-z 0-9 _]+/article/details/[0-9]{8}").all());// 添加字段,代码结构化,可多次使用String nickName = page.getHtml().xpath("//*[@id=\"uid\"]/text()").get();String image = page.getHtml().xpath("//*[@id=\"asideProfile\"]/div[1]/div[1]/a/img[1]/@src").get();if (nickName != null && image != null){page.putField("nickName",nickName);page.putField("image",image);} else {// 不执行后面的步骤page.setSkip(true);}}@Overridepublic Site getSite() {return Site.me().setSleepTime(100).setRetryTimes(3);}
}

只需要在相应的 xpath 路径后加 /@属性名称
我们得到头像的存储地址后,还需要下载到本地,然后上传到自己的图片服务器,所以还需要一个下载工具类

package util;
import java.io.*;
import java.net.URL;
import java.net.URLConnection;
/*** 下载工具类*/
public class DownloadUtil {public static void download(String urlStr,String filename,String savePath) throws IOException {URL url = new URL(urlStr);//打开url连接URLConnection connection = url.openConnection();//请求超时时间connection.setConnectTimeout(5000);//输入流InputStream in = connection.getInputStream();//缓冲数据byte [] bytes = new byte[1024];//数据长度int len;//文件File file = new File(savePath);if(!file.exists())file.mkdirs();OutputStream out  = new FileOutputStream(file.getPath()+"\\"+filename);//先读到bytes中while ((len=in.read(bytes))!=-1){//再从bytes中写入文件out.write(bytes,0,len);}//关闭IOout.close();in.close();}
}

5)创建入库类

@Component
public class UserPipeline implements Pipeline {@Autowiredprivate IdWorker idWorker;@Autowiredprivate UserDao userDao;@Overridepublic void process(ResultItems resultItems, Task task) {String nickName = resultItems.get("nickName");String image = resultItems.get("image");String imageName = image.substring(image.lastIndexOf("/") + 1) + ".jpg";User user = new User();user.setId(idWorker.nextId()+"");user.setAvatar(imageName);user.setNickname(nickName);// 将用户存入数据库userDao.save(user);// 将图片下载下载try {DownloadUtil.download(image,imageName,"E:/tensquare/userimage");} catch (IOException e) {e.printStackTrace();}}
}

6)创建任务类

@Component
public class UserTask {@Autowiredprivate UserProcessor userProcessor;@Autowiredprivate UserPipeline userPipeline;@Autowiredprivate RedisScheduler redisScheduler;@Scheduled(cron = "0 57 22 * * ?")public void UserTask(){Spider spider = Spider.create(userProcessor);spider.addUrl("https://blog.csdn.net/");spider.addPipeline(userPipeline);spider.setScheduler(redisScheduler);spider.start();}
}

7)启动类添加注解
在这里插入图片描述
8)运行该模块,到指定的时间就会自动爬取数据了


http://chatgpt.dhexx.cn/article/FjcPTkwO.shtml

相关文章

java爬虫框架哪个好_java爬虫框架的使用

原标题&#xff1a;java爬虫框架的使用 随着互联网的发展&#xff0c;编程程序语言也开始被越来越多的人所掌握&#xff0c;但是自始至终&#xff0c;java语言一直是被使用范围最广的编程语言。今天&#xff0c;武汉中软国际主要给大家讲解的是java语言中的爬虫java框架结构是怎…

Java爬虫框架WebMagic

WebMagic的架构设计参照了Scrapy&#xff0c;而实现则应用了HttpClient、Jsoup等Java成熟的工具。 WebMagic由四个组件(Downloader、PageProcessor、Scheduler、Pipeline)构成: Downloader : 下载器PageProcessor: 页面解析器Scheduler&#xff1a; 任务分配、url去重Pipelin…

Java爬虫框架之WebMagic的学习总结

Java爬虫框架之WebMagic WebMagic概述特性架构四大组件数据流转对象控制爬虫运转的引擎Spider WebMagic的基本使用添加WebMagic的核心与扩展依赖爬虫实现 爬虫的编写过程实现PageProcessor爬虫配置抽取页面元素链接的发现 Selectable抽取元素抽取部分API获取结果的API 使用Pipe…

Java爬虫(三)-- 爬虫框架WebMagic的使用(以csdn页面为例)

一、WebMagic介绍 WebMagic是当前比较主流的一款Java爬虫框架。WebMagic项目代码分为核心和扩展两部分。核心部分(webmagic-core)是一个精简的、模块化的爬虫实现&#xff08;这部分提供非常简单、灵活的API&#xff0c;在基本不改变开发模式的情况下&#xff0c;编写一个爬虫…

JAVA爬虫框架

WebMagic框架 webmagic结构分为Downloader,pageProcessor,Scheduler,pipeline四大组件 并由splider将他们组织起来 这四大组件对应着爬虫生命周期中的下载 处理 管理 和持久化等功能,依赖 <dependency><groupId>org.springframework.boot</groupId>&l…

一款非常牛逼的Java爬虫框架(高度灵活可配置)

点击关注公众号&#xff0c;利用碎片时间学习 介绍 平台以流程图的方式定义爬虫,是一个高度灵活可配置的爬虫平台 特性 支持Xpath/JsonPath/css选择器/正则提取/混搭提取支持JSON/XML/二进制格式支持多数据源、SQL select/selectInt/selectOne/insert/update/delete支持爬取JS动…

svn 图标不显示 window10

今天打开电脑&#xff0c;同步代码的时候&#xff0c;发现&#xff0c;所有的目录svn的图标都不显示了。 早在几年前遇到过一次&#xff0c;通过clear可以恢复&#xff0c;可是这次几次clear也不管用。 然后&#xff0c;果断打开svn的设置。找到图标的设定。 设定如下&#…

win10 SVN图标不显示 已解决

原因&#xff1a; SVN的图标的排位顺序排在下面去了&#xff0c;导致其它图标占用了它的位置&#xff0c;也就是需要把Tortoise的位置提到上面来 解决办法&#xff1a; winR&#xff0c;输入regedit进入注册表 ctrlf搜索ShellIconOverlayIdentifiers&#xff08;这里需要一会…

SVN文件夹不显示图标解决方法

从svn服务器上将文件夹导出到本地文件之后&#xff0c;svn相关文件夹没有显示相应的图标&#xff0c;解决方法如下。对于SVN来说&#xff0c;因为每个图标都代表着不同的含义&#xff0c;预示着不同的状态&#xff0c;是指示灯的作用&#xff0c;如果没有正确的图标很可能造成数…

win10 SVN 图标不显示的解决办法

win10 SVN 图标不显示的解决办法 前言一、进入注册表二、设置文件名三、重启四、检查五、原理 前言 项目关联到 SVN 之后&#xff0c;一般情况下会有各种各样的状态图标。用来标注本地与 SVN 版本异同情况。但是有时候看不到示意图标&#xff0c;今天记录一下解决办法。 一、…

svn图标没有显示的解决办法

解决办法&#xff1a; 1.打开注册表 键盘输入winr 运行&#xff0c;打开 regedit 2.修改注册表 打开注册表的如下路径&#xff0c;将前几个名字重命名&#xff0c;把名字前面的空格去掉&#xff0c;修改完成后&#xff0c;重启电脑即可。 \HKEY_LOCAL_MACHINE\SOFTWARE\Micr…

SVN、GIT图标不显示解决方案

1、WIN R打开 “运行”&#xff0c;输入"regedit"&#xff0c;打开注册表&#xff0c;然后复制下面的地址到地址栏&#xff0c;如下&#xff1a; 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers如上图…

svn的图标突然不显示了

摘抄 https://www.jianshu.com/p/92e8e1f345c0 摘抄 https://www.jianshu.com/p/92e8e1f345c0 摘抄 https://www.jianshu.com/p/92e8e1f345c0 作者&#xff1a;易冷zzz 链接&#xff1a;https://www.jianshu.com/p/92e8e1f345c0 来源&#xff1a;简书 著作权归作者所有。商业转…

解决 win11 git svn 图标问题

不要怀疑&#xff0c;我尝试过网上各种修复方式&#xff0c;也下载过各种修复工具&#xff0c;然都失败了。 别迟疑&#xff0c;以下是最有效的方法&#xff1a; 1、winr&#xff0c;输入 regedit 打开注册表&#xff1b; 2、找到路径【计算机\HKEY_LOCAL_MACHINE\SOFTWARE\M…

Mac SnailSVN不显示状态图标

snailsvn 官网 依次打开 系统设置 -> 扩展 -> 查找程序调整优先级(优先级按降序排序)在我的扩展中没有找到排序功能, 就暂时禁用掉了 有关文件夹操作的拓展. (作者的描述: 如果有多个 Finder 扩展同时监视同一文件夹, 会有优先级问题, 只有最先出现的扩展才能添加图标…

SVN图标消失解决方案

1、首先打开注册表 WINR组合键打开运行窗口&#xff0c;输入regedit命令并回车 2、打开注册表窗口后然后找到以下目录&#xff1a; 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers 3、将我们需要的文件前面加上空…

解决svn文件图标不显示

1.首先检查svn设置中是否设置图标显示 2.winR&#xff0c;输入regedit&#xff0c;调出注册表信息&#xff0c;按下CtrlF,在注册表里搜索“ShellIconOverlayIdentifiers”查看是否存在Tortoise文件&#xff0c;存在直接跳到第四步&#xff0c;不存在&#xff0c;进行第三步 3. …

【SVN】win10下SVN图标不显示

目录 一、现象 二、打开注册表 三、找到SVN路径 四、重启电脑 一、现象 windows10绿色ICON不显示 二、打开注册表 winR 打开运行&#xff0c;输入regedit 三、找到SVN路径 \HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdent…

svn服务器调整显示图标修改,svn图标不显示可以通过调整Tortoise图标名称的字母顺序来解决...

svn图标不显示可以通过调整Tortoise图标名称的字母顺序来解决 发布时间&#xff1a;2013-06-02 17:28:13 作者&#xff1a;佚名 我要评论 我们可以调整Tortoise图标名称的字母顺序&#xff0c;来提高Tortoise的优先位置&#xff0c;因为Windows 内部就是安装名称的字母顺序…

win10系统解决Svn图标不显示的问题

win10系统解决Svn图标不显示的问题 1.问题 刚才对ruoyi的文件进行了修改但是没有任何的修改的符号。我该如何恢复图标呢&#xff1f; 2.解决策略-修改注册表 出现问题的原因&#xff1a;图标名称优先级不够,不能被使用 第一步&#xff1a;winR&#xff0c;输入regedit 第二…