七城市房价统计

在链家网上爬取北京、上海、广州、深圳、天津、青岛的房价,绘制热力图、箱线图。

首先爬取房价信息。

from urllib import request
from bs4 import BeautifulSoup as bs
import re
import pandas as pd


temp0 = []
temp0 = {"price": temp0}
df = pd.DataFrame(temp0)  #建立空dataframe用来后续存储数据

region = "hz"        #地名简写
pages = 73           #链家网的房价页数

for i in range(1, pages+1):
    res = request.urlopen('https://' + region +'.fang.lianjia.com/loupan/pg' + str(i) + '/')
    html_data = res.read().decode('utf-8')
    Soup = bs(html_data, 'html.parser')
    print(i, "/", pages)  #观察进度

    p1 = Soup.find_all('div', class_="main-price")  # 找到价格标签,class后面要加下划线
    price_str = str(p1)
    pattern = re.compile(r'.+\s.+元')  #有些房子是按套卖,排除这些房子,只找按平米卖的房子
    temp = re.findall(pattern, price_str)
    temp2 = "".join(temp) #将list转为str
    pattern2 = re.compile(r'\d{5,6}')  #找出房价数据
    price = re.findall(pattern2, temp2)
    dic_price = {"price": price}
    df_temp = pd.DataFrame(dic_price)
    df = pd.concat([df, df_temp], axis=0, ignore_index=True)  #按行合并两个dataframe

region = region.upper()
file_name = region + "HousePrice.csv"
df.to_csv(file_name)

热力图使用folium包绘制使用pip安装folium

pip3 install folium

导入需要的包

import pandas as pd
import numpy as np
import folium
import webbrowser
from folium.plugins import HeatMap
import matplotlib.pyplot as plt

整理爬取的房价数据,并平均值,画出箱线图。

df.columns = (["Beijing", "Shanghai", "Guangzhou", "Shenzhen", "Tianjin", "Qingdao", "Hangzhou"])
df.boxplot()
plt.show()

df.columns = (["北京市", "上海市", "广州市", "深圳市", "天津市", "青岛市", "杭州市"])  #设置列名
mean_price = df.mean()                                                         #求每列平均值
mean_price = pd.DataFrame(mean_price, columns=["price"])                       #将求出的平均值存为dataframe并设置列名

下载中国城市的经纬度信息点击打开链接,保存为csv。

cities = pd.read_csv("Cities.csv", sep=",")
cities = cities[["cities", "lon", "lat"]]
cities.set_index("cities", inplace=True)                #修改index方便后面检索

将城市经纬度信息与房价均值放在一个dataframe中。

my_cities = pd.DataFrame(columns=["lon", "lat"])        #新建空dataframe保存城市经纬度和房价数据
for i in mean_price.index:
    new_position = []
    lat = cities["lat"][i]      #获取纬度值
    lon = cities["lon"][i]      #获取精度值
    new_position.append(lat)
    new_position.append(lon)
    my_cities.loc[i] = new_position

my_cities = pd.concat([my_cities, mean_price], axis=1)    #将经纬度与房价均价合并在一个dataframe
my_cities.to_csv("mean_price.csv", encoding="utf_8_sig")  #加上encoding="utf_8_sig"解决中文乱码问题

绘制热力图

lst = np.array(my_cities).tolist()                 #转化dataframe为list,为后面画热力图用,先转成ndarray,在用tolist()
map_osm = folium.Map(location=[35,110],zoom_start=5)    #绘制Map,开始缩放程度是5倍
HeatMap(lst).add_to(map_osm)  # 将热力图添加到前面建立的map里

file_path = r"house_price.html"
map_osm.save(file_path)     # 保存为html文件

webbrowser.open(file_path)  # 默认浏览器打开

猜你喜欢

转载自blog.csdn.net/qq_41816368/article/details/80791598