一.数据需求学院列表
每个学院的简介说明
每个学院下对应的专业列表
每个专业的简介
每个专业的初试复试范围
网站中所有超链接文本的链接地址
每个学院的代码
每个专业的代码
二.程序实现功能基于命令行的交互界面
树状组织的数据
字符串形式的数据存储
对于异常的处理
对结构化数据的查询
三.命令及参数说明
code [item] 查询item对应的代码
href [item] 查询item的超链接地址
into[item] 查询item的下一级内容
back 返回上一级内容
help 或 ? 显示帮助文档
exit 退出程序
四.数据结构说明基本元素类型:
str
codexStr
list元素关系:
list作为容器,包含str,codexStr,list
codexStr的link属性持有对codexStr,list的引用,content,href,code,link属性包含str对象
str被包含于list对象或codexStr的content,href,code,link属性codexStr 对象原型:class codexStr:
content = ""
code = ""
href = ""
__link = object()
def __init__(self, Content: str, Code: str = "", Href: str = "", Link: object = None):
self.content = Content
self.code = Code
self.href = Href
self.__link = Link
@property
def link(self):
if self.__link is None:
return self
else:
return self.__link
@link.setter
def link(self, Link: object):
if Link is None:
raise ValueError("Unacceptable link to None.")
else:
self.__link = Link
def __repr__(self):
return self.content
def __str__(self):
return self.content
def __len__(self):
return len(self.content)
def __eq__(self, rhs):
return rhs == self.content
# Structure preview for test
def metaStr(self) -> str:
s = self.code + " " + self.content + " " + self.href
return s
五.脚本可选参数列表url_root str 爬取页面的根目录
url_page str 爬取根页面名称
datPath str 数据保存路径
schNum int 爬取院系数目,为快速测试起见,推荐设置为3
六.小结与展望
本次作业,实现了对华东师范大学研究生招生网站的数据收录和结构化查询功能。交互界面采用命令行形式。经过测试,功能正常,预期需求实现良好。但作业完成后,经过反思回顾,发现了一些问题,解决这些问题,将有助于改善作品的性能。
1.下载缓慢,请求经常超时:尝试创建多个进程,并发访问,不同下载进程带上不同的代理(防止被认定为异常行为),进行抓取下载。
2.下载功能和解析功能相互耦合:为任务管理、内容下载、页面解析分别创建不同模块。
3.全局变量造成不同模块功能耦合:为模块之间的信息交换创建统一接口,标准信息体和标准信息管理器。
4.爬虫对于网站和网页的结构变化过于敏感:将内容获取和内容解析解耦。创建内容分类器对下载内容进行分类。对应不同类别创建不同的页面解析器。对页面解析器创建管理模块,进行标准化管理。
5.UI功能和业务逻辑耦合:将UI功能单独抽取出来做成模块。
6.codexStr类的设计不够简洁,通用性也不够好:继承str类,并在此基础上进行功能扩充
7.将高维数据拍扁成字符串保存,既不容易查询,也不容易理解:将数据存储于数据库中
从鲁棒性考虑,设想一种更容易维护的爬虫结构:
系统构成:任务实体、信息实体、解析器实体、异常实体、任务管理器、信息管理器、解析器管理器、代理池模块、下载引擎、解析引擎、下载内容结构体、UI模块、业务逻辑中间模块、数据库界面模块、配置文档管理器
UI模块、解析引擎创建,并向任务管理器提交任务
任务管理器管理任务队列,为每个任务创建不同进程,监视任务状态,协调资源冲突,处理任务执行中抛出的异常和产生的信息,由下载引擎和解析引擎具体负责任务执行
每个任务都包含信息收发队列,由任务管理器负责将信息发送至信息管理器或者从信息管理器取回信息,任务管理器可以在信息管理器注册侦听器
信息管理器管理信息队列和侦听器队列,负责侦听器的触发,和任务管理器交换信息
解析器管理器从解析器配置文档中加载解析器实体,管理解析器实体的不同版本
解析引擎根据被解析对象类型的不同向解析器管理器请求对应的解析器实体
分类器继承自解析器,是一种特殊解析器实体,保存于解析器配置文档
解析引擎根据解析结果创建下载任务,并向任务管理器提交下载任务,保存解析出的数据到数据库
代理池模块负责向下载引擎提供不同的代理服务器,监视代理服务器的连通性和有效性,及时将失效内容剔除(可能需要代理服务器提供商,或者服务器租赁)
下载引擎执行下载任务,创建和保存下载内容结构体,并将下载内容结构体提交给解析引擎,并将无效的代理服务器提交给代理池模块
UI模块根据用户需求,调用业务逻辑中间模块。业务逻辑中间模块通过数据库界面模块从数据库中查询所需数据
配置文档管理器负责保存和读取各个模块的配置状态