Java爬虫框架WebMagic简介及使用

article/2025/10/17 0:37:21

一、介绍

​ webmagic的是一个无须配置、便于二次开发的爬虫框架,它提供简单灵活的API,只需少量代码即可实现一个爬虫。webmagic采用完全模块化的设计,功能覆盖整个爬虫的生命周期(链接提取、页面下载、内容抽取、持久化),支持多线程抓取,分布式抓取,并支持自动重试、自定义UA/cookie等功能。




二、概览

​ WebMagic项目代码分为核心和扩展两部分。核心部分(webmagic-core)是一个精简的、模块化的爬虫实现,而扩展部分则包括一些便利的、实用性的功能(例如注解模式编写爬虫等)。
​ WebMagic的结构分为Downloader、PageProcessor、Scheduler、Pipeline四大组件,并由Spider将它们彼此组织起来。这四大组件对应爬虫生命周期中的下载、处理、管理和持久化等功能。而Spider则将这几个组件组织起来,让它们可以互相交互,流程化的执行,可以认为Spider是一个大的容器,它也是WebMagic逻辑的核心。
  
WebMagic总体架构图如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BouJd1qq-1569569462343)(/Users/guih/Desktop/111.png)]


2.1 WebMagic的四个组件
  • Downloader

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

  • PageProcessor

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

  • Scheduler

    Scheduler负责管理待抓取的URL,以及一些去重的工作。WebMagic默认提供了JDK的内存队列来管理URL,并用集合来进行去重。也支持使用Redis进行分布式管理。除非项目有一些特殊的分布式需求,否则无需自己定制Scheduler。

  • Pipeline

    Pipeline负责抽取结果的处理,包括计算、持久化到文件、数据库等。WebMagic默认提供了“输出到控制台”和“保存到文件”两种结果处理方案。Pipeline定义了结果保存的方式,如果你要保存到指定数据库,则需要编写对应的Pipeline。对于一类需求一般只需编写一个Pipeline。


2.2 用于数据流转的对象
  • Request

    Request是对URL地址的一层封装,一个Request对应一个URL地址。它是PageProcessor与Downloader交互的载体,也是PageProcessor控制Downloader唯一方式。

  • Page

    Page代表了从Downloader下载到的一个页面——可能是HTML,也可能是JSON或者其他文本格式的内容。Page是WebMagic抽取过程的核心对象,它提供一些方法可供抽取、结果保存等。

  • ReusltItems

    ReusltItems相当于一个Map,它保存PageProcessor处理的结果,供Pipeline使用。它的API与Map很类似,值得注意的是它有一个字段skip,若设置为true,则不应被Pipeline处理。


2.3 控制爬虫运转的引擎—Spider

​ Spider是WebMagic内部流程的核心。Downloader、PageProcessor、Scheduler、Pipeline都是Spider的一个属性,这些属性是可以自由设置的,通过设置这个属性可以实现不同的功能。Spider也是WebMagic操作的入口,它封装了爬虫的创建、启动、停止、多线程等功能。
​ 对于编写一个爬虫,PageProcessor是需要编写的部分,而Spider则是创建和控制爬虫的入口。


2.4 WebMagic项目组成

WebMagic项目代码包括几个部分,在根目录下以不同目录名分开。它们都是独立的Maven项目。
WebMagic主要包括两个包,这两个包经过广泛实用,已经比较成熟:

  • webmagic-core
    webmagic-core是WebMagic核心部分,只包含爬虫基本模块和基本抽取器。

  • webmagic-extension

    webmagic-extension是WebMagic的主要扩展模块,提供一些更方便的编写爬虫的工具。包括注解格式定义爬虫、JSON、分布式等支持。




三、 基本的爬虫

