• Python统计博客园访问量


    博客园有一个很不友好的地方,那就是没有自带博客访问量统计功能.

    之前有尝试使用flagcount进行统计,但是不知道什么时候开始这个插件被博客园屏蔽了.具体原因可自行百度...

    反正有学Python的打算,于是就尝试(copy)写个脚本,统计我的博客园博客访问量,更确切地说,应该是统计每篇随笔地阅读量

    首先,我找到一篇关于使用python统计博客园访问量地文章,对于大部分博客园用户来说,应该是可以用的.

    直接复制以下博客代码,并修改代码中博客地址即可进行统计.我下面的代码是解释整个统计过程原理的,只适用本人博客.想了解原理的可以看我自己写的代码

    博客地址

    https://www.cnblogs.com/-wenli/p/12464545.html

    但是很可惜,并不适用于我的,可能是因为我的博客园做了一些自定义配置,导致统计失败.后来胡乱改了一下代码,总算可以在我自己的博客上进行统计.我的代码在旧代码上进行了简化

    原理如下:

    1. 配置headers模拟浏览器访问
    2. 指定博客园地址
    3. 配置博客园随笔地每一页地址
    4. 通过get_one_page分析该页面时候存在,如果不存在则返回空...(这里是根据返回码检测,但是我发现访问不存在的页码,实际上curl -I还是会返回200,后续再研究一下.这里不影响统计,可先忽略)
    5. 统计每一页随笔的访问量
    6. 匹配div类,精确到阅读量所在地那个div标签,我这里对应地是p标签

    这个需要自己确认.可以通过快捷键F12调出调试工具

    慢慢找一下某篇文章对应的div.点击这个,对应文章区域会亮起.原代码的div是day,而我这里是post.另外阅读量在的div也不一样,原作者是div class="postDesc",我的是p class="postfoot"

    对比一下.下面第一张图是原文博客的页面源代码,第二张是我的.

    原作者博客园代码:

     我的博客园代码:

    7. 提取p标签里的数字,得到一个数字列表
    8. 再次从数字列表中提取出我们想要的阅读量
    9. 最后将这些阅读量相加即可得总浏览量

    先安装以下python模块(python2.7)

    pip install beautifulsoup4
    pip install lxml

    具体python脚本如下.原理我已经说出来了,就不再多写代码注释

    [root@instance-u5vn5wqr ~]# cat blogviewcount.py
    # -*- coding: utf-8 -*-
    from bs4 import BeautifulSoup
    import requests
    from requests.exceptions import RequestException
    import re
    import time

    def get_one_page(url,headers):
        try:
            response = requests.get(url,headers=headers)
            if response.status_code ==200:
                return response.text
        except RequestException:
            return None
    def parse_one_page(html):
        global item,flag
        global perpagetotal
        perpagetotal = 0
        soup = BeautifulSoup(html, 'lxml')
        divs = soup.find_all('div',class_='post')
        if(len(divs) == 0):
            flag = False
            return ""
        for i, child in enumerate(divs):
            i=0
            infomations = child.find_all('p', class_='postfoot')

            for infomation in infomations:
                info = infomation.get_text()
                info = info.replace(' ', '')
                info = info.replace(' ', '')
                #print info
                #info的具体值类似posted@2020-01-1019:29-零阅读(271)评论(0)编辑
                #下面使用findall获取所有数字
                result = re.findall("d+", info)
                #print result
                #findall返回的结果实际是一个数字列表
                #result返回的结果数字列表类似[u'2020', u'01', u'1019', u'29', u'271', u'0'].
                #其中对应的result[4]就是我们需要的阅读量
                #print result[4]
                perpagetotal = perpagetotal + int(result[4])
                i+=1
        print ('perpagetotal is:',perpagetotal)

    def main():
        headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko'}
        headurl = 'https://www.cnblogs.com/biaopei/default.html?page='
        i = 1
        global perpagetotal
        global total
        perpagetotal = 0
        total = 0
        while flag:
            url = headurl + str(i)
            print(url)
            html = get_one_page(url,headers)
            parse_one_page(html)
            print (total,'+',perpagetotal,'=')
            total = total + perpagetotal
            print(total)
            i += 1
        print ('all total is: ',total)

    if __name__ == '__main__':
        flag = True
        main()

     执行python blogviewcount.py

    以下是部分运行结果.最后一行为总浏览量

    https://www.cnblogs.com/biaopei/default.html?page=24    #这个是轮询的页数.可以看到,页数到25而已,第26页为空
    ('perpagetotal is:', 16916)                   #当前页的阅读累加量
    (301748, '+', 16916, '=')                    #前面全部页的随笔阅读量总和,加当前页浏览量总和
    318664
    https://www.cnblogs.com/biaopei/default.html?page=25
    ('perpagetotal is:', 10239)
    (318664, '+', 10239, '=')
    328903
    https://www.cnblogs.com/biaopei/default.html?page=26
    (328903, '+', 0, '=')
    328903
    ('all total is: ', 328903)
    [root@instance-u5vn5wqr ~]# 
  • 相关阅读:
    java定时读取文件
    Java面试:投行的15个多线程和并发面试题(转)
    读取一个文件,给定一个字符串,判断这个字符串在文件中出现的次数
    随机产生10个数,并每个数给定一个序号,然后将这10个数按照从小到大的顺序输出来,并带上序号输出
    找出给定字符串中出现最多的字符和次数
    公司开发部门GIT与SVN 之争
    浅谈Hibernate中的三种数据状态
    MyBatis框架的XML数据访问Dao层接口的组合使用
    浅谈WebLogic和Tomcat
    为什么我们不要 .NET 程序员
  • 原文地址:https://www.cnblogs.com/biaopei/p/12561951.html
Copyright © 2020-2023  润新知