该脚本的目的:获取博客的排名和积分,将抓取时间,排名,积分存入数据库,然后把最近的积分和排名信息进行绘图,查看积分或者排名的变化情况。

整个脚本的流程:是利用python3来编写,利用selnium获取网页的信息,使用re正则表达式解析积分score和排名rank,用pymysql连接mysql数据库,最后利用matplotlib进行绘图。

  首先创建db: xiaoshitou

  创建表blog_rank:

CREATE TABLE `blog_rank` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
`rank` varchar(255) NOT NULL DEFAULT '' COMMENT '排名',
`score` varchar(255) NOT NULL DEFAULT '' COMMENT '积分',
`create_time` varchar(255) NOT NULL DEFAULT '' COMMENT '添加时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8;

  现在来看下绘图的结果:

    数据库表,blog_rank表中存的数据:

    下面就来看实现过程:

    1、该文件是利用pymysql来连接数据库,新增和查询数据的(operation_mysql.py)

#coding=utf-8

import pymysql as MySQLdb
import datetime host = '127.0.0.1'
user = 'root'
passwd = ''
port = 3306
db = 'xiaoshitou'
class OperationMySQL(object): def __init__(self):
"""连接数据库"""
try:
self.conn = MySQLdb.connect(host=host,
port=port,
user=user,
passwd=passwd,
db=db,
charset='utf8', )
self.cur = self.conn.cursor()
except Exception as e:
print('Connect MySQL Database Fail: ' + e) def _close_connect(self):
"""关闭连接"""
self.cur.close()
self.conn.close() def insert_data(self, data):
"""插入数据"""
sql = 'insert into blog_rank (rank,score,create_time) values ({0},{1},{2})'.format(data['rank'], data['score'], datetime.datetime.now().timestamp())
res = self.cur.execute(sql)
self.conn.commit()
self._close_connect() def select_data(self, sql=None):
"""根据sql查询数据"""
if sql is None:
sql = 'select rank,score,create_time from blog_rank order by create_time'
self.cur.execute(sql)
result = self.cur.fetchall()
self._close_connect()
headers = ('rank', 'score', 'create_time')
results = [dict(zip(headers, row)) for row in result]
# print(results)
return results if __name__ == '__main__':
OperationMySQL().select_data()

  2、get_my_blog_score.py,这个文件包含:获取网页内容,解析排名和积分,将抓取的数据存入数据库,读取数据库进行绘图

# coding=utf-8
try:
import requests
except:
import os
os.system('pip install requests')
import requests
import re
from selenium import webdriver
from time import sleep
from operation_mysql import OperationMySQL class GetMyBlogScore:
"""获取博客园积分和排名"""
def __init__(self):
pass def _get_blog_content(self):
"""获取博客的页面内容"""
url = "http://www.cnblogs.com/xiaoshitoutest"
driver = webdriver.Firefox()
sleep(1)
driver.get(url)
sleep(1)
self.content = driver.page_source
driver.quit()
return def _match_content(self, compile_str_args):
"""进行匹配内容"""
compile_str = re.compile(compile_str_args)
result = compile_str.findall(self.content)
final_str = re.sub(r'\D', '', result[0])
return final_str def _save_database(self, data):
"""将结果写入数据库"""
if isinstance(data, dict) and data is not None:
OperationMySQL().insert_data(data)
print('Insert Data Success.')
else:
print('The data is invalid.') def _show_map(self):
"""读取数据库中的值,画图表,保存结果"""
datas = OperationMySQL().select_data()
import matplotlib.pyplot as plt
from datetime import datetime
from matplotlib.dates import datestr2num,DateFormatter
import matplotlib.dates as dates x_ = [ datetime.fromtimestamp(float(x['create_time'])).strftime('%Y-%m-%d %H:%M:%S') for x in datas]
score = [x['score'] for x in datas]
rank = [x['rank'] for x in datas] plt.rcParams['font.sans-serif'] = ['FangSong'] fig, ax = plt.subplots()
ax.xaxis.set_major_locator(dates.DayLocator())
ax.xaxis.set_major_formatter(DateFormatter('%Y-%m-%d')) ax.plot_date(datestr2num(x_),score,'--')
ax.set_xlabel('日期')
ax.set_ylabel('积分')
ax.set_title('博客园排名--积分')
fig.autofmt_xdate()
# plt.show()
plt.savefig('./rank_score.png') def run(self):
score = r'<li.*?class="liScore">([\s\S]*?)</li>'
rank = r'<li.*?class="liRank">([\s\S]*?)</li>'
self._get_blog_content()
scores = self._match_content(score)
ranks = self._match_content(rank)
result = dict(zip(['score', 'rank'], [scores, ranks]))
self._save_database(result)
self._show_map() if __name__ == '__main__':
GetMyBlogScore().run()

  直接运行该文件,就会在当前目录下生成一个rank_score.png的图片,就是关于积分的变化图。

  开始那张是:时间--积分的绘图,我在放一张。积分--排名变化图

