当前位置: 首页 > news >正文

爬虫解析代码结构

在设计中加入一个顶层接口是有益的,特别是当您希望实现统一的接口来处理所有类型的排行榜数据时。这样做可以提供更好的灵活性和扩展性,同时保持代码的整洁和易于维护。

设计概述

  1. 接口: 定义一个 RankingDataCollector 接口,它定义了所有数据收集器应该遵循的方法签名。
  2. 抽象基类: 定义一个抽象基类 RankingPageParser,它包含所有解析器共有的方法和属性。
  3. 具体解析器: 每个数据来源都有一个对应的子类,如 ToutiaoRankingParserWeiboRankingParser 等。
  4. 工厂模式: 使用工厂模式来根据数据来源创建相应的解析器实例。
classDiagramclass RankingDataCollector{+List<String> collectData(String url)}class RankingPageParser{+String url+Document parsePage()abstract +List<String> extractTitles()}class ToutiaoRankingParser{+RankingPageParser(url: String)+List<String> extractTitles()}class WeiboRankingParser{+RankingPageParser(url: String)+List<String> extractTitles()}class RankingParserFactory{+static RankingPageParser createParser(String platform, String url)}RankingPageParser <|-- ToutiaoRankingParserRankingPageParser <|-- WeiboRankingParserRankingDataCollector <|-- ToutiaoRankingParserRankingDataCollector <|-- WeiboRankingParser

Java 实现示例

1. 接口 RankingDataCollector
public interface RankingDataCollector {List<String> collectData(String url);
}
2. 抽象基类 RankingPageParser
public abstract class RankingPageParser implements RankingDataCollector {protected String url;public RankingPageParser(String url) {this.url = url;}public Document parsePage() throws IOException {return Jsoup.connect(url).get();}public abstract List<String> extractTitles();@Overridepublic List<String> collectData(String url) {this.url = url;return extractTitles();}
}
3. 具体解析器
public class ToutiaoRankingParser extends RankingPageParser {public ToutiaoRankingParser(String url) {super(url);}@Overridepublic List<String> extractTitles() {List<String> titles = new ArrayList<>();try {Document doc = parsePage();Elements titleWraps = doc.select(".list-container .title-wrap");for (Element titleWrap : titleWraps) {String titleText = titleWrap.text();titles.add(titleText);}} catch (IOException e) {e.printStackTrace();}return titles;}
}public class WeiboRankingParser extends RankingPageParser {public WeiboRankingParser(String url) {super(url);}@Overridepublic List<String> extractTitles() {List<String> titles = new ArrayList<>();try {Document doc = parsePage();Elements titleElements = doc.select(".weibo-rank .rank-item .title");for (Element titleElement : titleElements) {String titleText = titleElement.text();titles.add(titleText);}} catch (IOException e) {e.printStackTrace();}return titles;}
}
4. 工厂模式
public class RankingParserFactory {public static RankingPageParser createParser(String platform, String url) {switch (platform) {case "toutiao":return new ToutiaoRankingParser(url);case "weibo":return new WeiboRankingParser(url);default:throw new IllegalArgumentException("Unsupported platform: " + platform);}}
}
5. 使用示例
public class Main {public static void main(String[] args) {String url = "https://example.com/toutiao-ranking";RankingDataCollector collector = RankingParserFactory.createParser("toutiao", url);List<String> titles = collector.collectData(url);System.out.println("Collected Titles: " + titles);}
}

通过这样的设计,您可以轻松地添加新的数据来源或更改现有数据源的解析逻辑,只需实现 RankingPageParser 抽象类或扩展 RankingDataCollector 接口即可。这种设计模式使得代码更加模块化和易于维护。

相关文章:

爬虫解析代码结构

在设计中加入一个顶层接口是有益的&#xff0c;特别是当您希望实现统一的接口来处理所有类型的排行榜数据时。这样做可以提供更好的灵活性和扩展性&#xff0c;同时保持代码的整洁和易于维护。 设计概述 接口: 定义一个 RankingDataCollector 接口&#xff0c;它定义了所有数…...

