作为一个CSDN博主,如何更直接的获取成就感?——python2调用远程服务器定时爬取CSDN访问量存入MySQL数据库并可视化系列教程(一:项目由来)

版权声明:转载请标注来源 https://blog.csdn.net/hehedadaq/article/details/82464556

作为一个CSDN博主,如何更直接的获取成就感?

——python2调用远程服务器定时爬取CSDN访问量存入MySQL数据库并可视化系列教程
[toc]

前言:

哈哈,标题直接将原博主的链接挂上去了,大家可以先看看原博主的基础概念教程。
博客链接:
python简单爬虫:爬取并统计自己博客页面的信息(一)

刚刚看了一节关于如何讲好故事的公开课——【学习】听下故事
OK,那我也得活学活用吧~

先讲讲为啥要做这个项目呢?

  • 总访问量提高后,数值增长不明显,难以激发成就感。第一个问题呢,刚开始写博客的时候,基本上每天都刷一下CSDN的主页,看着我写的博客,咦,竟然会有人看哎,然后看着自己走过的路,能够帮助别人节省时间和弯路,内心还是很有满足感的。
  • 最初还好,几百的访问量,每天都可以涨一倍,效果很不错;可是时间长了,访问量到6342类似数字的时候,每天涨几百,这时候,谁能记得住到底昨天是多少呢?就像打游戏升级一样,这种数值的递增,才会给予自己内心一种非常大的激励。至少你得有一个经验进度条和分段奖励机制吧。
  • 可是CSDN首页有啥?
    我们来看看:
    这里写图片描述
    你说这里能看到啥?博客等级和积分都是没啥用的~
    访问量到了一万,直接显示的竟然就直接一个1万+我都好几天没有看到我数据上升了!

  • 新博客迅速增长的访问量以及增速难以看到。我也不知道我那么多的博客,哪些博客是最受欢迎的,尤其是新发的博客,我想知道新博客访问量的增长速度,而自带的按访问量高低进行排序,会隐藏掉这种新博客增长的信息。
    这里写图片描述

总的来说,写博客,一个是记录自己的学习过程,一个反思的过程。但是分享到互联网中,还有一个很大的动机就是获取别人的关注,以得到一种被认可的满足感,虽然最应该的是刷论文。。。等我把这个小demo整完,就去。。。

弱弱的说一下,我竟然在这个项目上花了前后两周的时间…..

其实呢,学习的过程,主要就是一个开阔视野的过程,不断了解到你的需求,然后搜寻现有的解决方案,在寻求的过程中,构建自己的认知,获取更多的关键词,然后找到最合适的一种。

项目涉及内容和未完成的点

不过这个项目确实挺综合的。大家从标题就应该可以看出来。
先看看我目前拿到的整体访问量-获取时间的散点图:
这里写图片描述
- python的基础语法,尤其是列表、字符串、数值的转换;
- Windows和Ubuntu以及MySQL中的三种编码方式(utf-8,unicode,ASCII,这是一个大坑!接下来我会将之前的一些试坑博客列出来)
- python操作MySQL数据库,这里面基础的数据库知识,以及接口的调用,都是需要下功夫的。本科学的那早就过时的数据库知识根本起不到作用。
- 远程服务器的操作,Ubuntu命令行教程我就不列了,太多了,没有服务器的同学在本地运行效果也差不多。
- 数据的可视化,主要是matplotlib的使用,其实这个一般是需要添加什么功能,就搜什么教程,然后试一下,加上去就好了。
- 另外这里的数据可视化工作还没有做完!比如我还不能动态的显示我的访问量和时间的关系;我采集数据的时间间隔不同,但是我并不能将这种间隔在图表中体现出来;我还采集了所有博客的访问量以及创建时间,但是还没有好的规划,将这些博客的访问量信息,以一种有效的方式呈现出来,毕竟博客数量很多;还有无法统计出博客的最新变化,比如一周内,访问量上涨最快的一篇博客的访问图、每天哪个时间段博客访问量最大?如何综合联系时间、访问量、标题、内容、关键词等标签的关系?感觉这里的工作才算是真正开始,可是这个并不能帮我写一篇论文,大概是要弃坑了~
- 最后是整体项目代码的一个整理和规范化,还没有学会,准备向原博主学习,主要是工程目录设计,以及logging的使用。这里还是需要进一步努力的。

目前可以添加的需求功能:

  • 每篇博客连续三天的柱状图列表,这个功能基本可以满足我,看到访问量增长的满足感~
  • 总访问量随时间的动态变化,我的数据采集,是以半个小时为基本单位的,但是显示的时候,可以像股票那样,分时,分日,分周~这个具体的操作还得认真看一下别人的方案~待处理~
  • 接上面的方案,最好还是得加一个窗口界面,进行互动操作,或者是网页,然而Qt和网页设计,我都不会,尴尬的一匹~选择放弃,先把第一个做好吧。

