Python统计CSDN阅读量

urllib基础

一般做爬虫其实很少有推荐urllib的,但urllib乃是Python标准库成员,在要求比较简单的情况下,采用urllib还是比较方便的。

作为爬虫入门必学包,urllib最常用的函数一定是urllib.request中的urlopen。其返回对象是HTTPResponse,这个类也只能作为urlopen的返回值,而无法通过什么构造函数创建。

import urllib.request as ur
res = ur.urlopen("https://tinycool.blog.csdn.net/")

其成员变量和无参函数如下

成员说明成员说明
version版本11length内容长度50672
status状态200getcode()
url.code
状态码200
readable()是否可读Truewritable()是否可写False
seekable()是否可seekFalsechunked是否已编码False
closed
url.isclosed()
是否已关闭Falseisatty()False
fileno底层套接字序号700msg状态信息‘ok’

此外,变量res.url链接'https://tinycool.blog.csdn.net/'

其他像诸如close()flush()read()write与文件操作中的函数类似。例如,read(5)表示读取5个字符,read()表示读取所有内容,readline表示读取一行。

统计CSDN博客阅读量

CSDN非常友好地为创作者提供了诸多统计工具,对近期博客进行数据可视化。然而,似乎并没有对文章的阅读数做实时的记录,所以只能查看每日阅读量,而不能更加细致地查看每小时的阅读量。对于程序员来说,获取这个信息是轻而易举的。

import urllib.request as ur
url = 'https://tinycool.blog.csdn.net/article/list/1'
res = ur.urlopen(url)
text = res.read().decode('utf-8')

即准备爬取的页面如下,想要爬取的内容是文章列表的链接

在这里插入图片描述

唯一有点麻烦的就是,在获取网页数据之后,需要对这个数据进行解析。一般来说,适用于爬虫的最佳拍档是BeautifulSoup,但考虑到本文主要介绍标准库中的urllib,不宜引入更多其它的模块,所以接下来用正则表达式来实现对网页的解析。

首先,考虑到我们的目的是获取所有文章的链接,而文章链接基本都是https://tinycool.blog.csdn.net/article/details/128429200这种比较统一的格式,其中最后是9位数字表示博客序号。

import re
article = r'details/[0-9]*'
details = re.findall(article, text)
len(details)
# 结果为101,即找到了101篇博客

但这101篇博客中,有不少是左侧热门文章之类的,但是没关系,最后只需将所有文章号做个单值化就好了。而且经过实测,发现其中有61篇都是不知道哪来的博客。

blogId = []
for i in range(1, 100):
    url = f'https://tinycool.blog.csdn.net/article/list/{i}'
    res = ur.urlopen(url)
    text = res.read().decode('utf-8')
    details = re.findall(article, text)
    blogId += [int(d.split('/')[-1]) for d in details]
    if len(details)==61:
        break

blogId = list(set(blogId))

接下来就可以逐一爬取每篇博客了,其中准备爬取的内容包括博客名、发布时间、阅读数,所需爬取的内容包括

TITLE = 'id="articleContentId">.*</h1>'
TIME = '>于&nbsp;\d*-\d\d-\d\d'
VIEW = '"read-count">\d*'
def parseRes(url):
    res = ur.urlopen(url)
    text = res.read().decode('utf-8')
    title = re.findall(TITLE, text)[0]
    title = title.split('>')[1][:-4]
    print(title)
    t = re.findall(TIME, text)[0]
    t = t.split(';')[1]
    v = re.findall(VIEW, text)[0]
    v = v.split('>')[1]
    return [title, t, v]

然后对所有数据进行相同的操作

infos = []
for id in blogId:
    url = f'https://tinycool.blog.csdn.net/article/details/{id}'
    try: infos.append(parseRes(url))
    except: continue

获取所有数据之后,可查看一下阅读量分布

views = [int(i[2]) for i in infos]
import matplotlib.pyplot as plt
plt.hist(views)

得到结果如下,可见大部分博客的阅读量都在1000以内,实在是太凄惨了。

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微小冷

请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值