準備寫一個系列,在年終歲尾之際,盤一盤你們或者是本人比較關心的一些數據。文章內容會包括數據獲取的過程和數據可視化結果。今天先來看看各大數據庫在過去一年的表現吧!html
全部的數據都來源自網站:db-engines.com/redis
一個數據庫流行趨勢統計網站。數據庫
咱們先來看獲取數據方法一 首先咱們能夠在下面地址中看到一個包含全部數據庫信息的表格bash
db-engines.com/en/rankingsession
先抓取全部數據庫名稱信息,經過 pandas 的 read_html 方法能夠方便的讀取 html 中的 table 數據異步
import pandas as pd
mystr = ' Detailed vendor-provided information available'
def set_column3(column3):
if mystr in column3:
column3 = column3.split(mystr)[0]
return column3
url = 'https://db-engines.com/en/ranking'
tb = pd.read_html(url)
db_tb = tb[3].drop(index=[0, 1, 2])[[0, 1, 2, 3, 4, 5, 6, 7]]
# 處理數據
db_tb[3] = db_tb[3].apply(set_column3)
# 保存數據
db_tb.to_csv('db_tb.csv')
複製代碼
異步抓取數據庫詳細信息async
async def fetch(session, url):
async with session.get(url) as response:
return await response.text()
async def get_db_data(db_name):
url = 'https://db-engines.com/en/ranking_trend/system/%s' % db_name
async with aiohttp.ClientSession() as session:
res = await fetch(session, url)
content = BeautifulSoup(res, "html.parser")
content.find_all("script")
db_data = content.find_all("script")[2].string
src_text = js2xml.parse(db_data)
src_tree = js2xml.pretty_print(src_text)
data_tree = BeautifulSoup(src_tree, 'html.parser')
data_tree.find_all('number')
data = []
for i in data_tree.find_all('number'):
data.append(i['value'])
date_list = gen_time('%s-%s' % (data[0], str(int(data[1]) + 1)))
date_value = list(zip(date_list, data[3:]))
d_data = zip([db_name for i in range(len(date_value))], date_value)
await save_data(d_data)
def gen_time(datestart, dateend=None):
if dateend is None:
dateend = time.strftime('%Y-%m', time.localtime(time.time()))
datestart=datetime.datetime.strptime(datestart, '%Y-%m')
dateend=datetime.datetime.strptime(dateend, '%Y-%m')
date_list = list(OrderedDict(((datestart + timedelta(_)).strftime(r"%Y-%m"), None) for _ in range((dateend - datestart).days)).keys())
date_list.append('2019-12')
return date_list
if __name__ == '__main__':
db_tb = pd.read_csv('db_tb.csv')
db_name = db_tb['3'].values.tolist()
loop = asyncio.get_event_loop()
tasks = [get_db_data(name) for name in db_name]
loop.run_until_complete(asyncio.wait(tasks))
loop.close()
複製代碼
下面再來介紹第二種方法,方法更簡單,可是抓取時須要處理的地方更多些ide
咱們能夠直接訪問下面的地址,一樣的,在頁面加載完成後,會返回全部數據庫的歷年數據信息oop
那麼咱們就能夠直接解析此處的 JavaScript 信息,獲取對應數據庫的數據便可
不過因爲有些數據庫的歷史數據有缺失,因此須要作特殊處理
for i in data_tree.find_all('object'):
date_list = gen_time('%s-%s' % (year_list[0], str(int(year_list[1]) + 1)))
data = []
tmp_list = []
db_name = i.find('string')
if i.find('null'):
null_num = len(i.find_all('null'))
tmp_list = list(zip(date_list[:null_num], ['0' for i in range(null_num + 1)]))
date_list = date_list[null_num:]
for j in i.find_all('number'):
data.append(j['value'])
複製代碼
兩種方法各有優缺點,小夥伴兒們能夠自行選擇適合本身的方式。
MySQL 彷佛曆來沒有領用戶失望,也是穩穩的佔據二哥的位置。
而惟一擠進前五的非關係型數據庫則是 MongoDB,在文檔數據庫領域,絕對是大哥大!
咱們再來經過一張散點圖來感覺下不一樣數據庫之間的差距
我這裏又選取了總榜中的前五名,再加上 key-value 數據庫的表明 Redis 和搜索數據庫的表明 ES 來做爲對比對象,先來看看它們在 2019 年的總體走勢
再來看下這七大數據庫今年的增加率
下面咱們再把時間拉長,看看從 2012 年到如今,各大數據庫的表現狀況
接下來再根據不一樣的數據庫類型,來分別查看下各類類型數據庫的流行趨勢
對於關係型數據庫,榜首四強實在太強
再來看看 k-v 數據庫,毫無疑問,近些年 Redis 風光無限,佔據了大部分的市場份額。
如今進入到文檔數據庫時間,毫無疑問 MongoDB 的地位無可動搖
而 亞馬遜的 Amazon DynamoDB 數據庫憑藉着雲服務的興趣,也成功佔有一席之地
從歷年流行度走勢圖種能夠看出,MongoDB 在持續增加的路上,一騎絕塵了。而 Amazon DynamoDB 數據庫則從 2017 年開始慢慢佔據市場份額,拉開與其餘文檔數據庫的差距。
時序數據庫也有一個霸主,那就是 InfluxDB,不過總體來講,各方勢力實力均衡!
下面咱們再來看看圖數據庫,它在知識圖譜領域是當仁不讓的首選數據庫類型,尤爲是 Neo4j,就算你沒有使用過,怎麼也據說過它的大名吧!
再來看看近些年的流行度走勢呢
最後咱們再來看看搜索數據庫的狀況
那麼再來看看歷年的流行走勢呢
不過不管是 ES 的耀眼光芒仍是 Splunk 的新貴登基,能夠預見的是在將來的很長一段時間裏,搜索數據庫領域仍然會是它們的三足鼎立!
END!