接上篇:安居客scrapy房產信息爬取到數據可視化(下)-可視化代碼,可視化的實現~html
本人以前都是習慣把爬到的數據保存到本地json文件,python
此次保存到數據庫後發現使用mongodb的聚合統計省去了好多本身用python寫計算邏輯的步驟,好方便啊~~mongodb
#encoding:utf-8 import random from pyecharts import Bar from pymongo import MongoClient conn = MongoClient('127.0.0.1',27017) #建立於MongoDB的鏈接 db = conn.anjuke #選擇數據庫 collection=db.AnjukeItem #選擇數據庫下的集合 all = [] res = collection.aggregate([ {'$group':{'_id':'$city', 'count':{'$sum':1}}}, {'$sort':{'count':-1}},]) conn.close() #上面是mongodb聚合統計的語句 #$group:按照給定表達式組合結果,這裏的_id字段表示你要基於哪一個字段來進行分組,這裏的$city就表示要基於city字段來進行分組 #下面的count字段的值$sum: 1表示的是獲取--知足city字段相同的這一組的數量--乘之後面給定的值(本例爲1,那麼就是同組的數量)。 #$sort:按照給定的字段排序結果,即按計算好的count排序,-1爲降序來排列 for i in res: #print(i) #{'_id': '成都', 'count': 2074} all.append((i['_id'].strip(),i['count'])) attr = [i[0] for i in all[:30] ] #取前三十城市的名字 v1 = [i[1] for i in all[:30]] #取前三十城市的值 print(attr) bar = Bar('新房分佈柱狀圖') #柱狀圖 bar.add('各城市新樓盤數',attr,v1,is_label_show=True,is_datazoom_show=True,xaxis_rotate=65, label_color=['#87CEEB',]) #attr 下面的城市名 #v1 數值 #is_label_show -> bool 是否正常顯示標籤,默認不顯示。即各柱上的數字 #is_datazoom_show -> bool 是否使用區域縮放組件,默認爲 False #xaxis_rotate -> int x 軸刻度標籤旋轉的角度,默認爲 0,即不旋轉。旋轉的角度從 -90 度到 90 度。 #label_color 柱的顏色 bar.render('bar.html') #html生成
#encoding:utf-8 from pymongo import MongoClient from pyecharts import Bar conn = MongoClient('127.0.0.1',27017) db = conn.anjuke collection=db.AnjukeItem res = collection.find() conn.close() #鏈接mongodb的邏輯,同上~ all = {} for i in res: city = i['city'] #獲取城市名 try: if i['price'][1].isdecimal(): #判斷i['price'][1]是否是數字型的價格 price_type = i['price'][0] #獲取價格類型 price = i['price'][1] price = int(price) #str價格轉int價格 elif i['price'][2].isdecimal(): #判斷i['price'][2]是否是數字型的價格 price_type = i['price'][1] #獲取價格類型 price = i['price'][2] price = int(price) #str價格轉int價格 except: continue if '均價' in price_type: #只取均價 if city in all: all[city].append(price) else: all[city] = [price,] print(all) #{'_id': '黑河', 'count': 17} #{'_id': '甘南', 'count': 17} #{'_id': '隴南', 'count': 16} all_avg = [] for city,prices in all.items(): all_avg.append((city,sum(prices)/len(prices))) #計算全部的城市房價平均值,all_avg裏的元素爲元組(城市名,均價) all_avg = sorted(all_avg,key=lambda x:x[1],reverse=True) #降序排序 print(all_avg) #[('深圳', 59192.21692307692), ('上海', 50811.7504091653), ... attr = [i[0] for i in all_avg[:30] ] #獲取前30城市名 v1 = ['{:.1f}'.format(i[1]) for i in all_avg[:30]] #獲取前30名的值 bar = Bar('各城市房價平均值') bar.add('單位面積價格(元/平米)',attr,v1,is_label_show=True,is_datazoom_show=True) #畫圖邏輯,同上 bar.render('bar2.html')
from pyecharts import Pie from pymongo import MongoClient conn = MongoClient('127.0.0.1',27017) db = conn.anjuke collection=db.AnjukeItem #Mongodb的鏈接 all = [] res = collection.aggregate( [ { '$unwind': '$type_' },{ '$group': { '_id': '$type_', 'count': {'$sum': 1} } } ] ) #上面是mongodb聚合統計的語句 #'$unwind': '$type_'由於type_是一個列表這裏是將type_拆分了,用如下面的計算 #$group:按照給定表達式組合結果,這裏的_id字段表示你要基於哪一個字段來進行分組,這裏的$type_就表示要基於type_字段來進行分組 #下面的count字段的值$sum: 1表示的是獲取--知足type_字段相同的這一組的數量--乘之後面給定的值(本例爲1,那麼就是同組的數量)。 conn.close() all = [] for i in res: print(i) #{'_id': '商業', 'count': 337} #{'_id': '商辦', 'count': 158} #{'_id': '8室', 'count': 76} if '室' in i['_id']: #只取有'室'關鍵字的數據 all.append((i['_id'],i['count'])) all = sorted(all,key=lambda x:x[1],reverse=True) #以數量進行排序 print(all) attr = [i[0] for i in all][:6] #取前六的類型名 v1 = [i[1] for i in all][:6] #取前六的數值 pie =Pie("戶型比例", title_pos='center', width=900) #pie.add("商品A", attr, v1, center=[25, 50], is_random=True, radius=[30, 75], rosetype='radius') pie.add("商品B", attr, v1, is_random=True, radius=[30, 75], rosetype='area', is_legend_show=False, is_label_show=True) #is_random爲是否隨即排列顏色列表 #radius爲半徑,第一個爲內半徑,第二個是外半徑; #rosetype爲是否展現成南丁格爾圖( 'radius' 圓心角展示數據半分比,半徑展示數據大小;'area' 圓心角相同,爲經過半徑展示數據大小) #is_label_show爲是否顯示標籤(各個屬性的數據信息) #is_legend_show:是否顯示圖例 pie.render('pie.html')
#coding=utf-8 from pymongo import MongoClient from pyecharts import Geo import json conn = MongoClient('127.0.0.1',27017) db = conn.anjuke collection=db.AnjukeItem #res=collection.distinct("city") all = [] res = collection.aggregate([ {'$group':{'_id':'$city', 'count':{'$sum':1}}}, {'$sort':{'count':-1}},]) for i in res: all.append((i['_id'].strip(),i['count'])) conn.close() #鏈接查詢,和圖一同樣 new_all =[] with open('city_coordinates.json','r',encoding='utf-8') as f: #這裏是複製到pyecharts的地理json數據和爬到的城市名對比,由於好多爬到的城市其實在pyecharts是沒有記錄的,直接繪圖會報錯 #位置在\Python36\Lib\site-packages\pyecharts\datasets\city_coordinates.json all_city = json.loads(f.read(),encoding='utf-8') for i in all: if i[0] in all_city: new_all.append(i) geo = Geo( "全國新房分佈", #圖標題 "", #副標題 title_color="#fff", #標題顏色 title_pos="center", #標題位置 width=1200, #圖寬 height=600, #高 background_color="#404a59", #背景顏色 ) attr, value = geo.cast(new_all) #分開城市名和數值 geo.add( "", attr, value, visual_range=[100, 1200], #顯示的數值範圍 visual_text_color="#fff", #鼠標放上去後顯示的文字顏色 symbol_size=15, #標記的大小 type='heatmap', #類型爲熱力圖 is_visualmap=True, ) geo.render()
End...數據庫