基於flask框架展示數據可視化的一次嘗試

第一部分:數據的獲取—爬蟲

1.爬取目標:北京地區二手房房價:https://bj.5i5j.com/ershoufang/;

2.需要用到的模塊:requests,re,random,time,csv,pandas.

3.開發環境vs2017,使用語言python,版本3.6.

4.開發流程

1) 對目標網站的反扒進行試探,識別其反扒機制。(爬取網站是要看一下網站的robots協議,不要爬取網站禁止爬取的內容,否則會面臨被起訴的危險)

1.首先在瀏覽器內啟動web開發者查看器。進入網絡欄,點擊XHR,刷新頁面,查看是否有ajax請求。如圖所示並未出現ajax請求:

基於flask框架展示數據可視化的一次嘗試

2.進入交互式環境,查看爬取網站是否存在需要模擬瀏覽器,或者模擬登錄的情況。

如圖所示此網站反扒機制較為容易:

基於flask框架展示數據可視化的一次嘗試

2).設計爬蟲大體的功能實現:

  1. get_text()函數獲取爬取網站的html源代碼,這裡應該考慮使用requests獲取響應出現異常的情況。在後續的爬取過程中出現了ip禁封的情況,在這裡,有兩種方法可以解決,1:運用ip代理池(但由於對免費的ip代理網站爬取後試驗時,發現大都不能使用,所以放棄了這一條路線)2:利用隨機數使爬蟲爬取網頁的時候,進行不定時的sleep,來防止ip被封。3:後來看了一些博客,有前輩說,可以建一個headers列表,來隨機使用,從而防止ip被封的情況。(有待嘗試)

  2. 基於flask框架展示數據可視化的一次嘗試

2.get_useful函數利用正則表達式,獲取html中的有效數據。

基於flask框架展示數據可視化的一次嘗試

3.get_next():由於爬取網站需要不同的url,所以應該觀察url的變化,利用函數構造下一個將要爬取的網頁url.

4.數據的存儲,由於要進行可視化處理,所以要對存儲的數據類型做好處理,便於可視化時的文本調用,這裡運用csv模塊,將數據存儲為csv文件。

基於flask框架展示數據可視化的一次嘗試

3)源碼展示

#coding:utf-8

import re

import requests

import random

import time

import sys

import csv

import pandas

def get_text(url):

try:

n = random.uniform(1,2)

time.sleep(n)

headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3381.1 Safari/537.36"}

res = requests.get(url,headers = headers,timeout = 3)

res.raise_for_status()

res.encoding = res.apparent_encoding

return res.text

except:

print("出現異常")

return None

def get_useful(text):

pattern = r'

(\d+).*?.*?

.*?.*?.*?

單價(.*?)元/m²

.*?

.*?

pattern = re.compile(pattern,re.S)

data = re.findall(pattern,text)

return data

def get_next(url):

try:

for i in range(1,101):

url = url + "n" + str(i)

text = get_text(url)

pre_data = get_useful(text)

data = []

for num in pre_data:

num = list(num)

data.append(num)

name = url.split('/')[-2]

filename = r"F:/" +name+ ".csv"

file = open(filename,"a",newline = '')

writer = csv.writer(file,dialect='excel')

writer.writerows(data)

file.close()

data =[]

print("第%d頁已爬取成功"%i)

except:

print("出現異常")

return None

def main():

area = ["tongzhouqu/","changpingqu/","daxingqu/","shunyiqu/","fangshanqu/","beijingzhoubian/"]

for i in area:

url = "https://bj.5i5j.com/ershoufang/"

url = url+str(i)

print("爬取網址:%s"%url)

get_next(url)

if __name__=="__main__":

main()

第二部分:數據可視化—pandas和pygal的使用

可視化之前比較了一下, matplotlib和pygal(雖然pygal也是基於matplotlib的),感覺pygal更加便於使用,而且直接保存為svg的格式,這樣可以讓用flask時導入圖片更加方便,減少了我自己寫html的工作量。

可視化較為簡單,所以這裡就不詳細介紹了。貼一段代碼;

import pygal

import pandas as pd

#設置全北京的數據列表

all_zj = []

all_dj = []

