Python在数据采集和数据分析领域有非常广泛的应用,房价数据采集与分析是其中比较实用的场景,通过编写简单的脚本就能获取公开的房价信息并完成基础分析,为房产决策提供参考。

房价数据采集实现
采集房价数据首先要确定目标网站,这里以公开的房产信息页面为例,使用requests库发送HTTP请求获取页面内容,再用BeautifulSoup解析页面提取需要的字段。
请求与解析依赖安装
首先需要安装两个核心库,执行以下命令即可:
pip install requests beautifulsoup4
数据采集代码示例
以下代码实现了从目标页面提取小区名称、单价、总价、面积四个核心字段的功能:
import requests
from bs4 import BeautifulSoup
import time
# 目标页面URL,这里使用本地测试地址示例
url = "http://127.0.0.1:8080/house_list"
# 设置请求头模拟浏览器访问
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
}
def fetch_house_data():
try:
# 发送GET请求
response = requests.get(url, headers=headers, timeout=10)
# 设置编码避免乱码
response.encoding = "utf-8"
if response.status_code == 200:
soup = BeautifulSoup(response.text, "html.parser")
# 假设房价信息在class为house-item的div标签中
house_items = soup.find_all("div", class_="house-item")
result = []
for item in house_items:
# 提取小区名称
community = item.find("span", class_="community").text.strip()
# 提取单价,去除单位
unit_price = item.find("span", class_="unit-price").text.strip().replace("元/平", "")
# 提取总价,去除单位
total_price = item.find("span", class_="total-price").text.strip().replace("万", "")
# 提取面积,去除单位
area = item.find("span", class_="area").text.strip().replace("平", "")
result.append({
"community": community,
"unit_price": float(unit_price),
"total_price": float(total_price),
"area": float(area)
})
return result
else:
print(f"请求失败,状态码:{response.status_code}")
return []
except Exception as e:
print(f"采集过程出现异常:{e}")
return []
if __name__ == "__main__":
data = fetch_house_data()
print(f"共采集到{len(data)}条房价数据")
# 简单打印前两条数据
for i in data[:2]:
print(i)
# 避免请求过于频繁
time.sleep(1)
房价数据分析实现
采集到原始数据后,需要使用pandas库对数据进行清洗和分析,先安装pandas库:
pip install pandas
数据清洗与基础统计
以下代码实现了数据转成DataFrame、处理异常值、计算核心统计指标的功能:
import pandas as pd
def analyze_house_data(raw_data):
# 转成DataFrame格式
df = pd.DataFrame(raw_data)
print("原始数据前5行:")
print(df.head())
# 数据清洗:去除单价为0或者总价为0的异常数据
df = df[(df["unit_price"] > 0) & (df["total_price"] > 0)]
print(f"清洗后剩余{len(df)}条有效数据")
# 基础统计:计算单价、总价的均值、中位数、最大值、最小值
print("单价统计指标:")
print(df["unit_price"].describe())
print("总价统计指标:")
print(df["total_price"].describe())
# 按小区分组计算平均单价
community_avg = df.groupby("community")["unit_price"].mean().sort_values(ascending=False)
print("各小区平均单价(降序):")
print(community_avg)
return df
if __name__ == "__main__":
# 假设这里是之前采集到的数据
test_data = [
{"community": "阳光小区", "unit_price": 35000, "total_price": 280, "area": 80},
{"community": "幸福家园", "unit_price": 42000, "total_price": 336, "area": 80},
{"community": "阳光小区", "unit_price": 36000, "total_price": 252, "area": 70},
{"community": "和平小区", "unit_price": 30000, "total_price": 270, "area": 90},
{"community": "幸福家园", "unit_price": 41000, "total_price": 287, "area": 70}
]
analyze_house_data(test_data)
分析结果存储
分析完成后的数据可以存储为CSV文件方便后续使用,代码如下:
def save_analyzed_data(df, file_path="house_analysis_result.csv"):
# 存储为CSV文件,编码设置为utf-8-sig避免中文乱码
df.to_csv(file_path, index=False, encoding="utf-8-sig")
print(f"分析结果已保存到{file_path}")
if __name__ == "__main__":
# 承接上面的分析代码
test_data = [
{"community": "阳光小区", "unit_price": 35000, "total_price": 280, "area": 80},
{"community": "幸福家园", "unit_price": 42000, "total_price": 336, "area": 80},
{"community": "阳光小区", "unit_price": 36000, "total_price": 252, "area": 70},
{"community": "和平小区", "unit_price": 30000, "total_price": 270, "area": 90},
{"community": "幸福家园", "unit_price": 41000, "total_price": 287, "area": 70}
]
df = analyze_house_data(test_data)
save_analyzed_data(df)
注意事项
- 采集数据时要遵守目标网站的robots协议,不要频繁发送请求给服务器造成压力
- 如果目标页面有反爬机制,可以适当增加请求间隔,或者添加代理IP配置
- 分析数据前一定要做清洗工作,避免异常值影响统计结果的准确性
- 公开的房价数据可能存在滞后性,分析结果仅作参考,不能作为实际交易的直接依据