当前位置: 首页 > 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 接口即可。这种设计模式使得代码更加模块化和易于维护。

http://www.lryc.cn/news/418954.html

相关文章:

  • day 23 进程间通信—管道
  • Python酷库之旅-第三方库Pandas(073)
  • 使用easyexcel导出,发生了Exception: could not find acceptable repesentation
  • android display 笔记(五)HWC(Hardware Composer)
  • 【模电笔记】——集成运算放大电路
  • Android Studio Gradle多渠道打包
  • 什么是DNS缓存?DNS缓存有哪些作用和危害?
  • web基础与http协议与配置
  • 机械学习—零基础学习日志(python编程2)
  • element-plus的表单输入框有清除按钮的,文字输入前后宽度不一致怎么解决
  • 解决Docker拉取镜像时 i/o timeout错误
  • 面壁的智能开源 MiniCPM-V 2.6 边缘人工智能多模态功能与 GPT-4V 不相上下
  • dhcp+checkkickstar的实验理解
  • Android网络安全:如何防止中间人攻击
  • NOI Linux 2.0 的安装说明以及使用指南
  • 07、MySQL-多表查询
  • 20240809 每日AI必读资讯
  • 《投资的原理》阅读笔记一
  • 金九银十,全网最详细的软件测试面试题总结
  • ActiveMQ任意文件写入漏洞(CVE-2016-3088)复现
  • 网络协议四 物理层,数据链路层
  • Python知识点:如何使用Twisted进行异步网络编程
  • 循环神经网络
  • SQL进阶技巧:有序数据合并问题之如何按照指定的规则对数据进行合并?【详解collect_list函数有序性保证】
  • windows和office微软官方免费激活教程
  • 【C++ 面试 - 基础题】每日 3 题(七)
  • Java面试题精选:消息队列(一)
  • 宝塔面板启用 QUIC 与 Brotli 的完整教程
  • Linux 进程调度(二)之进程的上下文切换
  • Oracle事物临时表