美文网首页python热爱者Python新世界
我用刚学完的 python 爬取下博客园隐藏的小秘密及各类排行榜

我用刚学完的 python 爬取下博客园隐藏的小秘密及各类排行榜

作者: 48e0a32026ae | 来源:发表于2018-11-08 15:54 被阅读1次

    接触博客园有不短的时间了,今天突然想到,我们博客园各位博友,一天中哪个时间段比较活跃?又有多少夜猫子在深更半夜,冒着“聪明绝顶”的风险熬夜码字看博文?首页所有博文中,哪个博友发布博文数量最多?又是哪个博友大范围“收割”阅读量和评论量?我们的各类排行榜中,谁能独占鳌头?

    今天,博主就现学现卖,用刚学完基础知识的 python 爬取下博客园相关数据,给大家分享下咱们博客园那些隐藏的“小秘密”。

    方案

    想法出现了,怎么实现呢?

    第一反应就是想获取各位博友的登录信息访问记录。这些数据应该是最准确的统计了。

    但是,不幸的是,博主把博客园翻了个“底朝天”,也没有找到哪些地方能获取到各位博友的登录信息和访问记录。

    想想也是,这些相当于各位博友的私密信息了,怎么会公开呢?咱就不痴心妄想了。

    爬不到登录信息和访问记录,还能用哪些数据呢?

    博主想了下,咱们在博客园逛游,一般都会先去首页看下有没有什么有趣的技术或者人生经验分享,碰到感兴趣的还可以和博主聊聊,缓解下紧绷的神经。

    那既然首页是多人访问的页面,我们统计首页博文的浏览量评论量,应该也能在一定程度上反映出各位博友的活跃时间了。

    于是,统计方案就定下来了:

    获取首页博文的浏览量和评论量,按时段进行统计。

    实现

    目标:

    获取首页博文的浏览量和评论量

    爬取数据

    这还不简单,哪怕博主我是刚学完基础知识,也知道 python 在爬取 html 元素方面是专业的。

    一番折腾,终于按小时分段,获取到了第一页博文的浏览量和评论量:

    import requestsimport reimport jsonimport time

    CRAWLING_URL = 'https://www.cnblogs.com/'def downloadPage():

    """获取页面内容"""

    print('获取页面内容用时')

    url = CRAWLING_URL

    res = requests.get(url).text

    html = BeautifulSoup(res, 'lxml')

    data = {}

    postList = html.find_all(class_='post_item_foot') for postInfo in postList:

    content = postInfo.contents # 发布时间字符串

    timeStr = content[2][11:27]

    localTime = time.localtime(time.mktime(

    time.strptime(timeStr, '%Y-%m-%d %H:%M'))) # 以2018-11-01 15 格式时间 作为 key

    timeIndex = time.strftime("%Y-%m-%d %H", localTime)

    viewStr = content[4].contents[0].contents[0]

    commontStr = content[3].contents[0].contents[0] # 浏览量

    view = int(re.findall("d+", viewStr)[0]) # 评论量

    commont = int(re.findall("d+", commontStr)[0]) if timeIndex in data:

    data[timeIndex]['view'] += view

    data[timeIndex]['commont'] += commont

    data[timeIndex]['postCount'] += 1

    else:

    data[timeIndex] = { 'view': view, 'commont': commont, 'postCount': 1

    }

    return data

    第一页拿到了,离所有数据还远吗?

    事实证明,真的挺远的、、、

    当博主想拿第二页的数据时,很明显的可以看到第二页的地址是:

    https://www.cnblogs.com/#p2

    于是博主这样做了

    # ...CRAWLING_URL = 'https://www.cnblogs.com/#p'def crawlData(page, data):

    url = CRAWLING_URL + str(page)

    # ...

    def main():

    pageNum = 11

    data = {}

    for page in range(1, pageNum): data = crawlData(page, data)

    page += 1

    print(data)

    看出来了吗?博主是直接将地址栏里的地址拼接上页码,想获取到对应页码的数据。

    事实证明,还是太嫩了。运行了好几次,发现统计数据明显不对,获取到的第二页的数据明显不是浏览器显示的。

    翻到第二页,看着页面元素,和第一页的一样啊,怎么爬到的数据就不对呢?

    作为一个后端开发,马上就意识到,在后面的页码页,肯定有额外的 ajax 请求,获取对应数据,展示到页面。

    翻到 network,果不其然。在非第一页的页面中,都会请求一个接口,获取指定页码的数据。原因找到了,赶紧修改请求地址和请求方式。

    # ...CRAWLING_URL = 'https://www.cnblogs.com/mvc/AggSite/PostList.aspx'def crawlData(page, data):

    """获取页面内容"""

    url = CRAWLING_URL

    headers = { 'Content-Type': 'application/json',

    }

    params = json.dumps({ 'CategoryId': 808, 'CategoryType': "SiteHome", 'ItemListActionName': "PostList", 'PageIndex': page, 'ParentCategoryId': 0, 'TotalPostCount': 4000,

    })

    res = requests.post(url, data=params, headers=headers, verify=False).text # ...

    至此,首页博文的总浏览量、评论量以及发布数量已经按小时为区段进行汇总了。

    存储数据 学习Python中有不明白推荐加入交流群

                    号:516107834

                    群里有志同道合的小伙伴,互帮互助,

                    群里有不错的学习教程!

    数据拿到了,下一步就是数据存储了。这里,我们选用最简单的 excel 表格存储,也就是将统计的数据导出到 excel 表格中,以供后续分析统计。

    def main():

    pageNum = 11

    data = {} # 获取所有数据

    for page in range(1, pageNum):

    data = crawlData(page, data)

    print('已完成: %s/%s' % (page, pageNum - 1))

    page += 1

    # excel 表格存储

    col = 2

    ws1['A1'] = '日期'

    ws1['B1'] = '查看人数'

    ws1['C1'] = '评论人数'

    ws1['D1'] = '发布数量'

    for postCount in data:

    col_A = 'A%s' % col

    col_B = 'B%s' % col

    col_C = 'C%s' % col

    col_D = 'D%s' % col

    col_E = 'E%s' % col

    col_F = 'F%s' % col

    ws1[col_A] = postCount

    ws1[col_B] = data[postCount]['view']

    ws1[col_C] = data[postCount]['commont']

    ws1[col_D] = data[postCount]['postCount']

    col += 1

    wb.save(filename=dest_filename)

    print('-------------SUCCESS--------------')

    这样,我们就将数据存储到 excel 表格中了。

    分析数据

    下一步就是数据分析。由于个人能力所限,这里先用 excel 表格进行相关的统计。

    由于博客园只提供 200 页的数据量,最后的数据到 8 月 20 日左右,所以 9 月份和 10 月份的数据是比较完整的。但是考虑到 10 月份有十一假期的原因,以及当前时间距离十月份较近,所以最终取 9 月份的数据进行相关统计。

    周数据

    上图是 8.25-9.30 连续 5 周的数据统计,0 表示 周日。由图可以比较明显的看出一些趋势:

    每周的前四天是博文发布数量较高的,后三天发布数量明显减少;

    查看人数和评论人数的趋势较为相符,两者的比例在 208:1 左右,也就是说平均 208 个阅读里面才会 1 个评论。

    这里博主比较不解的是,为什么会在每周一有一个阅读高峰期?难道刚休息完,周一的时候会更有动力看博文补补课?

    天统计

    上图是 9.3 - 9.6 按小时分段统计数据。可以看出:

    博文发布一般集中在上午 8-10 点,下午的 16-18 点以及晚上的 20-22 点

    看来各位博友晚上即使不加班的也会努力码字啊,抓住下班后的两小时,很棒的习惯诶,博主也要更加努力向各位博友看齐了。

    最后,就是我们的重磅戏,各类排行榜。这里需要将时间分组修改为发布作者名称分组

    各类排行榜

    以上排行榜数据时间段: 2018-08-21 09:24 至 2018-11-07 09:27 。

    好了,园子的小秘密就分享到这里。有兴趣的博友可以发掘下其他的小秘密。注意不要恶意攻击噢!

    源码地址:https://github.com/zibinli/python

    喜欢就给个大拇指吧!

    相关文章

      网友评论

        本文标题:我用刚学完的 python 爬取下博客园隐藏的小秘密及各类排行榜

        本文链接:https://www.haomeiwen.com/subject/njpwxqtx.html