自如房源爬取及简单分析——python语言实现

news/2024/7/19 12:27:27 标签: python, 爬虫, 数据分析

背景及任务简介

       自如作为在长租公寓行业的头部公司,目前已覆盖国内一线城市和部分新一线城市,因其在租房间种类丰富,装修美观,有大量的“管家”形成了线上线下闭环,且租户具有极高粘性。本次任务通过python抓取符合要求的房源进行简单分析,本次抓取数据是以北京市某区域的“通勤找房”为例,获取当前工作地骑行35分钟内的全部房源,并使用脚本语言对数据进行获取及处理。



数据获取

  • 业务分析 

在自如主页使用地图找房后,通勤时间筛选条件设置后,发现符合条件的房源有三个区,如下图:

  •  编码及分析

通过分析,了解到数据交互的流程,并获取到其房源的链接,然后开始着手脚本编写。

首先导入需要的第三方库:

python">import urllib.request, urllib.error     
import json
import pandas as pd

from tqdm.notebook import tqdm

import matplotlib.pyplot as plt
import seaborn as sns

定义数据获取函数:

python">def getWebData(url):
    request = urllib.request.Request(url)
    response_json = ""
    try:
        response = urllib.request.urlopen(request)
        response_json = response.read().decode('utf-8')
    except urllib.error.URLError as e:
        if hasattr(e, "code"):
            print(e.code)
        if hasattr(e, "reason"):
            print(e.reason)
    return response_json

获取最大级别的数据:

python">url_01 = 'http://www.ziroom.com/commute/room/count?min_lng=116.080679&max_lng=116.387109&min_lat=39.768225&max_lat=40.054683&clng=116.233894&clat=39.911605&zoom=0&transport=ride&minute=35'
response_json_01 = getWebData(url_01)
data_list_01 = (json.loads(response_json_01))['data']['regions']

# 转换为dataFrame格式
df_01 = pd.DataFrame(data_list_01)
# 查看符合要求的房源信息
df_01.head()

    数据情况如下:

   获取到行政区粒度的数据,需要获取更细粒度数据,但是发现无法通过以上获取数据的building_code进行层级关系的深入,再使用找到的商圈粒度链接进行数据获取:

python">url_02 = 'http://www.ziroom.com/commute/room/count?min_lng=116.235221&max_lng=116.311829&min_lat=39.877173&max_lat=39.948786&clng=116.233894&clat=39.911605&zoom=14&transport=ride&minute=35'
response_json_02 = getWebData(url_02)
data_list_02 = (json.loads(response_json_02))['data']['regions']

# 转换为dataFrame格式
df_02 = pd.DataFrame(data_list_02)
# 查看符合要求的房源信息
print("符合条件房源商圈共 %d 条" % len(df_02))
df_02

    数据情况如下:

符合条件的商圈共14个。

直接获取房间信息:

python">url_residential = 'http://www.ziroom.com/commute/room/list?min_lng=116.069302&max_lng=116.398154&min_lat=39.768125&max_lat=40.054583&clng=116.233728&clat=39.911505&zoom=12&p=1&transport=ride&minute=35'
response_json_residential = getWebData(url_residential)
data_list_residential = (json.loads(response_json_residential))['data']['rooms']

# 转换为dataFrame格式
df_residential = pd.DataFrame(data_list_residential)
# 查看符合要求的房源信息
print("符合条件房源共 %d 条" % len(df_residential))
df_residential

输出信息如下,获取到20条房源信息

20条数据是第一页的房源数据,下面使用循环遍历全部符合条件的房源:

python"># 清空数据,保留表头

df_residential = df_residential.drop(df_residential.index)
df_residential


# 循环获取房源信息
for i in tqdm(range(1,data_pages+1)):
    url_residential = 'http://www.ziroom.com/commute/room/list?min_lng=116.069302&max_lng=116.398154&min_lat=39.768125&max_lat=40.054583&clng=116.233728&clat=39.911505&zoom=12&p='+str(i)+'&transport=ride&minute=35'
    response_json_residential = getWebData(url_residential)
    data_list_residential = (json.loads(response_json_residential))['data']['rooms']
    df_residential_tmp = pd.DataFrame(data_list_residential)
    df_residential = pd.concat([df_residential,df_residential_tmp],ignore_index=True,axis=0)
  

在执行完毕之后,验证数据条数和网站显示的是否一致:

房间的出租方式为按月和按天两种:

查看关注的月租房租金分布:

count     1364.00
mean      3643.68
std       1643.98
min       1790.00
25%       2460.00
50%       2890.00
75%       4790.00
max      11790.00

符合条件的房源中,均价为3643元,最低价格1790元,可见当前房租价格之高!!继续查看房租分布的具体情况:

python">x = df_residential[df_residential['price_unit']=='/月'].price.value_counts().sort_index().index
y = df_residential[df_residential['price_unit']=='/月'].price.value_counts().sort_index().values

plt.scatter(x, y)
plt.show()

符合条件的房间主要集中分布在2k~6k之间,其中2500左右有一个最高峰值,对初阶打工人相对友好。

再查看附近哪些小区在租房源最多,选择排名前20进行展示:

x = df_residential.resblock_name.value_counts().sort_values(ascending=False).index[1:20]
y = df_residential.resblock_name.value_counts().sort_values(ascending=False).values[1:20]

import pylab as mpl     #import matplotlib as mpl

mpl.rcParams['font.sans-serif'] = ['YouYuan']  # 指定默认字体
mpl.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题

# plt.barh(x, y,align='center')
# plt.show()

plt.rcParams['figure.figsize'] = (8, 12)
sns.barplot(x=y, y=x,orient='h') 
plt.title('房源量最多的小区前20') # 纵向展示需要转换x和y的位置
plt.ylabel('小区名称',fontsize=10)
plt.xlabel('房源量')

永乐东区、长安新城、康馨家园三个小区位列前三,最多的永乐东区多达40间在租房源,自如的空置率我们不得而知,但是这些空置房,将极大的拉低自如营收。

再查看每个小区的均价进行租前考察,在这里,对数据进行排序后查看均价最高的小区和最低的5个小区:

python">price_mean = df_residential[df_residential['price_unit']=='/月'].groupby('resblock_name')[['price']].mean()
price_mean = price_mean.sort_values(by='price',ascending=False)
price_mean=price_mean.reset_index()


plt.rcParams['font.size'] = 14
ax = sns.catplot(data=price_mean.head(20),x='resblock_name',y='price', kind='point', linestyles="-", height=8, aspect=2, color='g')
plt.title('房租均价TOP20小区分布')
plt.xticks(rotation=45);


plt.rcParams['font.size'] = 14
ax = sns.catplot(data=price_mean.tail(20),x='resblock_name',y='price', kind='point', linestyles="-", height=8, aspect=2, color='r')
plt.title('房租均价BOTTOM20小区分布')
plt.xticks(rotation=45);

通过对比高价小区和价格最低的二十个小区,在找房时就可以直接排除掉高价小区,极大节省打工人用来找房的时间,至少多出半天的时间用来加班~

最后,查看通勤距离的分布情况,由于距离数据存在其他文字,首先进行处理,新增加distance列保存距离数据:

python">#df_residential['distance'] 
distance_list = []
for i in df_residential.commute_info:
    distance_list.append(i.split(',')[0].replace('距上班地点','').replace('公里',''))

distance_tmp = pd.DataFrame(distance_list, columns=['distance'])
df_residential = pd.concat([df_residential,distance_tmp],axis=1)
count    1476.00
mean        4.32
std         1.76
min         0.80
25%         3.50
50%         4.30
75%         5.70
max         7.00

整体来看,符合条件的房源平均距离工作地4.32公里,最大距离为7公里,可见自如在骑行35分钟内的筛选条件下,默认为7公里。

查看距离通勤点距离与价格的相关性:

python"># 查看距离和价格的关系
plt.figure(figsize=(15,10))
# 将价格单位转化位千 
x= list(df_residential['price']/1000)
y= list(df_residential.distance.astype('float'))
plt.scatter(y, x)
plt.xlabel('价格(k)')
plt.ylabel('距离(km)')

plt.show()

从图中并没有直观看出距离与价格的相关性,为了准确可以进一步进行独立性检验。


http://www.niftyadmin.cn/n/896554.html

相关文章

g.SecurityException: UID 10471 does not have permission to content://包名.fileprovider/***照片名 [user 0]

android的报错提示: java.lang.SecurityException: UID 10471 does not have permission to content://com.example.xch.generateqrcode.fileprovi…

点估计和区间估计——统计学概念

概念简介: 点估计和区间估计是通过样本统计量估计总体参数的两种方法。点估计是在抽样推断中不考虑抽样误差,直接以抽样指标代替全体指标的一种推断方法。因为个别样本的抽样指标不等于全体指标,所以,用抽样指标直接代替全体指标&…

xgboost参数_sklearn之XGBoost(模型保存、样本不均衡、参数)

我是谁?雪拉比模型保存(1)Pickle保存pickle.dump()保存模型,训练完的模型就可以进行保存。内部参数需要用到open函数模型保存在当前目录下导入模型pickle.load,还是需要参数open模型预测结果与存储前模型预测结果将是一…

Android Studio 调用系统相机(超清)和相册的照片并显示在ImageView

一、在“+”号上点击出现的对话框上有两个菜单:1.拍照上传,2.从相册选择 二、1.拍照(前置后置切换),2.相册选择 拍照: 相册选择:

PostgreSQL存储过程(一):概念简介

通用概念介绍: SQL:全称叫结构化查询语言(Structured Query Language),是用来访问关系型数据库一种通用语言,因为语法更接近自然语言所以学习门槛较低。属于非过程化语言,即可以直接通过简单的调用相应语句来直接取得结…

电脑上怎么设置自动按某个键_干货:电脑键盘F1F12的用处太多了

电脑键盘顶排中有F1到F12多个功能按键,由于普通用户平常运用较少,因此很多朋友对电脑键盘F1-F12的功能不太了解,真正知道所有用途可能就没几个人。F1Help1,当我们正处在某个程序中时,需要帮助的情况下,可以…

PostgreSQL存储过程(二):创建函数入门

准备工作——创建用户数据库和模式: 在数据库中新建用来学习的数据库mydb,并在mydb数据库中新增mysc,即my database和my schema的缩写,接下来的示例脚本将在mydb数据库下的mysc模式下创建。脚本如下, -- 1.创建自己的数…

python短视频自动制作_短视频篇 | Python 带你进行短视频二次创作

1目 标 场 景无论是抖音还是快手等视频平台,一旦一个视频火了后,很多 UP 主都会争先抢后去模仿拍摄或剪辑,然后上传到平台,最后都能带来不错的流量。对于一般的短视频,完全可以通过裁剪、特效转场、加入混合图层和字幕…