这几天做一个小项目,分给我的模块是对于BOKECC体系网站的抓取。
从来没有用过python,这次来尝一下鲜,感觉还行~
BOKECC就是一个视频网站的解决方案,我的任务很简单,就是给定一个网址,我来抓取对应页面上的数据内容。
整个系统采用分布式架构,我来负责做爬虫节点。
简单来说就是整个系统可分布式部署,每个节点接收来自控制者的远程调用,独立完成任务,并向上级汇报完成情况。
这里采用暴露WebService的方式来提供接口。
功能需求点
| 概述
| 输入
| 提供webservice接口供主控调用,异步启动爬虫任务。
| 输出
| 1. 在正常接收、启动任务后立即给主控返回接收成功。
2. 在完成任务/任务失败后调用主控提供的回调接口。
3. 抓取成功后,将抓取数据保存至数据库。
| 错误处理
| 抓取异常情况下,应该将错误原因汇报给主控,并记录日志。
| 并发性需求
| 模块支持多线程并发调用。
|
|
|
BOKECC体系网站有非常多个,通过进行实际情况调研,发现各个页面在数据上有所不同(但大同小异),为了省事,我决定只用一套代码来爬取所有对应站点。那就要求我们的代码具有通用性。
另外,客户端要实现0配置,爬取的结果写入数据库。(数据库配置参与也应该由控制者——WEB接口调用者来决定)。所以我们在节点上维护一个数据库连接池。
大致流程如下:
在实际编码过程中也没有严格遵守此流程,进行了相应的扩展,不过大体如上。
日志记录设计:
日志条目
| 级别
| 记录信息
| WebService接口被调用
| Info
| 调用方IP及各接口参数
| 主控身份校验失败
| Warn
| 调用方IP
| 开始建立/更新数据库连接池
| Info
| 数据库参数
| 数据库连接失败
| Error,Notify
| 失败原因
| 数据库连接成功
| Info
|
| 开始启动爬虫任务
| Debug
|
| 开始抓取网页
| Info
| URL
| 一次网页抓取超时
| Warn
| 当前重试次数
| 一次网页抓取异常
| Warn
| 异常原因
| 重试范围内网页抓取失败
| Error,Notify
|
| 网页抓取成功
| Debug
|
| 开始内容匹配
| Info
|
| 正则表达式匹配失败
| Error,Notify
| 失败字段、失败原因
| 正则表达式匹配成功
| Debug
|
| 开始更新数据库
| Info
|
| SQL操作
| Debug
| SQL语句
| 更新数据库完成
| Debug
|
| 写数据库异常
| Error,Notify
| 当前执行的SQL语句,异常原因
| 任务成功
| Info
|
|
技术选型:
开发平台: windowsXP
部署平台: 跨平台
编程语言:python2.5
IDE+plug-in:MyEclipse 7.0 + pydev
具体使用的python技术:
功能
| 技术选型
| 网页抓取
| urllib2
| 内容解析,正则表达
| re
| WebService
| ZSI2.0
| SOAP协议
| SOAPpy(ZSI依赖)
| XML
| pyXML(ZSI依赖)
| Web服务器
| ZSI自带SOAP SERVER 或Apache
| 发布、部署
| Windows平台:py2exe
| 下面一节将进入正式编码阶段。 |