作为一个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文件的重新编码了,在这个项目上花时间太多了,难受