Python 边做边学 7 整体设计
来源:互联网 发布:毕业证制作软件下载 编辑:程序博客网 时间:2024/06/17 04:28
媳妇儿买了纹身贴,要帖在身上
我说:“看你爸不打断你腿~~”
心想:“跟你们杀马特没有共同语言~_~”
原文连接:http://blog.csdn.net/tomorrow13210073213/article/category/6931287
虽然计划不如变化大,但,计划还是要有的
项目开始之前还是先规划一下整体架构吧,虽然后期必定要改,至少改起来不那么痛苦;
项目结构
如上图,由于之前在写java的SpringMVC项目,数据库操作与业务逻辑分离的比较清楚,所以,这里借鉴了SpringMVC项目的包结构;
1. mapper:用于与数据库交互,实现增删改查等操作,仅service包可以调用mapper里的相关操作,其他包不直接调用mapper(业务上的要求,代码中没有强制限制);
2. service:实现简单业务,封装成块的业务操作,联通数据库与上层业务;
3. util:工具类包,提供基础的工具,http工具,数据库工具等;
4. app:最顶层业务,负责业务整合;
5. conf.ini:配置文件,这个肯定是少不了的,可以配置一些数据库连接,http连接,相对固定的参数等;
6. 其实app可以再拆出一个business包来,business包负责最具体的业务,app包只负责启动和调用;这里就不再拆分了;
多线程、分布式部署
既然是个爬虫,必然要实现多线程以及分布式部署,提高爬取效率;要实现上述部署方式,就得考虑并发的问题;
我们暂时先不考虑程序内部的并发,就多机器之间的并发,主要需要解决重复抓取的问题,即:我抓了某一个用户的数据,其他机器就不用再抓了,避免重复抓取浪费资源;
鉴于之前经验,多线程、机器机器同时操作数据库很难避免这个问题,所以这里采用另一种解决方式,即:写一个服务,专门提供待抓取数据,其他具体的抓取线程/机器都从这个服务里获取要抓取的用户;这样出口只有一个,就可以解决并发的问题;
为了提高效率,可以给服务设置一个缓冲池,即:服务保持一个一定大小的待抓取缓冲池,有人请求就从缓冲池里直接取一个并返回,同时定时刷新这个缓冲池,保证缓冲池中一直有数据,避免更新不及时造成的资源浪费;
同时,抓取程序也可以保持一个待抓取缓冲池,需要抓取的时候直接从缓冲池里取一个,一样,抓取程序也定时刷新这个缓冲池(从上面的服务请求一定数据量的待抓取数据),保持一直有数据需要抓取;
缓冲池大小可以是可配置的,甚至可以根据抓取速度自动调整,这里不再具体实现,待后期有需要再处理。
数据交互
上面,我们提到了提供待抓取数据的服务,与抓取数据程序,这时候就会存在数据交互;这里我们采用更高高效的交互方式:tcp通信;当然也可以写成其他交互方式(如RESTful风格的接口),这里不介绍了;
鉴于之前项目针对手机app开发服务的经验,服务方和调用方都准备组织成可配置的方式,即:一个server提供多个服务,服务之间以配置方式组织,不写死;对外公开的是一个调用编号;具体业务类实现统一的方法用于处理业务并返回数据;调用者调用服务只提供需要调用服务的编号和业务参数;再次不再赘述,后面详细说明;
代理服务器
前文说过,为了不暴露自己的IP(~_~),我们准备采用代理的方式访问目标网站;代理怎么来那?网上有人提供了很多免费的代理:
http://www.xicidaili.com/
本来我也想采用这种免费代理,但尝试了一下,速度比较慢,很多连不上,所以只能的放弃,改为自建代理的方式;代理的具体创建方式不再详述,用“CCProxy”,网上有大把下载、配置文章;
以上就是项目的整体设计,不足之处欢迎指正;下一篇将开始具体编码。
以上内容仅供练习,学习使用;
2017-08-18更新:
最终只有一台机器在运行,故,抛弃了tcp服务的方式,通过另一种策略解决多线程并发问题;
(1)在程序里建立一个待抓取缓冲池,缓冲池中始终保留一定量数据;
(2)建立单独线程,当缓冲数量小于设定值时刷新缓冲池;
(3)所有抓取线程都从该缓冲池中获取需要抓取的数据;
- Python 边做边学 7 整体设计
- Python 边做边学 9.1 数据库操作--整体设计
- Python爬虫(二):整体设计
- 网站整体设计技巧
- 网站整体设计 一
- 徽标设计整体知识
- yii blog 整体设计
- libev整体设计
- 设计模式整体总结
- libev整体设计
- 整体架构设计
- Mybatis整体框架设计
- 【Angular2】试卷整体设计
- Xen 的整体架构和整体设计
- 界面整体效果的设计
- Libev源码分析 -- 整体设计
- Libev源码分析 -- 整体设计
- 电话簿项目笔记-----------整体设计
- Android Studio 使用ShadowSocks代理gradle
- Web项目导入jar包 出现java.lang.NoClassDefFoundError错误
- 互联网推送服务原理:长连接+心跳机制(MQTT协议)
- STM32 CUBEMX的疑似BUG
- linux内存占用问题调查——cached
- Python 边做边学 7 整体设计
- Memcached 集群的高可用(HA)架构
- 11-散列2 Hashing (25分)
- 乐驾 -- 4
- java.lang.SecurityException: Can't make field constructor accessible
- 单设备登录与单点登录(SSO)
- 欢迎使用CSDN-markdown编辑器
- 【排序算法】冒泡排序原理及Java实现
- vue-router 快速入门