优秀的编程知识分享平台

网站首页 > 技术文章 正文

基于flask框架展示数据可视化的一次尝试

nanyue 2024-10-15 11:34:43 技术文章 3 ℃

第一部分:数据的获取—爬虫

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请求:

2.进入交互式环境,查看爬取网站是否存在需要模拟浏览器,或者模拟登录的情况。

如图所示此网站反扒机制较为容易:

2).设计爬虫大体的功能实现:

  1. get_text()函数获取爬取网站的html源代码,这里应该考虑使用requests获取响应出现异常的情况。在后续的爬取过程中出现了ip禁封的情况,在这里,有两种方法可以解决,1:运用ip代理池(但由于对免费的ip代理网站爬取后试验时,发现大都不能使用,所以放弃了这一条路线)2:利用随机数使爬虫爬取网页的时候,进行不定时的sleep,来防止ip被封。3:后来看了一些博客,有前辈说,可以建一个headers列表,来随机使用,从而防止ip被封的情况。(有待尝试)

2.get_useful函数利用正则表达式,获取html中的有效数据。

3.get_next():由于爬取网站需要不同的url,所以应该观察url的变化,利用函数构造下一个将要爬取的网页url.

4.数据的存储,由于要进行可视化处理,所以要对存储的数据类型做好处理,便于可视化时的文本调用,这里运用csv模块,将数据存储为csv文件。

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'<div>.*?<strong>(\d+)</strong>.*?</p>.*?<p>单价(.*?)元/m2</p>.*? </div>'

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框架的使用

1.由于前两部分皆在windows环境下开发,但我在乌班图环境下使用flask框架,需要一个方式,将我做完的svg图片传入乌班图,可以在虚拟机可主机之间创建一个共享文件夹,以便文件的传输。

具体方法:

下载Vmware Tool文件,在根目录创建文件夹VmwareTool,将其解压在此目录下,然后关机,在虚拟机设置里找到共享文件夹,进行设置即可。

2.Falsk框架目录结构:

1.falsk框架的大体结构

1) 主文件

这里利用route()装饰器来设置路由,其中第一个返回可以个html文档,第二个返回了一个svg图像。

2)

由于使用的是虚拟机,所以写完的flask框架只能够本地访问,但可以改变虚拟机的网络联接方式(将net连接改为自定义桥接),从而实现校园网内可以自由访问,并且需要设置静态ip,使程序不用连一次网,就要改一次host.

3.)templates目录下存放着使用jinjia2模版引擎写的html文件,在主文件中可以使用render_template()进行调用。

4)static目录下存放了css文件和网页背景等一些静态文件。

5)效果图:

最近发表
标签列表