#朝陽區

file = open(r"F:/chaoyangqu.csv",'r')#打開文件

data = pd.read_csv(file)#讀入csv文件

pre_zj = data.iloc[:,0]#將每棟房子的總價提取

zj = []

for i in pre_zj:

zj.append(i)

all_zj+=zj#存入彙總的列表,用於全北京的可視化處理,下同

pre_dj = data.iloc[:,1]#將每棟房子的每平米單價提取

dj =[]

for i in pre_dj:

dj.append(i)

all_dj+=dj

#總價分析

y_list = [0,0,0,0,0,0,0,0,0,0]

for i in zj:

if i <= 300:

y_list[0]+=1

if i <=400:

y_list[1]+=1

if i <=500:

y_list[2]+=1

if i <=600:

y_list[3]+=1

if i <=700:

y_list[4]+=1

if i <=800:

y_list[5]+=1

if i <=900:

y_list[6]+=1

if i <=1000:

y_list[7]+=1

if i <=1100:

y_list[8]+=1

if i <=1200:

y_list[9]+=1

cyq = pygal.Bar()

cyq.title = "朝陽區二手房數據統計"

cyq.x_labels = [250,350,450,550,650,750,850,950,1050,1150] #X軸數據

cyq.x_title = "房屋總價"

cyq.y_title = "房屋數量"

cyq.add('朝陽區',y_list)

cyq.render_to_file("F:/cyqzj.svg")

#單價分析

dj_max = max(dj)

dj_min = min(dj)

fg = (dj_max-dj_min)/10

x_list = [0,0,0,0,0,0,0,0,0,0]

for i in range(0,10):

x_list[i] += dj_min+fg*i

y_list = [0,0,0,0,0,0,0,0,0,0]

for i in dj:

if i

<= x_list[0]:

y_list[0]+=1

if i <= x_list[1]:

y_list[1]+=1

if i <= x_list[2]:

y_list[2]+=1

if i <= x_list[3]:

y_list[3]+=1

if i <= x_list[4]:

y_list[4]+=1

if i <= x_list[5]:

y_list[5]+=1

if i <= x_list[6]:

y_list[6]+=1

if i <= x_list[7]:

y_list[7]+=1

if i <= x_list[8]:

y_list[8]+=1

if i <= dj_max:

y_list[9]+=1

cyq = pygal.Bar()

cyq.title = "朝陽區二手房每平米單價數據統計"

cyq.x_labels = x_list#X軸數據

cyq.x_title = "房屋每平米單價"

cyq.y_title = "數量"

cyq.add('朝陽區',y_list)

cyq.render_to_file("F:/cyqdj.svg")#存儲為svg文件

基於flask框架展示數據可視化的一次嘗試

第三部分:flask框架的使用

1.由於前兩部分皆在windows環境下開發,但我在烏班圖環境下使用flask框架,需要一個方式,將我做完的svg圖片傳入烏班圖,可以在虛擬機可主機之間創建一個共享文件夾,以便文件的傳輸。

具體方法:

下載Vmware Tool文件,在根目錄創建文件夾VmwareTool,將其解壓在此目錄下,然後關機,在虛擬機設置裡找到共享文件夾,進行設置即可。

2.Falsk框架目錄結構:

基於flask框架展示數據可視化的一次嘗試

1.falsk框架的大體結構

1) 主文件

基於flask框架展示數據可視化的一次嘗試

這裡利用route()裝飾器來設置路由,其中第一個返回可以個html文檔,第二個返回了一個svg圖像。

2)

基於flask框架展示數據可視化的一次嘗試

由於使用的是虛擬機,所以寫完的flask框架只能夠本地訪問,但可以改變虛擬機的網絡聯接方式(將net連接改為自定義橋接),從而實現校園網內可以自由訪問,並且需要設置靜態ip,使程序不用連一次網,就要改一次host.

3.)templates目錄下存放著使用jinjia2模版引擎寫的html文件,在主文件中可以使用render_template()進行調用。

4)static目錄下存放了css文件和網頁背景等一些靜態文件。

5)效果圖:

基於flask框架展示數據可視化的一次嘗試


分享到:


相關文章: