Python爬虫清洗模块开发纪录

体会

  • 代码结构
    将所有全局变量封装,让依赖共同变量的模块解耦。
  • 资源
    定期删除下载的文件,文件保留时间可配置
  • 流控
    收发任务流控限制,判断队列大小,当发送后响应里面有SUCCESS才不重新塞回任务队列,当任务队列超过限制,不再取任务,等待;
    批量获取任务和批量递交任务给爬虫,取任务url带“&num=5”,递交给爬虫是一个list,环节中的失败包括打包失败、发送任务失败,一起处理塞回队列
  • 异常判断
    细化各个环节的判断,如fetch时需要判断取回的数据是否有None,有“List”,有效任务类型,有效任务内容;处理爬虫回调内容格式是否正常,不正常回400,正常再判断是否有task_id,有result,有url;任务处理环节下载文件可能抛异常,检查文件大小(太小丢回任务队列),解析,连Hbase(失败会重试),写Hbase,通知调度

核心模块

  • [SETTING]
    可配置项写入Setting, 可从ETCD更改配置,如url地址,最大失败尝试次数,线程进程等待时间、检查时间,更新配置时间,Redis地址
  • [CONST]
    常量
  • [STAT]
    封装统计类,调用start方法开始统计线程,用队列和Redis实现统计。
  • [SCHEDULER]
    增加结果通知scheduler功能,包括成功和失败。
  • [HBASE]
    数据写入Hbase,考虑hbase重连,尝试次数有上限。
    增加Hbase记录失败任务,对于所有写入的数据增加一个爬虫标记,crawl_label, 爬取成功为1,失败为0,使所有任务都写入Hbase。
  • [REDIS]
    增加任务放入任务队列同时写入Redis功能,实现对任务的跟踪管理。Key是taskid,value包括fail_times(0),email,task_status(pending。Fail_times达到上限,任务不再放入任务队列。若任务成功,状态标记为finished。
    Redis任务队列、结果队列定义为全局变量,因为需要定时刷新配置重连Redis,不适合作为类属性传入Task Fetcher和Task Sender。
    增加统计功能,统计总任务数,成功任务数,爬虫失败,Hbase失败,存在,不存在。可清零统计,导出丢失任务,在redis中一直标记为pending的任务。
    减少Redis连接次数,封装Redis连接,Redis队列,Redis任务管理3个类。