day 23 进程间通信—管道

注意事项&#xff1a; 1、如果管道中至少有一个写端&#xff1a; 如果管道中有数据,直接读出 如果管道中没有数据&#xff0c;会阻塞等待直到有数据写入后读出 2、如果管道中没有写端&#xff1a; 如果管道中有数据&#xff0c;直接…...

Python酷库之旅-第三方库Pandas(073)

目录 一、用法精讲 296、pandas.Series.dt.as_unit方法 296-1、语法 296-2、参数 296-3、功能 296-4、返回值 296-5、说明 296-6、用法 296-6-1、数据准备 296-6-2、代码示例 296-6-3、结果输出 297、pandas.Series.dt.days属性 297-1、语法 297-2、参数 297-3、…...

使用easyexcel导出,发生了Exception: could not find acceptable repesentation

报错信息&#xff1a; 原因以及解决方案&#xff1a; 原因是我的代码使用Resp响应返回实体&#xff0c;其实使用EasyExcel导出已经设置了响应编码&#xff0c;导致重复了。 当你通过 HttpServletResponse 的输出流写入文件时&#xff0c;你已经直接控制了响应体。如果此时还尝…...

android display 笔记(五)HWC(Hardware Composer)

HWC 简单来说HWC是用来合成图形和显示图形的&#xff0c;可以把多个图形缓存传给硬件混合渲染器&#xff0c;让硬件混合渲染器执行合成操作&#xff0c;显示图形就是直接将图形缓存显示到屏幕。 android 14 /hardware/interfaces/graphics/composer/2.1/IComposer.hal 19 im…...

【模电笔记】——集成运算放大电路

tips&#xff1a;本章节的笔记已经打包到word文档里啦&#xff0c;建议大家下载文章顶部资源&#xff08;有时看不到是在审核中&#xff0c;等等就能下载了。手机端下载后里面的插图可能会乱&#xff0c;建议电脑下载&#xff0c;兼容性更好且易于观看&#xff09;&#xff0c;…...

Android Studio Gradle多渠道打包

原理使用Android Studio打一次渠道包&#xff0c;用反编译工具反编译后&#xff0c;修改渠道信息重新编译 准备文件 分渠道配置文件&#xff1a;channel.txt ↓ # 多渠道配置里“统计平台”、“市场名称”、“渠道编号”分别代表什么意思&#xff1f; # 统计平台&#xff1a;…...

什么是DNS缓存?DNS缓存有哪些作用和危害?

在互联网世界的运转机制中&#xff0c;DNS&#xff08;域名系统&#xff09;是其中的关键&#xff0c;而DNS缓存则是这一系统的重要环节。它既能加快网站的访问速度&#xff0c;同时也会对网络安全造成影响&#xff0c;因此了解DNS缓存对于网站的日常管理至关重要。 什么是DNS…...

web基础与http协议与配置

目录 一、web基础 1.1 DNS与域名&#xff08;详解看前面章节&#xff09; 1.2 网页的概念&#xff08;HTTP/HTTPS&#xff09; 1.2.1 基本概念 1.2.2 HTML文档结构(了解) 1.2.3 web相关重点 1.2.4 静态资源和动态资源 二、http协议 2.1 概述 2.2 cookie和session&…...

机械学习—零基础学习日志(python编程2)

零基础为了学人工智能&#xff0c;正在艰苦的学习 这里把&#xff0c;函数以及类相关的知识做一个笔记&#xff0c;放在这里。 期待与大家交流~ 变量作用域 Python 中&#xff0c;程序的变量并不是在哪个位置都可以访问的&#xff0c;访问权限决定于这个变量是在哪里赋值的…...

element-plus的表单输入框有清除按钮的,文字输入前后宽度不一致怎么解决

输入内容之后多了一个可清除的图标&#xff0c;输入框的宽度也被撑开了 根据输入前后的dom对比发现&#xff0c;多了一个图标的span标签 :deep(.el-input__wrapper) {position: relative;.el-input__inner {padding-right: 18px;}.el-input__suffix {position: absolute;right:…...

