# -*- coding: utf-8 -*-
"""
Created on Thu Jan  7 02:44:53 2020

@author: honey

学习项目实战,爬取本博客文章访问排名
"""

from urllib import request
import re

class Spider():
    root_pattern = '<article class="post-list" role="article">([\s\S]?)</article>'
    bt = '.html">([\s\S]?)</a> </h2>'
    ydrs = '<i class="fa fa-eye"></i>([\s\S]*?)</span></div>'

    #获取采集的链接
    def __get_url(self,n):
        urllist = []
        for i in range(n):
            urllist.append('https://qinzc.me/page/%i' % (i+1))
        return urllist

    #网页源码获取
    def __fetch_content(self,url):
       r = request.urlopen(url)  #访问网页
       htmls = r.read()  #读取htmls数据
       htmls = str(htmls, encoding='UTF-8')  #UTF8格式
       return htmls

    #html页面解析
    def __analysis(self, htmls):
        """获取文章所有列表html源码"""
        root_html = re.findall(Spider.root_pattern, htmls)       
        anchors = []
        for html in root_html:
            name = re.findall(Spider.bt, html) #获得标题
            number = re.findall(Spider.ydrs, html)  #获得围观人数
            tmp = {'name':name, 'number':number}   #组成字典
            anchors.append(tmp)   #获取后加入到anchors列表变量

        return anchors

    #数据清洗
    def __refine(self, anchors):
        """数据精炼,去掉空格等无用字符串,再次组成一个字典"""
        l = lambda cs: {
            'name':cs['name'][0].strip(),
            'number':cs['number'][0].strip().replace(' ',''),
             } 
        return map(l, anchors)

    #以围观人数排序
    def __sort(self, zzsj):
        paixu = sorted(zzsj, key=self.__sort_seed, reverse=True)  #降序排列
        return paixu

    #排序的key值调用的函数
    def __sort_seed(self, anchor):
        r = re.findall('\d*', anchor['number'])  #匹配数字

        number = float(r[0])
        if '人' in anchor['number']:
            number *= 10000
        return number
        #return anchor['number']

    #数据显示
    def __show(self, anchors):
        # for anchor in anchors:
        #     print(anchor['number'] +  '  =======  ' + anchor['name'])
        for rank in range(0, len(anchors)):
            print('rank ' + str(rank + 1) + ': ' + anchors[rank]['name'] + '——' +anchors[rank]['number'])

    def go(self):
        """
        此处是注释
        """
        urll = self.__get_url(23)

        htmls  = []
        for n in urll:
            htmls.append(self.__fetch_content(n))  #网页源码获取
            print('已经获取 %i 个页面' % len(htmls))

        jiexi = []
        for n in htmls:         #html页面解析
            jiexi.append(self.__analysis(n))

        qingxi = []
        for n in jiexi:    #数据清洗
            qingxi.extend(list(self.__refine(n)))
            print('已经采集到 %i 条数据' % len(qingxi))

        paixv = self.__sort(qingxi)   #以围观人数排序
        print('排序完成')
        self.__show(paixv)

spider = Spider()   #实例化
spider.go()   #开始采集

输出结果:

已经采集到 222 条数据
排序完成
rank 1: C组-战地3联机教程-皓月------51367人围观
rank 2: kcptun加速SS实战-亲测100%加速成功------16152人围观
rank 3: 七个经典的聚会游戏惩罚措施------13011人围观
rank 4: VMware Vsphere ESXI 6.5 忘记Root密码清空,恢复实战!------3774人围观
rank 5: Linux一键BCDN挖矿安装脚本------3333人围观
rank 6: 90亿像素银河系全景图【24.6GB】【百度云盘】------2731人围观
rank 7: C组-战地登录器开发更新日志------2574人围观
rank 8: BF登录器v3.0 新UI开发进度 预览版------2349人围观
rank 9: Centos7下搭建部署DoClever接口管理平台------2258人围观
rank 10: 赞助名单------2172人围观
rank 11: vi/vim键盘图及其基本命令学习------2008人围观
rank 12: Supervisor 监控守护BCDN------1923人围观
rank 13: gitlab 中文版安装------1907人围观
rank 14: 偏光3D电视无需3D模式观看3D立体图片的方法------1891人围观
rank 15: 红米5Plus 刷第三方REC+Xposed框架【实测成功】------1879人围观
rank 16: S-S-R部署实战------1828人围观
rank 17: 10个最“牛叉”的代码注释------1716人围观
rank 18: 一个从1996年备份了超过4000亿个网页的网页时光机------1687人围观
rank 19: 分享:设置Windwos桌面动态壁纸方法------1492人围观
rank 20: 超强GIF截图工具-GifCam5.1汉化版------1463人围观
rank 21: 莓果API整理V1.2------1442人围观
rank 22: 双机同步的几点建议------1441人围观
rank 23: mysql 语句,表的操作------1405人围观
rank 24: 战地3狗斗小教程v1.2------1365人围观
rank 25: Win 2003 服务器VPN搭建视频教程------1346人围观
rank 26: 全国疯传DIY双机偏振3D视频+图文教程,NND再也不用求人了!------1295人围观
rank 27: Gitlab+Jenkins+Harbar+Docker自动发布流程设计实战------1260人围观
rank 28: linux用户权限集中管理方案------1245人围观
rank 29: 3张图片【1亿6千万像素】7500 x 21250分辨率洋图片、清晰度爆人眼球!【332MB】【百度网盘】------1175人围观
rank 30: 易语言停止子程序 的另类方法------1172人围观
rank 31: 小巧Flash文字动画制作工具------1164人围观
rank 32: 中国掘金者------1118人围观
rank 33: linux运维面试经典习题2------1116人围观
rank 34: linux运维面试经典习题1------1107人围观
rank 35: Linux自动化部署流程-秒级回滚-shell脚本------1100人围观
rank 36: 搭建企业级Docker私有仓库(Harbor)------1065人围观
rank 37: 《战地3》侦察兵全方位分析心得攻略------990人围观
rank 38: 45条网店运营知识,写的很全很认真------969人围观
rank 39: 基础知识:三十分钟看清经济机器如何运转------964人围观
rank 40: linux正则表达式------949人围观
rank 41: linux自动化自动重装系统------947人围观
rank 42: linux系统定时任务入门------921人围观
rank 43: 面对各大网盘逐渐关停我们怎么办?------916人围观
rank 44: 《战地3》十大不科学之处------912人围观
rank 45: “人脉”是麻烦出来的------910人围观
rank 46: 你这辣椒辣吗?------888人围观
rank 47: linux系统文件属性知识进阶------880人围观
rank 48: 麻烦(写得真好)------866人围观
rank 49: jenkins+gitlab自动触发------864人围观
rank 50: linux用户行为日志审计管理方案(单机)------864人围观
rank 51: 《战地3》侦察兵心得攻略------845人围观
rank 52: gitlab服务运维,备份与恢复------842人围观
rank 53: 《战地3》战斗机简略心得和各地图飞行战术------824人围观
rank 54: 《战地3》防空车驾驶员战场生存指南------821人围观
rank 55: kubernetes 1.13.2部署(kubeadm)------799人围观
rank 56: nginx实现一个域名配置多个laravel项目------788人围观
rank 57: linux系统文件权限体系------776人围观
rank 58: linux用户管理------755人围观
rank 59: linux系统发邮件必知必会-发送邮件的服务配置------741人围观
rank 60: nfs网络文件实战入门------733人围观
rank 61: 8-Kubernetes PV、PVC------718人围观
rank 62: MySql常用查询语句(23种)------712人围观
rank 63: Linux基础命令实战------709人围观
rank 64: linux网络基础配置------708人围观
rank 65: 13-kubernetes dashboard认证及分级授权------672人围观
rank 66: linux系统磁盘分区知识------645人围观
rank 67: linux一键优化系统脚本(centos6)------643人围观
rank 68: Linux运维监控概述、标准化------635人围观
rank 69: Ngin+php7.2-docker镜像------631人围观
rank 70: linux系统初步优化------625人围观
rank 71: 安全优化-项目开发流程及数据库更新流程------607人围观
rank 72: jenkins+docker自动发布到测试环境------604人围观
rank 73: 磁盘设备知识------603人围观
rank 74: linux系统目录结构知识------596人围观
rank 75: php.ini 配置文件 中文注释 详解------587人围观
rank 76: ssh服务重要知识------585人围观
rank 77: shell 例子------584人围观
rank 78: Linux基础命令总结------583人围观
rank 79: web集群架构部署顺序------577人围观
rank 80: Prometheus 学习笔记------573人围观
rank 81: 2-Kubernetes集群二进制包部署------563人围观
rank 82: linux系统进阶优化------563人围观
rank 83: 11-kubernetes认证及serviceaccount------561人围观
rank 84: Linux代理上网-做为网关使用实战(类似路由器网关)端口转发------560人围观
rank 85: Nginx负载均衡之端口转发------558人围观
rank 86: sersync + rsync实时同步实战------558人围观
rank 87: LAMP与LNMP web架构深度优化实战------554人围观
rank 88: 14-Flannel网络插件网路策略配置------553人围观
rank 89: Linux系统中‘dmesg’命令处理故障和收集系统信息的7种用法------553人围观
rank 90: 生产环境常见的HTTP状态码列表------552人围观
rank 91: JAVA企业级应用TOMCAT实战------545人围观
rank 92: linux系统文件类型介绍------541人围观
rank 93: git与gitlab快速入门------540人围观
rank 94: docker快速入门------538人围观
rank 95: www服务apache软件实战入门------537人围观
rank 96: linux企业考试题------534人围观
rank 97: CPU高,手把手教你用Strace诊断问题------526人围观
rank 98: awstats日志分析工具配置实战nginx------522人围观
rank 99: 企业级数据备份方案实战------521人围观
rank 100: nginx-负载均衡入门实战------518人围观
rank 101: cacti监控服务安装搭建实战------512人围观
rank 102: rsync高级同步工具语法------512人围观
rank 103: LNMP潮流组合手把手搭建实战------508人围观
rank 104: rsync高级同步工具部署实战------508人围观
rank 105: 虚拟机克隆后无法上网的问题------506人围观
rank 106: MySQL表操作、修改权限------502人围观
rank 107: Cente7优化脚本------501人围观
rank 108: my-innodb-heavy-4G.cnf配置文件 注释 详解------498人围观
rank 109: ssh key企业批量分发自动化管理案例------496人围观
rank 110: 安装Prometheus+Grafana------495人围观
rank 111: Nagios监控服务端安装实战------493人围观
rank 112: 分布式MySQL-TiDB------490人围观
rank 113: httpd.ini配置文件详解------483人围观
rank 114: openstack安装入门------479人围观
rank 115: Mysql 多表联合查询------477人围观
rank 116: awstats配置分析nginx日志------472人围观
rank 117: MySQL数据库多实例应用实战------469人围观
rank 118: Fast CGI优化------469人围观
rank 119: Nagios图形显示介绍及实战------466人围观
rank 120: LAMP与LNMP加速与缓存优化进阶实战php编译------466人围观
rank 121: NOSQL之Memcached缓存服务实战------465人围观
rank 122: 企业级生产场景批量管理,自动化管理方案------458人围观
rank 123: MySQL主从复制实战------455人围观
rank 124: top命令------455人围观
rank 125: lvs+keepalived部署实战------453人围观
rank 126: MySQL数据库4种安装方法------452人围观
rank 127: MySQL主从复制不同步故障解决------450人围观
rank 128: lamp经典组合手把手企业实战搭建------449人围观
rank 129: NFS企业上机实战------447人围观
rank 130: iptables防火墙入门------445人围观
rank 131: MySql数据库的备份与恢复------445人围观
rank 132: 9-特殊存储卷configMap和Secret------444人围观
rank 133: Cobbler无人值守安装linux系统------443人围观
rank 134: Zabbix生产案例实战------443人围观
rank 135: 修改无法启动的Docker容器中的内容------438人围观
rank 136: linux添加新硬盘------437人围观
rank 137: nginx web服务入门实战------436人围观
rank 138: 2017年Linux运维人员必会开源运维工具体系------432人围观
rank 139: nginx/TCP状态/memcached/redis监控脚本------431人围观
rank 140: MySQL数据库优化------431人围观
rank 141: LVS集群DR模式配置实战------430人围观
rank 142: nagios客户端安装实战------429人围观
rank 143: PHP引擎优化------427人围观
rank 144: Heartbeat+DRBD+MySQL高可用架构方案与实施过程细节------425人围观
rank 145: inotify + rsync工具实时同步方案实战------424人围观
rank 146: 实战模拟企业数据丢失案例------422人围观
rank 147: nginx.conf配置文件详解------419人围观
rank 148: Jenkins安装配置入门------417人围观
rank 149: Jenkins权限用户分配------415人围观
rank 150: apache企业级日志轮询cronolog实战------415人围观
rank 151: KVM虚拟机安装实战入门------414人围观
rank 152: cente7安装Zabbix 入门实战------413人围观
rank 153: MySql 语句入门------413人围观
rank 154: 17-资源指标API及自定义指标API------410人围观
rank 155: Keepalived高可用集群配置实战------407人围观
rank 156: Mysql 插入中文数据乱码问题------405人围观
rank 157: LVS集群及keepalived服务入门------401人围观
rank 158: www服务apache软件实战进阶------401人围观
rank 159: Docker 创建网络,自定义运行网段、添加网卡------400人围观
rank 160: 2018年学习目标《LINUX高级架构师》------399人围观
rank 161: 网站访问慢数据库问题排查------399人围观
rank 162: linux运维面试经典习题3------398人围观
rank 163: 主从复制读写分离授权3种方案------395人围观
rank 164: Nagios服务端目录及配置实战------388人围观
rank 165: cente6 安装Zabbix 实战------386人围观
rank 166: 架构脚本开发笔记------386人围观
rank 167: 轻松应对IDC机房带宽突然暴涨问题------386人围观
rank 168: 运维知识体系------382人围观
rank 169: split命令------381人围观
rank 170: linux挂载及fstab------380人围观
rank 171: shell监控web服务的多种方案------379人围观
rank 172: ELKStack 安装部署实战------377人围观
rank 173: Nginx、Apache、Mysql、PHP环境编译参数查看------375人围观
rank 174: SSR负载均衡配置------372人围观
rank 175: CentOS6无人值守安装操作系统-PEX+Kickstart------371人围观
rank 176: 1-565个运维28期文件视频------370人围观
rank 177: linux运维发展路线规划------370人围观
rank 178: 4-kubernetes更新逻辑与策略------369人围观
rank 179: windows 查看程序后台运行的命令------367人围观
rank 180: 主宕机,从库切换主,继续和从同步过程方法------366人围观
rank 181: session共享会话存储实战------360人围观
rank 182: Docker-compose 容器编排入门------359人围观
rank 183: 数据库客户端安全策略------355人围观
rank 184: MySQL服务多种日志文件及多种引擎介绍------350人围观
rank 185: shell 笔记练习------347人围观
rank 186: NOSQL之Redis持久化缓存服务基础实战------347人围观
rank 187: shell监控MySQL服务的企业案例多方法------346人围观
rank 188: shell 函数入门------343人围观
rank 189: Nagios监控MySQL主从状态实战------342人围观
rank 190: shell 基础入门------337人围观
rank 191: shell 语句入门------332人围观
rank 192: 7-Kubernets存储卷------331人围观
rank 193: shell 开发环境配置调整及优化,调试技巧------326人围观
rank 194: 12-kubernetes-rbac------323人围观
rank 195: Docker 容器跨主机通信方法1------323人围观
rank 196: 10-kubernetes statefulset控制器------319人围观
rank 197: linux 案例------318人围观
rank 198: 3-Pod控制器入门------316人围观
rank 199: shell 数组入门------315人围观
rank 200: Liunx运维需要掌握的课程表------314人围观
rank 201: Memcached 管理监控工具安装------310人围观
rank 202: Vim 复制粘帖格式错乱问题的解决办法------306人围观
rank 203: Jenkins升级------298人围观
rank 204: Elasticsearch head插件安装------293人围观
rank 205: 5-kubernetes组件Service入门------288人围观
rank 206: 100W高并发(转载)------278人围观
rank 207: 16-容器资源需求、资源限制及HeapSter------276人围观
rank 208: docker 日志收集------269人围观
rank 209: docker 日志收集------268人围观
rank 210: Docker 容器跨主机通信方法2------260人围观
rank 211: 实现单机百万并发------256人围观
rank 212: 2-Kubernetes 资源清单定义入门------256人围观
rank 213: 3-kubectl命令行管理工具------253人围观
rank 214: 1-kubernets 快速入门------252人围观
rank 215: docker容器中使用定时任务------242人围观
rank 216: Swarm集群入门------239人围观
rank 217: 6-Ingress 与 Ingress Controller------239人围观
rank 218: 15-调度器、预选策略及优选函数------235人围观
rank 219: Docker 创建网络,自定运行网段------202人围观
rank 220: Docker 单机编排入门------197人围观
rank 221: 1-Kubernetes概述------187人围观
rank 222: 随手记录------48人围观