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)所有抓取线程都从该缓冲池中获取需要抓取的数据;

原创粉丝点击