3.1 爬虫的流程 (可以参考上边的框架架构图)
  1. Downloader-页面下载

    • 页面下载是一切爬虫的开始。

      大部分爬虫都是通过模拟http请求,接收并分析响应来完成。这方面,JDK自带的HttpURLConnection可以满足最简单的需要,而Apache HttpClient(4.0后整合到HttpCompenent项目中)则是开发复杂爬虫的不二之选。它支持自定义HTTP头(对于爬虫比较有用的就是User-agent、cookie等)、自动redirect、连接复用、cookie保留、设置代理等诸多强大的功能。

      webmagic使用了HttpClient 4.2,并封装到了HttpClientDownloader。学习HttpClient的使用对于构建高性能爬虫是非常有帮助的,官方的Tutorial就是很好的学习资料。目前webmagic对HttpClient的使用仍在初步阶段,不过对于一般抓取任务,已经够用了


  1. PageProcessor-页面分析及链接抽取

    • 这里说的页面分析主要指HTML页面的分析。页面分析可以说是垂直爬虫最复杂的一部分,在webmagic里,PageProcessor是定制爬虫的核心。通过编写一个实现PageProcessor接口的类,就可以定制一个自己的爬虫
    • HTML分析是一个比较复杂的工作,Java世界主要有几款比较方便的分析工具:
      • Jsoup
      • HtmlParser
      • Apache tika
      • HtmlCleaner与Xpath
    • webmagic的Selector
      • Selector是webmagic为了简化页面抽取开发的独立模块,是整个项目中我最得意的部分。这里整合了CSS Selector、XPath和正则表达式,并可以进行链式的抽取,很容易就实现强大的功能。即使你使用自己开发的爬虫工具,webmagic的Selector仍然值得一试

  2. Scheduler-URL管理

    • URL管理的问题可大可小。对于小规模的抓取,URL管理是很简单的。我们只需要将待抓取URL和已抓取URL分开保存,并进行去重即可。使用JDK内置的集合类型Set、List或者Queue都可以满足需要。如果我们要进行多线程抓取,则可以选择线程安全的容器,例如LinkedBlockingQueue以及ConcurrentHashMap。因为小规模的URL管理非常简单,很多框架都并不将其抽象为一个模块,而是直接融入到代码中。但是实际上,抽象出Scheduler模块,会使得框架的解耦程度上升一个档次,并非常容易进行横向扩展,这也是我从scrapy中学到的。


  1. Pipeline-离线处理和持久化
    • Pipeline其实也是容易被忽略的一部分。大家都知道持久化的重要性,但是很多框架都选择直接在页面抽取的时候将持久化一起完成,例如crawer4j。但是Pipeline真正的好处是,将页面的在线分析和离线处理拆分开来,可以在一些线程里进行下载,另一些线程里进行处理和持久化。


3.2 使用WebMagic爬取一个壁纸网站

​ 首先引入WebMagic的依赖,webmagic-core-{version}.jar和webmagic-extension-{version}.jar。在项目中添加这两个包的依赖,即可使用WebMagic。
  
maven中引入依赖jar包

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

不使用maven的用户,可以去http://webmagic.io中下载最新的jar包。


