两种数据提取框架的比较(scrapy和webmagic)

news2024/11/15 16:00:47

背景: 最近北京疫情有点严重,状态是居家办公,又是买菜做饭又是核酸检测心情是无比的烦躁还总是会议,无需发言的会议就边听边写写csdn记录一下。这几天在用Java写一个数据抓取的程序,用于数据分析等等。第一是因为原项目使用了Java开发,为有利于集成,所以也使用了Java而没有使用Python。第二是我们的需求是运行一个Java程序然后去调用爬虫,最后返回提取的数据,不需要进行存储,没有找到Scrapy直接返回数据给到Java程序的解决方案,并且不想复杂化,所以选择了一款github里较高star数的webmagic项目。

再重申一下我们的需求和困难点:把爬虫抽象为一个普通的方法,入参是目标网站的URL,返回内容就是提取的数据即可,无需存储。而Java程序可以通过curl http请求发送到Scrapyd是可以远程启动爬虫进行爬取数据,缺点就是无法直接返回数据给到Java程序,貌似没有好的解决方案。

1. 架构方面

webmagic(https://github.com/code4craft/webmagic)  这是一个基于Java语言的数据抓取的框架,star数为10k,整体架构和Python Scrapy差不多,但是这个项目后面更新的频率不高,可能是作者没有时间精力有限。于是在github上搜索到了webmagic,一个。

 Scrapy( https://docs.scrapy.org/en/latest/)  这是基于Python的数据抓取框架,star数为45k,是一个非常棒的框架,扩展性较好,更新的频率也较高。

左侧是webmagic架构图,右侧是Scrapy架构图,webmagic参考了Scrapy,由Scrapy到webmagic进行切换,学习成本也较小。如果两个框架都不熟悉,一起学两个也不吃力。

2. 在生态方面,在Java生态中好像没有紧密配合webmagic的工具或中间件,这个webmagic框架只是抓取的框架,围绕着webmagic还有很多问题需要解决,例如分布式部署,远程控制启停等等,而scrapy的生态非常好,周围有很多适配的软件、中间件、插件等等,例如Scrapyd,Scrapyd-Client。

3. 在动态渲染页面的抓取方面:

以前都是通过测试工具+驱动+浏览器来实现,例如Selenium+ChromeDriver+Chrome浏览器,也有的工具是直接 Pyppeteer+Chromium实现,也有的工具Playwright会自动安装所需的驱动和浏览器。

     webmagic对接Selenium,通过webmagic-selenium进行对接

    Scrapy对接Selenium/Pyppeteer/Playwright都是通过Downloader Middleware进行对接,都有相应的解决方案,而对接Splash需要安装scrapy-splash的包进行对接。整体Scrapy对接各种下载器都能兼容。

对于动态渲染页面,无非是看前端代码分析Ajax请求然后直接抓取后端API方式,再或是模拟浏览器执行抓取前端界面来获取数据。

4. 扩展性方面:略,两者都能进行扩展,也能手动改代码并重新编译以扩展功能或增强功能。

5. 在编写代码方面,webmagic是通过实现PageProcessor接口中的process方法来对页面进行处理,Scrapy是通过在spiders文件夹中继承scrapy.Spider类,实现parse方法来对页面进行处理。

这里举一个文章列表+文章详情的例子来说明差异,我们的诉求是 抓取所有的文章,然后进行存储分析等操作

假设现在有两类页面,第一类页面是文章列表页面,分为第一页第二页....第n页等第二类页面是具体某偏文章的页面,这个页面包括 标题、时间、作者、内容等等信息。

webmagic是以访问链接进行区分两类的页面,什么意思呢?

我们有这两类页面,需要告诉框架如何处理这两类页面,也就是不同的处理逻辑,那么框架是如何区分这两类不同的页面呢?

回答: webmagic是基于URL进行正则匹配并在同一个Process方法中使用if/else或switch分支进行区分并进行处理,如下图所示:

 如上图所示,通过在类中定义URL_LIST和URL_POST正则表达式,来对每个page进行正则匹配,匹配到列表则进行列表的逻辑处理,匹配到文章则进行文章的逻辑处理。可详细查看:https://github.com/code4craft/webmagic/blob/master/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/SinaBlogProcessor.java

但这个例子是个老例子,而新的方法是使用 SubPageProcessor  (http://webmagic.io/apidocs/index.html?help-doc.html),实现SubPageProcessor接口中的processPage方法来实现的。

而Scrapy则不一样,Scrapy是基于回调进行的,如下图所示:

如上图所示: Scrapy是通过给不同的页面设定不同的回调函数进行区分处理逻辑, 用page方法实现文章列表的处理,并从文章列表页面抽取文章的链接放入到请求队列中,对文章详情来说新增一个parse_page方法来处理文章详情等内容,然后存储到item给到pipeline进行后续的存储和分析。

如果是三级页面或者更多级页面,例如  论坛板块+某类文章列表+文章详情,这种三级页面进行抓取,webmagic需要再定义一个板块的URL进行正则匹配并编写处理逻辑,而Scrapy则需要多定义一个方法进行逻辑处理。

webmagic通过page的URL来区分不同的层级的处理逻辑或实现SubPageProcessor接口中的processPage方法来区分不同的层级的处理逻辑,Scrapy是通过设定不同的回调方法来区分不同的层级处理逻辑。

总结:

整体上看两个框架的差别在于所用语言不一致,页面处理逻辑的代码书写方式不同,各自的生态环境也不同,如果要进行技术选型,还是需要根据自身的需求及架构进行评估。如果你不介意整体的复杂性,还是推荐 其他语言+ 中间件 + scrapy + scrapyd的方式来进行,例如 Java语言 + MySQL/MongoDB + scrapy + scrapyd,java语言发送一个http请求到scrapyd,然后爬虫开始工作,将数据写到存储中间件中,然后Java程序去存储中间件中去取回数据进行下一步的分析工作。

参考文献:

1. webmagic :GitHub - code4craft/webmagic: A scalable web crawler framework for Java.

2. Scrapy : GitHub - scrapy/scrapy: Scrapy, a fast high-level web crawling & scraping framework for Python.

3. webmagic: Introduction · WebMagic Documents

4. Scrapy Documentation: Scrapy 2.7 documentation — Scrapy 2.7.1 documentation

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

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

相关文章

十二、虚拟 DOM 和 render() 函数(2)

本章概要 用普通 JavaScript 代替模板功能 v-if 和 v-forv-modelv-on事件和按键修饰符插槽 JSX实例:帖子列表 12.3 用普通 JavaScript 代替模板功能 原先在模板中可以使用的一些功能在 render() 函数中没有再提供,需要自己编写 JavaScript 代码来实现…

docker-Cgroups的资源限制

一、Cgroup的介绍 cgroups,是一个非常强大的linux内核工具,他不仅可以限制被namespace 隔离起来的资源,还可以 为资源设置权重、计算使用量、操控进程启停等等。所以cgroups (Control groups) 实现了对资源的配额和度量。 cpu时间片的概念 …

atoi函数的介绍和模拟实现

今天我来介绍atoi函数和模拟实现atoi函数。 目录atoi和与其功能相似的函数的介绍atoi函数的模拟实现atoi和与其功能相似的函数的介绍 atoi函数是一个将字符串转换为整数值的函数。 由msdn查询可以得知,atoi函数的返回类型是int类型,参数类型是const ch…

用于不同功率的模块式TEC半导体致冷器超高精度温度控制装置

摘要:针对目前TEC半导体制冷器温控装置对高精度、模块化、可编程和远程控制等方面的技术需求,本文提出了一种高性价比的解决方案。解决方案的具体内容是采用模块式结构,以24位AD和16位DA超高精度PID控制器作为基础单元,采用分立模…

不调参,免训练,VisionBank AI OCR新功能升级上线!

应用背景 OCR字符识别,是指对部件或产品上刻印的字符进行确认、辨别、判定的检测识别。此项技术目前已广泛应用于工业自动化生产的产品质量管理环节当中,企业通过为机器视觉检测设备安装OCR系统,快速完成对产品生产日期、保质期、生产批号、…

红色荧光TAMRA alkyne 5-isomer,945928-17-6,5四甲基罗丹明-炔基

TAMRA alkyne,5-isomer反应原理: 红色荧光四甲基罗丹明炔烃可通过铜催化的点击反应与叠氮化合物反应。点击化学的代表反应为铜催化的叠氮-炔基Husigen环加成反应(Copper-Catalyzed Azide–Alkyne Cycloaddition)。点击化学的概念对化学合成领…

线性二分类——机器学习

目录 一、算法思想 二、算法原理 三、算法分析 四、源程序代码 五、运行结果及分析 六、总结 一、算法思想 (1)二分类:表示分类任务有两个类别,比如我们想识别图片中是不是狗,也就是说,训练一个分类器,…

如何使用云服务器搭配宝塔面板搭建Z-blog个人博客系统

之前写过使用过WordPress和Typecho搭建个人博客网站的方法,这篇文章将使用Z-blog搭建个人博客系统,Z-blog相当于WordPress而言,更加小巧,但是依然有着强大的功能,以及丰富的主题和插件,因此也值得很多用户选…

数字图像处理均衡化、规定化例题及解题思路

目录 均衡化 规定化 均衡化 前置知识: rk:表示灰度级 nk:表示第k个灰度级出现的个数 sk:表示用变换函数公式计算映射后的灰度级sk 变换函数公式: 例题: 1.列表写出图像直方图均衡化的过程 2.画出均衡化以后的图像 3.画出原始图像直方图…

如何给PDF解密?建议收藏这些方法

我们在传输接收文件的时候,经常都是以PDF格式进行的,因为PDF格式具有很强的稳定性。那小伙伴们平时接收的时候,会不会发现有些PDF文件为了保密性会进行加密,如果我们经常需要使用它,就需要不断地输入密码,这…

Navicat使用教程

文章目录1.连接数据库1.1 启动MySQL1.2 Navicat连接数据库1.3 操作数据库1.4 导入EXcel表内容1.5 新建查询1.连接数据库 1.1 启动MySQL 使用管理员身份打开命令提示符 net start mysql 启动服务 net stop mysql 关闭服务 1.2 Navicat连接数据库 第一步:连接数据库之前一定要…

基于ZigBee设计的物联网LED控制系统

1. 前言 随着LED照明越来越普及以及移动互联网技术的快速发展,人们对家居生活的网络化、智能化、节能化的需求越来越强烈,将家用电器、照明灯具等模块通过无线网络集成到控制平台,实现智能控制和智能管理,目前智能LED照明已成为IOT中重要的一部分。 本文为了绿色智慧照明…

构建企业级DNS系统(十)搭建Docker容器bind

把bind运行在docker中 伴随着应用微服务化,大量应用跑在了容器之中,为了让容器的管理更可靠、可控并为上层应用提供更好的体验,更快的发布,更灵活的调度,容器云应运而生。 当各种上层应用跑在了容器之中,大…

Linux怎么设置中文语言? centos中文乱码的解决办法

怎么设置Linux系统中文语言?是很多小伙伴在开始使用Linux的时候,都会遇到一个问题,就是终端输入命令回显的时候中文显示乱码。出现这个情况一般是由于没有安装中文语言包,或者设置的默认语言有问题导致的。今天我们就以centos为例…

千亿贴息助科研,维视智造院校实验室建设攻略来了(四)!

01千亿政策贴息助力院校设备升级 近期,关于高校教育信息化的利好政策密集出台。9月7日,国务院常务会议提出对高校、职业院校和实训基地等10大领域设备购置和更新改造新增贷款,实施阶段性鼓励政策,中央财政贴息2.5个百分点&#xf…

【跟学C++】C++STL标准模板库——算法详细整理(下)(Study18)

文章目录1、简介2、STL算法分类及常用函数2.2、变序算法(二)2.2.1 替换算法(2个)2.2.2 排序算法(6个)2.2.3 分区算法(4个)2.2.4 可用于排序容器的算法(3个)3、总结 【说明】 大家好,本专栏主要是跟学C内容,自己学习了这位博主【 …

SAP PS 第八节 PS 常见问题处理-来源于SAP EPPM分享

SAP PS 常见问题处理1 配置类1.1 结果分析的几类方法1.1.1 关于CO表中价值类别和值类型区别1.1.2 关于结果分析取那个计划成本的问题1.1.3 实际成本大于计划成本的报错1.1.4 结果分析一些典型配置(闲人提供)1.1.5 结果分析1.2 计划成本1.3 结算时&#x…

回炉重造,温故知新__css常规布局方法梳理__开发实战后的经验之谈

目录 1 基础css布局 1.1 position定位 1.2 float定位 2 开发中常用的布局 2.1 flex布局 2.2 antd栅格布局 2.3 grid网格布局 3 flex布局详解 3.1 flex布局是什么 3.2 教程文档小结 3.3 flex布局应用 4 参考资料 👋🏻 写在前面: 在…

【OpenEVSE 】汽车充电桩控制项目解析

【OpenEVSE 】汽车充电桩控制项目解析1. 项目介绍2. 项目硬件3. 软件原理以及流程4. 系统结构:ESP32RAPI APIMQTT 上的 RAPI:5. SAE J1772协议简析:6. 专用充电接插件7 . 源码解析:此项目来源于openEnergyMonitor 的 openEVSE 部分&#xff0…

A. Tokitsukaze and Strange Inequality(前缀和+桶)

Problem - 1677A - Codeforces 时津风有一个长度为n的排列组合p。回顾一下,长度为n的排列组合p是由n个不同的整数组成的序列p1,p2,...,pn,每个整数从1到n(1≤pi≤n)。 她想知道在这个排列组合中,有多少个不同的指数图…