徒手实现定时爬取知乎,从中发掘有价值的信息,并可视化爬取的数据作网页展示。项目目前正在开发,欢迎前来交流学习!
- 日志 程序运行时统一初始化。由于logging应用了单例模式,之后可以直接使用配置好的logging
- 第三方库版本管理 Pipenv,功能强大,方便易用
- 代码版本控制 Git,使用.gitignore来忽略日志文件夹、vim临时文件、缓存文件文件夹
- 配置管理 Yaml,可读性好,语法简单
- 文件组织 将相同功能的文件放于同一文件夹下,*.py文件组织成包
- 性能分析 使用自己定义的装饰器函数来测量函数运行的时间
- 数据爬取 使用Selenium + Webdriver爬取动态网页,使用Requests库请求部分已有接口
- 数据解析 Xpath,速度快,使用简单
- 爬取标记 使用Redis存储已爬取的话题id及其下信息的摘要值,数据类型选取为hash
- 数据序列化方式选取 Json,通用序列化方案
- 摘要算法选取 MD5,选择原因见Hashing Algorithms In Python。此外经测试,base16速度仅次于MD5,base64次于base16,base32最慢;整体而言,直接加密'汉字'类型的字符串,比加密'\u6c49\u5b57'类型的字符串速度要快,因此json.dumps的时候ensure_ascii参数要设置为False
- 数据持久化 MongoDB,时间类型数据统一存储为格林尼治时间
- 定时任务 Flask-APScheduler,使用简单,轻量级方案,且支持多种数据库的持久化
- 任务管理 Supervisor方便易用
- 并发实现 Multiprocessing.dummy多线程,易于移植,方法简单
- 话题树建立及展示
- 网页展示 Flask框架 + Bootstrap-Flask
- 话题关注人数及问题数可视化 使用Pyecharts 1.0,已基本实现(散点图显示异常,待观察)
- 热门关键词爬取、处理及可视化 Worldcloud + Jieba
- 获取访问页面的用户IP,并分析其所在区域
- 统计访问每一个页面的用户数量
- 页面数据使用Redis做缓存,避免加载可视化数据时都要进行计算的问题