python项目-------cocomini小说

    介绍下项目,因为个人比较喜欢小说.所以就做了一个小说项目.项目以微信公众号为展示,数据来源均是爬自网络.本篇微博会介绍项目前期的准备,项目的制作以及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端口

                          Ⅰ----这里和虚拟机不一样的是虚拟机跑以下代码:

                               /sbin/iptables -I INPUT -p tcp --dport 3306 -j ACCEPT
                               /etc/rc.d/init.d/iptables save                   

               Ⅱ----阿里云需要去配置(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,你得准备一个公众号。


持续更新中.....

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值