获取博客积分排名,存入数据库,读取数据进行绘图(python,selenium,matplotlib)的更多相关文章

  1. CSDN博客积分规则

    1.博客积分规则 博客积分是CSDN对用户努力的认可和奖励,也是衡量博客水平的重要标准.博客等级也将由博客积分唯一决定.积分规则具体如下: 每发布一篇原创或者翻译文章:可获得10分: 每发布一篇转载文 ...

  2. echarts通过ajax向服务器发送post请求,servlet从数据库读取数据并返回前端

    1.echarts的官网上的demo,都是直接写死的随机数据,没有和数据库的交互,所以就自己写了一下,ok,我们开始一步一步走一遍整个流程吧. 就以官网最简单的那个小demo来做修改吧.官网上的小de ...

  3. JMeter 参数化之利用JDBCConnectionConfiguration从数据库读取数据并关联变量

    参数化之利用DBC Connection Configuration从数据库读取数据并关联变量   by:授客 QQ:1033553122 1.   下载mysql jar包 下载mysql jar包 ...

  4. Django:(博客系统)使用使用mysql数据->后台管理tag/post/category的配置

    Django后台一般是不需要人为的去开发的,因为django已经通过配置实现哪些模块是后台需要管理,如何排序,列表展示哪些列,列显示名称,是否为空(默认值),过滤条件,分页页数,列表中哪些项可编辑等等 ...

  5. 10天学会phpWeChat——第三天:从数据库读取数据到视图

    在第二天,我们创建了我们的第一个phpWeChat功能模块,但是比较简单.实际生产环境中,我们不可能有如此简单的需求.更多的情况是数据存储在MySql数据库中,我们开发功能模块的作用就是将这些数据从M ...

  6. C#实现从数据库读取数据到Excel

    用第三方组件:NPOI来实现 先去官网:http://npoi.codeplex.com/下载需要引入dll(可以选择.net2.0或者.net4.0的dll),然后在网站中添加引用.使用 NPOI ...

  7. Android打开数据库读取数据

    打开数据库读取数据 private MyDatabaseHelper dbHelper; dbHelper=new MyDatabaseHelper(this,"List.db", ...

  8. 【Python】模块学习之Timer定时任务,递归定时自调获取博客浏览量

    Timer定时任务 下面是Timer函数的官方doc介绍信息 """ Call a function after a specified number of second ...

  9. java提取(获取)博客信息(内容)

    package com.wbg.my.service; import java.io.*; import java.net.HttpURLConnection; import java.net.URL ...

随机推荐

  1. UVa 10057 - A mid-summer night's dream

    题目大意:给n个数,找一个数A使得A与这n个数的差的绝对值最小.输出A最小的可能值,n个数中满足A的性质的数的个数以及满足A性质的不同的数的个数(不必从这n个数中挑选). 看见绝对值就想到了数轴上点之 ...

  2. 阿里云上给的防止跨站和xss攻击的代码

    文档说明: 1.将waf.php传到要包含的文件的目录 2.在页面中加入防护,有两种做法,根据情况二选一即可: a).在所需要防护的页面加入代码require_once('waf.php');就可以做 ...

  3. xhtmlrenderer渲染pdf,中文换行

    在实际开发中,发现在table中显示中文,渲染出来的pdf,中文内容不自动换行.经过搜索发现了一种解决方案,如下: 重写Breaker,修改right计算方式 /* * Breaker.java * ...

  4. 在Eclipse中提交SVN项目的时候注意提交项目信息

    提交项目的时候,注意提交.classpath,.project和.settings文件夹: 这些是项目的信息,别人下载的时候才能正确显示为Eclipse项目:

  5. HTML5画布(CANVAS)速查简表

    HTML5画布(CANVAS)速查简表 http://www.webhek.com/misc/html5-canvas-cheat-sheet/

  6. 原生javascript实现图片放大镜效果

    当我们在电商网站上购买商品时,经常会看到这样一种效果,当我们把鼠标放到我们浏览的商品图片上时,会出现类似放大镜一样的一定区域的放大效果,方便消费者观察商品.今天我对这一技术,进行简单实现,实现图片放大 ...

  7. Atom 编辑器系列视频课程

    此课程为 Atom 编辑器系列课程,主要介绍了 Atom 的高效开发技巧以及必备插件. 课程列表 Atom编辑器系列课程 #1 - Atom简介 Atom编辑器系列课程 #2 - 设置简介 Atom编 ...

  8. ArcGIS三种方式打断相交线------拓扑法

    拓扑法:有多个layer图层相交线,选用拓扑法,将多个图层相交线打断. 新建拓扑结构: (1)单击新建"Nfg.gdb"数据库文件: (2)单击新建"XX"集合 ...

  9. 简单的Elf逆向Writeup

    ElfCrackMe1 html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acrony ...

  10. ECMAScript 6 笔记(六)

    编程风格 1. 块级作用域 (1)let 取代 var (2)全局常量和线程安全 在let和const之间,建议优先使用const,尤其是在全局环境,不应该设置变量,只应设置常量. const优于le ...