北上广深租房信息的爬取和分析

本文通过爬取链家租房网站的租房信息,对北上广深一线城市的租房信息进行分析。

以下是本篇的思维导图

数据爬取

准备工作:安装mongdb数据库,爬取到的数据将保存在mongdb数据库

1.首先找到爬取数据的路口

进入链家网的租房网站可以发现规律提取传参
https://m.lianjia.com/chuzu/sh/zufang/xujiahui
规律提取如下:
https://m.lianjia.com/chuzu/{}/zufang/{} 其中第一个花括号里面是传入城市的缩写如:上海-sh,广州-gz,北京-bj,深圳-sz,第二个括号里面传入区域例如上海的徐汇区-xuhui

后面发现如果按照区域爬取每区最多只能获得2000条数据,后来解决的办法是先爬取各区的商圈,最终以各区商圈来爬数据,那么商圈怎么爬取

可以在网页中查看代码信息发现商圈被写在data-key后面,这样用正则表达式re.findall()就可以获取商圈
“data-type="bizcircle" data-key="(.*)" class="oneline ">”

2.找到api数据接口

1
url = 'https://app.api.lianjia.com/Rentplat/v1/house/list?city_id={}&condition={}/rt{}&limit=30&offset={}&request_ts={}&scene=list'.format(info[0], bc_name,type_code, idx*30, int(time.time()))

通过分析网页可以找到上面的api数据接口,其中
info[0]:110000(北京),310000(上海),440100(广州),440300(深圳)
bc_name:上面爬下来的商圈
type_code:(整租)200600000001、(合租)200600000002
idx:爬取的页数
time.time():当前时间戳

爬取到什么时候停止?当一页返回的条数小于30时,我们判断爬取完成。返回的条数在上面爬取上面链接中的数据里会有一个total,对应存的就是当页的条数

后面会用到经纬度制作租房地点的热力图,所以还需爬取经纬度信息。经纬度信息包含在上面返回的m_url网页中,还需要再爬取m_url一层,到这里数据爬取的分析工作基本完成

3.数据保存

将上面爬取到的数据保存在mongodb中,拿到mongodb连接对象,新建一个表,伪代码如下:

1
2
3
4
5
6
7
 host = os.environ.get('MONGODB_HOST', '127.0.0.1')  # 本地数据库
port = os.environ.get('MONGODB_PORT', '27017') # 数据库端口
mongo_url = 'mongodb://{}:{}'.format(host, port)
mongo_db = os.environ.get('MONGODB_DATABASE', 'Lianjia')
client = MongoClient(mongo_url)
self.db = client[mongo_db]
self.db['zufang'].create_index('m_url', unique=True) # 以m端链接为主键进行去重

将需要存储的字段封装在item这个字典里,以upsert的方式更新在表里即可。

1
self.db['zufang'].update_one({'m_url': item['m_url']}, {'$set': item}, upsert=True)

数据清理

数据清理的步骤一般包括

  • 去除不需要的数据
  • 去除/补全缺失数据
  • 去除/修改格式和内容错误的数据
  • 去除/修改逻辑错误的数据

去除不需要的数据:删除_id

1
2
3
# 数据清洗
# 1. 去掉“_id”列
del data['_id']

一般DataFrame会自动生成_id作为唯一标识,里面是随机生成的一串字符串
去除/补全缺失数据:将None值用numpy.nan填充

1
2
3
4
5
6
7
8
9
10
11
12
13
# 'distance', 'latitude', 'longitude'因为有None,需另外处理
def None_distance(data):
if data is None:
return np.nan
else:int(data)

def None_latlon(data):
if data is None or data=='':
return np.nan
else:return float(data)
data['distance'] = data['distance'].apply(None_distance)
data['latitude'] = data['latitude'].apply(None_latlon)
data['longitude'] = data['longitude'].apply(None_latlon)

去除/修改格式和内容错误的数据

  • 在房屋大小的一列中,包含-,一个范围区间,同样的租金范围那一列里也有,这里将取左边右边两值得平均值.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 5. rent_area观察excel里的样例数据发现 有的是个范围带有'-‘
    def get_aver(data):
    if isinstance(data,str) and '-' in data:
    low,high = data.split('-')
    return (int(low)+int(high))/2
    else:
    return int(data)

    data['rent_area'] = data['rent_area'].apply(get_aver)
  • 数据类型转换
    1
    2
    3
    # 数据类型转换
    for i in ['bathroom_num','bedroom_num','hall_num','rent_price_listing']:
    data[i] = data[i].astype(int)
    去除/修改逻辑错误的数据:
    房间小于5平
    卫生间异常多的数据
    卧室异常多的数据

数据分析

1.各城市的租房分布怎么样?

看看北上广深房源都在哪个区域分布多,哪个区域少,首先来看看北京


北京的租房房源一共有19068条,可以看到北京的房源主要集中在2环到四环内,其中朝阳区的房源最多,几乎占到北京所有房源的1/3,丰台、海淀次之。



上海房源数据一共有26115条,浦东占到快7000条,比例接近1/4,在偏远地区金山崇明基本看不到房源。



广州的房源在四个城市中是最多的,一共有40022条。主要集中在天河、白云、番禺、增城以及珠海地区。其中天河、白云、番禺均超过7000条。

深圳的房源共21638条,主要还是分布在南山区、龙岗区、宝安区以及福田区,龙华区。

2.城市各区域的租金分布怎么样


由图,北京每平方米租金top10的商圈,平均在200元左右,最贵的商圈在东单,每平方米要237元,也就是说要在东单住一个20平的房子,一个月需要4770元,组一个70平的房子,需要16590元.

上海每平方米平均租金top10的商区租金要比北京低一点,平均在170左右,其中租金最高的是新天地,租60平的房子需要10610元。


相比较北京和上海而言广州的每平方米租金的top10就更平易近人一点,除了二沙岛、人民北的房租贵一点,其他均在1500以下。

深圳前10的商圈,深圳湾以193元每平方米领先,其次是香蜜湖和福田中心,大体上比上海每平方米少10元左右。

3.房间大小对每平方米租金的影响

北京
北京
上海

广州

深圳

由上面4张图可以知道不管在哪个城市,出租面积在10-20之间的房子每平方米的租金是最贵的。所以最划算的租房方式是找几个认识的小伙伴一起租大一点的房子。

4.北上广深租房时房客更看重什么?

以下是北上广深四大城市房源最多的3种户型




可见北上广都偏爱2室1厅1卫的房子,而深圳一枝独秀,一室一卫的出租房比较多。整体来看四个城市都是小户型多。
最后根据房屋的标签进行统计,绘制了词云图。

北京租房词云图

上海租房词云图

广州租房词云图

深圳租房词云图

可见北京不集中供暖可能会活不下去,hhhhhhh;
北上广深都看中离地铁近;
广州租房流行独栋公寓;
深圳、广州对租客性别有限制。

想要以上涉及到的源代码可以联系我
邮箱:yuting9597@163.com

参考文章:
公众号:Alfred数据室
北上广深租房图鉴



觉得不错的话,给点打赏吧 ୧(๑•̀⌄•́๑)૭



wechat pay



alipay

北上广深租房信息的爬取和分析
http://yuting0907.github.io/2019/03/23/北上广深租房信息的爬取和分析/
作者
yuting
发布于
2019年3月23日
许可协议