3.3 爬虫的实现
  1. 实现PageProcessor接口
    • 在WebMagic里,实现一个基本的爬虫只需要编写一个类,实现PageProcessor接口即可。这个类基本上包含了抓取一个网站,你需要写的所有代码


  1. 爬虫的配置

    • 爬虫相关配置,如抓取间隔、休息时间等
    private Site site = Site.me().setRetryTimes(3).setSleepTime(1000).setTimeOut(3000);
    


  1. 编写爬虫代码

    • 这里我们爬取的是一个壁纸网站 https://wallhaven.cc/
    package photo;import us.codecraft.webmagic.Page;
    import us.codecraft.webmagic.Site;
    import us.codecraft.webmagic.Spider;
    import us.codecraft.webmagic.processor.PageProcessor;import java.io.FileNotFoundException;
    import java.io.IOException;public class GetPhoto implements PageProcessor {// 设置参数private Site site = Site.me().setRetryTimes(3).setSleepTime(1000).setTimeOut(3000);/*** 主方法启动爬虫*/public static void main(String[] args) {// 这里只爬取第一页的壁纸,如果要爬取其他页数修改for循环参数即可for (int i = 1; i <= 1; i++) {// 启动爬虫Spider.create(new GetPhoto())// 添加初始化的URL.addUrl("https://wallhaven.cc/toplist?page=" + i)// 使用单线程.thread(1)// 运行.run();}}/*** 页面处理逻辑* 也就是访问主程序中的URL后得到的页面** 爬虫思路:*      1. 主程序访问URL后得到页面*      2. 将得到的页面解析出需要的参数,并将解析出来并且需要爬取的链接放入爬取目标中 (45-59行)*          TIPS:WebMagic会自动去识别哪些连接爬取过哪些没有。*      3. 访问第二步中放入的链接得到页面,并解析(62行)*      4. 将图片的名字和后缀提取出来以便保存(64-77行)*/public void process(Page page) {// 一页是24张图片for (int i = 1; i <= 24; i++) {// 使用Xpath解析,获取到单个图片的网页// WebMagic支持使用Xpath、CSS选择器、正则表达式、JsonPath来解析页面String str = page.getHtml().xpath("//div[@id=thumbs]/section/ul/li[" + i + "]/figure/a[@class=preview]/@href").toString();// 获取到的连接为null则退出循环,不添加进爬取目标if (str == null)break;// 将爬取到的链接添加到待爬取页面中page.addTargetRequest(str);}// 将页面中图片的地址提取出来,以便于使用工具类保存String pageURL = page.getHtml().xpath("//img[@id=wallpaper]/@src").toString();if (pageURL != null) {try {// 获取图片的名字和后缀提取出来用于保存String name = pageURL.substring(pageURL.length() - 9, pageURL.length() - 4);String suffix = pageURL.substring(pageURL.length() - 4);// 将图片的地址、名字、保存路径传入文件工具类进行下载DownloadImage.downLoadFromUrl(pageURL, name + suffix, "src/file/");} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}public Site getSite() {return site;}
    }


  2. 储存资源(工具类)

    package photo;import java.io.*;
    import java.net.HttpURLConnection;
    import java.net.URL;class DownloadImage {public static void downLoadFromUrl(String urlStr, String fileName, String savePath) throws IOException {URL url = new URL(urlStr);HttpURLConnection conn = (HttpURLConnection) url.openConnection();// 设置超时间为3秒conn.setConnectTimeout(3 * 1000);// 防止屏蔽程序抓取而返回403错误conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");// 得到输入流InputStream inputStream = conn.getInputStream();// 获取自己数组byte[] getData = readInputStream(inputStream);// 文件保存位置File saveDir = new File(savePath);if (!saveDir.exists()) {saveDir.mkdir();}File file = new File(saveDir + File.separator + fileName);FileOutputStream fos = new FileOutputStream(file);fos.write(getData);if (fos != null) {fos.close();}if (inputStream != null) {inputStream.close();}System.out.println("info:" + url + " download success");}private static byte[] readInputStream(InputStream inputStream) throws IOException {byte[] buffer = new byte[1024];int len = 0;ByteArrayOutputStream bos = new ByteArrayOutputStream();while ((len = inputStream.read(buffer)) != -1) {bos.write(buffer, 0, len);}bos.close();return bos.toByteArray();}
    }






参考连接:

https://blog.csdn.net/u012385190/article/details/51517466

https://my.oschina.net/flashsword/blog/145796#h4_7

http://webmagic.io/docs/zh/posts/ch1-overview/


http://chatgpt.dhexx.cn/article/4X1ZandL.shtml

相关文章

一款非常牛逼的 Java 爬虫框架!(请低调使用)

关注Java核心技术&#xff0c;推送更多 Java 干货&#xff01; 介绍 平台以流程图的方式定义爬虫,是一个高度灵活可配置的爬虫平台 特性 支持Xpath/JsonPath/css选择器/正则提取/混搭提取支持JSON/XML/二进制格式支持多数据源、SQL select/selectInt/selectOne/insert/update/d…

推荐一个智能的 Java 爬虫框架

介绍 平台以流程图的方式定义爬虫,是一个高度灵活可配置的爬虫平台 特性 支持Xpath/JsonPath/css选择器/正则提取/混搭提取支持JSON/XML/二进制格式支持多数据源、SQL select/selectInt/selectOne/insert/update/delete支持爬取JS动态渲染(或ajax)的页面支持代理支持自动保存…

java爬虫框架(java爬虫框架webmagic)

Java页面框架有哪些呢&#xff1f; 主要应用技术&#xff1a;EJB等出处&#xff1a;java.sun.com/blueprints/code/index.简述&#xff1a;这是SUN在展示J2EE平台时所用的例子PetStore(宠物商店系统)里面的框架 常见的JAVA框架有什么呢&#xff1f; 基于MVC模式&#xff0c;结构…

Java爬虫框架wemgic_Java爬虫框架-WebMagic挖坑补坑指南

以前总是用的Python下的Scrapy和crawley和PHP的小众爬虫框架&#xff0c;最近突然想到了何不用下Java下的框架试试&#xff1f; 查了下Java下的爬虫框架自然也不在少数&#xff0c;Nutch,WebMagic,WebCollector,这三个绝对是够用了&#xff0c;爬一般的网站不在话下&#xff0c…

java爬虫框架哪个好_Java爬虫(二)Java爬虫框架

关于本文&#xff1a; 之前写了个Java爬虫(一)&#xff0c;拖更了很久&#xff0c;今天终于想着补上Java爬虫二了&#xff0c;今天就粗略水一期&#xff0c;给大家介绍一个比较完善的Java爬虫——WebMagic,而且它的文档写的也很详细&#xff0c;上手非常容易。 ——野狗菌【希望…

java爬虫框架—WebMagic

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

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…