肥西县2017年至2022年房价可视化

完整代码:https://gitee.com/Ilovesandwich/fx_house_price,实现效果见下


前言

应用Python爬虫、Flask框架、Echarts等技术实现,记录肥西2017-2022年房价的变化,相关新闻以及原因分析


一、爬取房价数据

二、使用步骤

1.引入库

代码如下:

import requests
from bs4 import BeautifulSoup
from numpy import *
import parsel
import random
import time
import csv
import re
from lxml import etree

2.创建文件对象

代码如下 :

f = open('F:/肥西2017-2022年房价.csv', 'w',
         encoding='utf-8-sig', newline="")  # 创建文件对象
csv_write = csv.DictWriter(f, fieldnames=['年份', '月份', '每月价格','均价'])
csv_write.writeheader()  # 写入文件头

在f盘创建一个csv文件用来保存数据,数据分为4列,分别是【‘年份’, ‘月份’, ‘每月价格’,‘均价’】

3. 连接请求

headers = {
    
    
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'
}

x = 2017
z= 0
#源地址
for i in range(2017, 2023):
    print('爬取{}年'.format(i))
    t_url = 'https://www.anjuke.com/fangjia/hf{}/feixixiancheng/'.format(i)
    #print(t_url)
    response = requests.get(url=t_url, headers=headers)
   # print(response)
    html_data = response.text
    tree = etree.HTML(html_data)

设置请求头,爬取每一年的该年数据,语法

{}.format(i)
```![在这里插入图片描述](https://img-blog.csdnimg.cn/6dde99712b4746098fdc3be78bd465f8.png)

每一年的数据爬取成功会设置了一个print用来判断。
![在这里插入图片描述](https://img-blog.csdnimg.cn/31ddca13758e47cc867e4ca738d29c0e.png)
获取网页中的年份
![在这里插入图片描述](https://img-blog.csdnimg.cn/2e1e0d6ada354cac9dd0e0ad2a14f707.png)
```py
 year = tree.xpath("//div[@class='fjlist-box boxstyle2']/h3/text()")

获取网页中的月份

   month = tree.xpath(
        "//div[@class='fjlist-box boxstyle2']//a[@class='nostyle']/b/text()")
    number = [x[5:7] for x in month]
    length = len(number)
    res = 13-length
[x[5:7] for x in month]是为了截取年份,原本的数据是"2022年12月房价"
 res = 13-length是因为某些年份特殊,数据并没有记录12个月全年,有缺失月份

获取网页中的价格,计算均价的代码就简单暴力了,直接转int然后计算平均值

 price = []
    y = 0
    currentprice = tree.xpath(
        "//div[@class='fjlist-box boxstyle2']//a[@class='nostyle']/span/text()")
    #单独提出价格数字
    pricenumber = [x[0:5] for x in currentprice]
    #print(len(currentprice))
    leng = len(currentprice)
    #计算平均价格
    a = 0
    for i in range(0,leng):
        a += int(pricenumber[i])
    #将平均价格放入每年的第一个月的行里,其他数值都是None
    a = round(a/leng, 2)
    for i in range(0,leng):
        if i == 0:
            price.append(a)
        else :
            price.append(None)

最后将数据写入csv文件中

    # 将数据读入csv文件
    #每一年的
    for j in range(0, length):
    
       data_dict = {
    
    '年份': x,  '月份': number[j], '每月价格': currentprice[j],'均价': price[j]}
       csv_write.writerow(data_dict)
    print('第{}年的数据加载完成'.format(x))
    x += 1


print('--------------------------')
print('全部爬取成功!')

完整代码

import requests
from bs4 import BeautifulSoup
from numpy import *
import parsel
import random
import time
import csv
import re
from lxml import etree




#创建文件对象
f = open('F:/肥西2017-2022年房价.csv', 'w',
         encoding='utf-8-sig', newline="")  # 创建文件对象
csv_write = csv.DictWriter(f, fieldnames=['年份', '月份', '每月价格','均价'])
csv_write.writeheader()  # 写入文件头

#设置请求头
headers = {
    
    
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'
}

x = 2017
z= 0
#源地址
for i in range(2017, 2023):
    print('爬取{}年'.format(i))
    t_url = 'https://www.anjuke.com/fangjia/hf{}/feixixiancheng/'.format(i)
    #print(t_url)
    response = requests.get(url=t_url, headers=headers)
   # print(response)
    html_data = response.text
    tree = etree.HTML(html_data)

#年分
    year = tree.xpath("//div[@class='fjlist-box boxstyle2']/h3/text()")
   # print(year[0])

   # print('--------------------------')

#月份
    month = tree.xpath(
        "//div[@class='fjlist-box boxstyle2']//a[@class='nostyle']/b/text()")
    number = [x[5:7] for x in month]
    length = len(number)
    res = 13-length

#价格
    
    price = []
    y = 0
    currentprice = tree.xpath(
        "//div[@class='fjlist-box boxstyle2']//a[@class='nostyle']/span/text()")
    #单独提出价格数字
    pricenumber = [x[0:5] for x in currentprice]
    #print(len(currentprice))
    leng = len(currentprice)
    #计算平均价格
    a = 0
    for i in range(0,leng):
        a += int(pricenumber[i])
    #将平均价格放入每年的第一个月的行里,其他数值都是None
    a = round(a/leng, 2)
    for i in range(0,leng):
        if i == 0:
            price.append(a)
        else :
            price.append(None)
    # 将数据读入csv文件
    #每一年的
    for j in range(0, length):
    
       data_dict = {
    
    '年份': x,  '月份': number[j], '每月价格': currentprice[j],'均价': price[j]}
       csv_write.writerow(data_dict)
    print('第{}年的数据加载完成'.format(x))
    x += 1


print('--------------------------')
print('全部爬取成功!')

在这里插入图片描述

4、将csv文件转sql文件

具体操作找一下相关博客吧,我如果闲了会补充下
在这里插入图片描述

5、初步的pandas画图

import csv
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np


plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['font.family'] = 'sans-serif'
plt.rcParams['axes.unicode_minus'] = False

with open('F:/肥西2017-2022年房价.csv', 'r', encoding='utf-8') as f:
    f_csv = csv.reader(f)
    headers = next(f_csv)

    # for row in f_csv:
    #     print(row)


readData = pd.read_csv("F:/肥西2017-2022年房价.csv", skiprows=0)  # 读取csv数据
#打印
print(readData)
#[64 rows x 3 columns]
xdata = []
ydata = []
xdata = readData.loc[:, '年份']
ydata = readData.loc[:, '均价']
data = readData.iloc[:, 2].tolist()  # 获取dataFrame中的第3列,并将此转换为list
#Data = readData.iloc[0, 1].tolist()
xData = list(range(1, len(data)+1))  # 产生横轴坐标
print('--------------------------------')
print(data)

#画的是年表
plt.plot(xdata, ydata, 'bo-', label=u'', linewidth=1)
plt.title(u"肥西2017-2022年房价", size=10)  # 设置表名为“表名”
plt.legend()
plt.xlabel(u'x轴名:年份', size=20)  # 设置x轴名为“x轴名”
plt.ylabel(u'y轴名:均价', size=10)  # 设置y轴名为“y轴名”
plt.show()

#还应有个月表

最后的结果是在这里插入图片描述
散点图挺丑的,之后是学着用echart重新绘制
在这里插入图片描述

三、echart

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


总结

代码传到了gitee结果不允许开源只能作为私人仓库,可恶。

猜你喜欢

转载自blog.csdn.net/sand_wich/article/details/128972492