先上点代码吧:

前面废话是不是太多了。。。
下面赶紧上干货——代码:
其实这段代码只是样例,因为模块化设计了,所以各种模块导来导去的,我还得将整体的思路整理出来,也就是原博主提到的——工程目录设计:

id.txt
main.py
readme.txt

src
    blog_class.py
    blog_insert2mysql.py
    log_id.py
    notouch_spider.py
    plot_time_total_views.py
    read_blogs_set_table_info.py
    read_blogs_set_table_name.py
    read_csdn_table_info.py
    read_csdn_table_name.py
    set_class.py
    set_insert2mysql.py
    untitled0.py
    __init__.py

详细的代码,可以看看我的GitHub——
直接看readme文件,基本上就好了,代码也是有注释的
https://github.com/kaixindelele/CSDN_pageviews_spider_tomysql_and_visualize/

import urllib2
import re
from bs4 import BeautifulSoup 
import sys
import chardet
import time
import pymysql

#这里需要修改称为你的博客账号
account = 'hehedadaq'
baseUrl = 'http://blog.csdn.net/'+account

#导入的这个模块是我接下来定义的一个类,不在这个文件里,所以这段代码无法直接运行~
import blog_class

def getPage(url):

    #伪装成浏览器访问,直接访问的话csdn会拒绝
    user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
    headers = {'User-Agent':user_agent}
    #构造请求
    # print("url:",url)
    req = urllib2.Request(url,headers=headers)
    #访问页面
    try:
        myResponse = urllib2.urlopen(req)
    #    print myResponse.info()
        myPage = myResponse.read()    
        return myPage

    except Exception,e:
        print e
        print "本次请求失败,尝试第二次也是最后一次请求!"
        try:
            myResponse = urllib2.urlopen(req)
        #    print myResponse.info()
            myPage = myResponse.read()
            return myPage

        except Exception,e:
            print e
            print "最后一次请求失败,凉了,选择放弃!"

def get_list(now_page,last_page):

    blog_id_list = []
    blog_url_list = []
    title_list = []
    page_view_list = []
    create_time_list = []
    blog_list = []

    num = 1
    while now_page <= last_page:
        print'-----------------------------the %d page ---------------------------------' % (now_page,)

    #    获取网页源码     
        myUrl = baseUrl+'/article/list/'+str(now_page)
        myPage = getPage(myUrl)

        # 获取总访问量
        soup = BeautifulSoup(myPage,'html.parser',from_encoding='utf-8')
        contents = soup.find_all('div',class_ = 'article-item-box csdn-tracking-statistics')

        total_views = soup.find('div',class_ = 'grade-box clearfix').find_all('dl')

#        for t in total_views:
#            print t.find('dd').get('title')

        print total_views[1].find('dd').get('title')
        total_views = total_views[1].find('dd').get('title').encode('utf8')

        print type(total_views)

        for c in contents:
#            print "total_view: %s"%(c)        
            blog_id = int(c.get('data-articleid').encode('utf-8'))
            blog_url = c.find('a').get('href').encode('utf-8')
            title = c.find('a').get_text().encode('utf-8')
            title = title.strip().replace('原 ','').replace('转 ','').replace('译 ','').strip()
            #因为我的一个标题里有反斜杠,所以插入MySQL总是会报错!所以我要把反斜杠都转为斜杠!
            title = title.replace("\\\\x","/x")
            page_view = int(c.find('span',class_ = 'read-num').get_text()[4:])
            create_time = c.find('span',class_='date').text.encode('utf-8')

            blog_id_list.append(blog_id)
            blog_url_list.append(blog_url)
            title_list.append(title)
            page_view_list.append(page_view)
            create_time_list.append(create_time)

            tem = locals()['blog_'+str(num)] = blog_class.Blog(num = num,blog_id = blog_id ,title = title,page_view = page_view,create_time = create_time)
            blog_list.append(tem)

            num += 1
        now_page += 1

    return blog_id_list,blog_url_list,title_list,page_view_list,create_time_list,blog_list,total_views

if __name__ == '__main__':
    print "---------*提取网页信息:博客id、URL、浏览量和标题*---------"
    blog_id_list,blog_url_list,title_list,page_view_list,create_time_list,blog_list = get_list(1,1)

具体的讲解第二篇再讲吧~
第二篇应该就是readme文件的重新编码了,在这个项目上花时间太多了,难受

猜你喜欢

转载自blog.csdn.net/hehedadaq/article/details/82464556
今日推荐