介绍下项目,因为个人比较喜欢小说.所以就做了一个小说项目.项目以微信公众号为展示,数据来源均是爬自网络.本篇微博会介绍项目前期的准备,项目的制作以及BUG.还有就是最后的安装部署.
前期的准备
项目是部署在阿里云ECS云服务器(系统为CentOS7.4 64位)上的,并且在阿里云上购买了一个域名.
以下是准备安装的软件:
一、远程工具
阿里自带一个窗口打开远程连接,当然是不能复制,上传等拉(可能我还没发现).所以你得先准备一个CRT远程软件,配置传送门(https://blog.csdn.net/u014520797/article/details/53339568).
注意:①如果启用密匙对需要下载密匙对并且添加到连接的properties里面.可以在阿里云里面取消,取消后原有连接提示要密匙对,删除后重新建立就好了
②主机名不是linux的ifconfig---IP.而是管理平台里面显示的IP,如下:
③用CRT连接ECS时,一定一定要开启定时发送协议,不然连接的时候,不用5分钟,就给你断了。我反正是被搞过的
二、python3.5.0
阿里云里面python是有的,不过是2.7.5版本(注:不要删除,记得系统有依赖于python2.7)所以有必要安装3以上的.我的是Centos操作系统,python安装传送门(https://www.linuxidc.com/Linux/2015-11/124908.htm).安装结果如下:
三、mysql
阿里云没有mysql:
①安装mysql传送门(https://www.cnblogs.com/softidea/p/7435045.html)
PS:温馨提示.按照传送门安装的mysql已经不需要设置开机启动了
②进入mysql赋予远程登录权限,并且刷新权限
grant all privileges on *.* to 'root' @'%' identified by '123456';
flush privileges;
③退出Mysql开放linux的3306端口
Ⅰ----这里和虚拟机不一样的是虚拟机跑以下代码:
Ⅱ----阿里云需要去配置(https://jingyan.baidu.com/album/03b2f78c31bdea5ea237ae88.html?picindex=1)
四、Redis
五、Nginx
七、Django
八、Docker
这里说一下:如果不是专业的运维人员,肯定想的是把程序包COPY到服务器上,然后python manage.py runserver。然后通过均衡负载分发到你的127.0.0.1:8000上拉。但是,如果你改了一个小BUG(前提是不在服务器上动作)。然后你就会重复一个动作:关闭django服务,删除project包,找到开发环境的包,上传,运行------有改动就重复。 如果,你只改动了urls文件,更新后,docker只会更新你改动的那个文件,就只需要停服务,更新git,更新docker服务,开启服务。(如果你体验了重复的上传代码后,你会爱上docker应用的)
这里简单介绍下Docker。无论用户的应用是一段程序、一个系统还是其他的什么,都可以放到Docker上运行,它的包容性十分强。同时,最重要的一点是,Docker提供了一组应用打包、传输和部署的方法,以便用户能够更好地在容器内运行任何应用。
所以安装Docker带来以下好处:
①开发者可能在一条或者几条命令内搭建完环境(创建进程的容器,不必重新启动操作系统,几秒内能关闭,你可以在数据中心创建或销毁资源,不用担心额外消耗)
②运维者开发环境打包成一个Dockerimage交给运维团队直接运行
安装传送门(https://help.aliyun.com/document_detail/51853.html)
中期:数据的爬取。
项目肯定是要有数据,所以寻思了爬取目标网站数据。
这里就得介绍下我的开发环境了:Python3.5、Pycharm、Scrapy1.5.0、MySQL5.7、Redis3.0.0、Window7
源代码地址:https://github.com/DavisLee1990/coco_spider/tree/master/coco_spider
程序介绍:
这是一个普通的分布式队列爬虫.主要运用技术:
1,采用非关系型数据库(redis)服务于分布式技术
2,运用了多进程异步技术(scrapy内部不允许除__main__以外的线程执行,所以不能启用多线程),因为本 项目至少有1亿次请求(运行进程的个数利用进程池控制)
3,章节爬取的顺序采用了redis队列控制.
4,因为涉及的数据量比较大(800G),所以把数据库建立在内网上有一个T硬盘的电脑上面,并且利用小说有不 同的类型进行分表.
注意事项:
1,如果进程开启太多(我默认开启了10个进程,请在settings设置)/网络资源被其他设备占用过多,会报 错:
HTTPSConnectionPool(host='m.xs.la', port=443): Max retries exceeded with url
2,也许以后会更新分布式自动爬虫,因为章节是不断的更新的.
程序运行:
首先你需要修改/coco_spider/coco_spider/settings.py里面的数据库连接信息以及最大进程数
然后你需要运行/coco_spider/coco_spider/orm_model_class.py来创建表结构
然后运行/coco_spider/coco_spider/main_controller/main的novel_main.py和chapter_main.py会分 别开启小说爬虫和章节爬虫
记录下项目的构思:
首先你得去小说的分类页,弱弱的看了下。我艹,27000+页,一页10本小说。27W本,一本小说400章不过分 吧。当你还没从裤裆中掏出计算器的时候,我告诉你:1亿+次章节。所以小说的27次(本)请求都是零头不计了。
所以,如果你跑项目,爬1000页并且入库,我能说我跑了2天2夜吗。
说回正题:章节总有第一,第二........的顺序吧。但是注意了,用scrapy发起的请求是异步的哦,如果第五章是 二合一(9000字)的呢,它就要比第六章快0.0000001s返回给scrapy,你就先看到第六章了,当你一脸懵逼的时候。隔壁老李笑笑说,’当我for章节目录的时候,meta里面带个i呢,我for循环的顺序肯定不会乱。得到数据大不了我排序嘛。’正说着,他掏出来了operator,满脸晚上你懂的笑容递给你。 你试了试,’嘿,我竟然还可以根据列表对象的某个索引排序。’ 这时隔壁老王淡淡的笑着看你孩子说到:‘那岂不是你还要根据小说的url/id分类吗,什么时候分,你又不知道这本小说是500章还是600章。那样,你们今晚一起玩不成了’ 老李一下子就慌了,好不容易等你下了个早班,忙问老王‘王哥你有什么办法?’ 老王本来一脸淡然,当往你家一望。便答到:‘你结账的时候排队吗?做成队列谁先谁后不就有了。’ 你一阵激动,这办法怎么没想到。正要拉着老李去他家开工,老王忙叫住你,‘你想好怎么提升爬取的效率吗?’你紧了紧老李的手,‘我开启两个程序。一个爬小说数据,并把url作为key,往里面push对象的redis缓存,当然对象里面包含章节地址的拉;一个开始检测redis,如果有就开启一个线程pop对象,并且访问,对了,得用Request方法。不能用scrapy.request,不然又异步了’ 老王摇摇头,‘本来想让你们采坑的,但是想要你们玩得高兴,我也玩得高兴。我直接告诉你吧。一个scrapy程序的spider只能跑在主线程里面。所以,你记得用进程,并且把启动命令做成一个方法。’
就这样,第二天你神清气爽的在楼下吃油条,看到同样神清气爽的老王,表示感觉并请他吃早饭。
公众号展示:
如果要说到详细的,可能要更新很久,我就慢慢写吧(预划的某些功能都还没有完成)
源代码地址:https://github.com/DavisLee1990/cocomini
首先,这个展示用的是django展示到公众号上。so,你得准备一个公众号。
持续更新中.....