解决Docker拉取镜像时 i/o timeout错误

目录 一&#xff0c;设置Docker镜像源&#xff08;推荐&#xff09; 1.1 解决方案1&#xff1a;配置加速地址 1.2 解决方案2&#xff1a;使用代理拉取镜像 1.3 解决方案3&#xff1a;备用办法&#xff1a;直接传送镜像 二&#xff0c;目前可用的镜像源 一&#xff0c;设置…...

面壁的智能开源 MiniCPM-V 2.6 边缘人工智能多模态功能与 GPT-4V 不相上下

"MiniCPM-V2.6 "是一个边缘多模态人工智能模型&#xff0c;仅拥有 80 亿个参数&#xff0c;却在单图像、多图像和视频理解任务中取得了低于 200 亿个参数的三项 SOTA&#xff08;艺术境界&#xff09;成绩&#xff0c;显著增强了边缘多模态能力&#xff0c;并与 GPT-…...

dhcp+checkkickstar的实验理解

文章目录 实验介绍使用的服务介绍PXE服务dhcp服务Kickstart 服务tftp服务 第一部分&#xff08;基础部分&#xff09;代码展示注意点第一点![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/13c0f4aabb664655a4dd285dd8e5527a.png)第二点 结果展示 第二部分&#xff08…...

Android网络安全:如何防止中间人攻击

文章目录 引言一、中间人攻击概述二、预防中间人攻击的方法2.1 使用HTTPS2.2 证书锁定&#xff08;Certificate Pinning&#xff09;2.3 使用SSL/TLS最佳实践2.4 验证主机名 三、总结 引言 中间人攻击&#xff08;Man-in-the-Middle&#xff0c;简称MITM&#xff09;是一种常见…...

NOI Linux 2.0 的安装说明以及使用指南

关于 NOI Linux 2.0 NOI Linux 是 NOI 竞赛委员会基于 Ubuntu 操作系统开发的一款 Linux 桌面发行版&#xff0c;是一套免费的、专门为信息学奥林匹克竞赛选手设计的操作系统&#xff0c;是 NOI 系列赛事指定操作系统&#xff0c;适用于常见笔记本电脑和桌面电脑。 新建虚拟机…...

07、MySQL-多表查询

目录 1、内连接 1.1 隐式内连接 1.2 显式内连接 2、外连接 2.1 左外连接 2.2 右外连接 3、自连接 4、联合查询 5、子查询 5.1 标量子查询 5.2 列子查询 5.3 行子查询 5.4 表子查询 1、内连接 概念&#xff1a;相当于查询A、B表交集的部分数据 1.1 隐式内连接 语法&…...

20240809 每日AI必读资讯

乒乓球AI机器人赢了人类&#xff01;正反手灵活转换&#xff0c;擦网球高球都能接 - 谷歌发布首个达到人类竞技水平的机器人Agent&#xff0c;挑战乒乓球赛场。 - 机器人通过学习大量乒乓球状态数据&#xff0c;掌握了正手上旋球、反手瞄准等技能&#xff0c;展现出高速运动…...

《投资的原理》阅读笔记一

这是我准备集中学习投资类书籍后阅读的第8本书&#xff0c;但是是第一本读到一半决定从新开始、每章都写笔记的第一本书。 《投资的原理》的作者陈嘉禾先生是一位资深的价值投资者&#xff0c;书中也是大力弘扬着价值投资&#xff0c;跟我倾向于量化投资方向的想法并不合拍&am…...

金九银十,全网最详细的软件测试面试题总结

前面看到了一些面试题&#xff0c;总感觉会用得到&#xff0c;但是看一遍又记不住&#xff0c;所以我把面试题都整合在一起&#xff0c;都是来自各路大佬的分享&#xff0c;为了方便以后自己需要的时候刷一刷&#xff0c;不用再到处找题&#xff0c;今天把自己整理的这些面试题…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码&#xff0c;而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库&#xff0c;可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画&#xff0c;可以包含在你的网页或应用项目中。 3.An…...