我爬取了三万条深圳租房信息

多少人和你一起找房子?

毕业季,越来越多的同学要租房子了。朋友圈里在深圳找房子的人越来越多,好奇之下,我翻看了深圳市统计局给出的统计年鉴。
从统计结果来看,深圳市目前常住人口中有一多半是非户籍人口。

考虑到有房子的人一定是有户籍的人这一基本共识,(此处逆命题很遗憾的并不成立...) 那么深圳将会有一多半的人,在租房住! 让我们来看一下这几年深圳的非户籍人口统计
从2000年开始就有超过500万非深圳户籍人口在深圳常住。(um...毕竟来了都是深圳人)而且还在逐年增长。

果不其然,不能怪朋友圈找不到合适房子的朋友太矫情,在深圳和这么多人抢房子确实是个大难题。

因为对目前租房市场的情况感到好奇,我爬取了链家网深圳网站的租房信息。获取到三万多条房源信息,其中有很大一部分来自于集体式公寓和职业房东。
接下来我会对爬取的过程和结果做一点分析。

深圳链家网页面解析

爬取思路

链家网的搜索结果只会显示100页,所以我们无法通过直接访问来获取全部房源信息。
所以我们采取了迂回策略:

  • 组合不同搜索条件,获取搜索结果,保证加起来是全部结果
  • 访问不同结果下的所有页面,获取结果列表中的基本信息
  • 访问房源页面,获取全部信息
  • 对数据进行清洗去重

分析搜索条件下的url

我们点击几种搜索条件,并且随便输入一个搜索关键词,点击搜索按钮可以获取网页完整的url。

这里我们对url结构进行分析,前面的协议和域名部分https://sz.lianjia.com/zufang/可以不管
重点看pg2f100500000001l1rs%E5%8D%97%E5%B1%B1/#contentList
其中pg2代表搜索条件的第二页结果,f100500000001代表朝东,l1代表两居室
rs%E5%8D%97%E5%B1%B1是UTF8编码下的搜索关键词“南山区”,后面的#contentList是必须要加的,代表搜索结果界面。

我们在这个页面中也可以看到搜索结果有多少,如果小于3000条,说明这个搜索条件可以使用。我们要做的就是组合不同的搜索条件来达到爬取全部房源的目的。

在这里我采用的是价格和朝向组合的方式。一共使用了7个不同的价格区间,8个不同的朝向。也就是56个搜索条件,一共获取了33427条数据。

分析搜索结果页面

打开网页源代码,我们可以在<div class="content__list--item--main">标签下找到所有搜索结果的页面。

我们可以在这里获取到本页所有搜索结果的房源信息。
因为这个信息远远不够,所以在这个页面我们只取最关键的房源链接和房源页中没有的行政区位置信息就够了。

因为链家网每页结果显示30个房源,所以我们还需要分页查询。通过页面内的已为您找到XXXX套可以计算出总的页面数,通过调整url中的p2字段就可以翻页了。

分析房源页面

拿到房源页面以后,我们可以直接访问这个房源的主页面。

链家的房源链接有两种:

两种页面的结构不尽相同,这里我只会分析租赁类房源

打开房源页面,我们可以看到展示的有房源的基本信息。包括价格,图片,租赁方式,户型,朝向,面积,以及楼层等。在页面下方我们还能看到地图信息,也就是说这个页面内一定包含了经纬度。

打开源代码,找到对应的html标签。这些内容全部都有对应的标签对象,只要结合标签名和最多两个属性就可以准确定位,使用BeautifulSoup工具可以很方便地进行抓取。

爬虫代码构建

思路

  1. 获取所有房源的链接
  • 指定基础搜索条件url,更换关键字段遍历所有条件结果,获取房源总数
  • 通过房源总数计算页面数,遍历每一种条件下的每一个搜索结果页面
  • 将获取到的房源地址,行政区位置信息储存到CSV文件 为了防止单个任务量过大,可以按搜索条件存成不同的CSV文件
  1. 获取房源信息
  • 读取第一步中的CSV文件
  • 遍历所有房源,分析房源页
  • 将获取的结果存入CSV文件
  1. 结果存入数据库
  • 读取第二步中的CSV文件
  • 通过正则表达式等对数据进行进一步清洗
  • 将结果直接MySQL数据库
  • 利用数据库主键对结果进行去重

代码

代码本身以及最终的全部结果CSV文件我已经上传到个人网址和github
直达链接

这里只放部分截图和代码结构

主函数结构

主函数结构
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
from bs4 import BeautifulSoup
import requests
import time
import os
import re
import math
import csv
import pymysql
list_base_url = 'https://sz.lianjia.com'
base_url = 'https://sz.lianjia.com/zufang/pagedirectionrent_price/#contentList'
pattern = re.compile('<div.*?onel'}...
headers = {}...
house_head = {'url': '房源地址', 'district': '行政区', 'position': '位置', }...
rent_price = {'rp1':'1k','rp2':'1.5k','rp3':'2k','rp4':'3k','rp5':'5k','rp6':'8k','rp7':'8k+'}
direction = {'f100500000001':'East','f100500000003':'South',}...
#主函数,如果任务列表文件list.csv不存在,则重新开始,如果已存在,则继续下载
def main():
#初始化爬虫任务,下载搜索条件对应的url和页数
def write_page_url():
#将获取的任务列表存在csv文件
def write_csv_list(result,name = 'sz'):
#如果文件已存在,从文件中读出下载任务列表
def read_from_file(path):
#开始下载
def start(pages):
#输入房源地址获取房源具体信息,返回字典
def get_detail(url):
#输入某页搜索结果,返回该页面所有房源的直接地址,行政位置
def get_list_from_page(url):
#将房源具体信息列表内的字典写入csv文件
def write_csv(result,name = 'sz'):
#获取某查询条件下的页面总数,用于迭代页面
def get_total_page(url):
#将房源页面信息汇总,存放在字典中,组成list返回
def get_page_numbers():
#获取单个搜索条件下,第page页的url
def get_page_url(url,page):

房源信息CSV文件

MySQL表结构

数据分析于可视化

这里主要用到的是由百度提供的开源工具Pyechart
具体的使用我打算另外写一篇文章。
所以这部分就暂时跳过了

分析结果

首先是深圳所有房源的分布热力图,因为新加了大鹏新区,整个地图看着有点怪怪的。

可以看到深圳的主要房源分布还是很有规律的,放大一点可以看到房源主要集中在宝安区西乡,南山高新园,福田大部分地区,罗湖口岸地区,西丽以及龙岗地区(华为新园区功不可没)
合租房的分布基本于所有房源的热力图相同。也就是说合租和整租在地理位置上并没有明显区别。
按行政区来看,这个房源分布层次就很明显了。南山福田龙岗作为第一梯队占据了大部分的租房资源。如果想看房子的话,这三个区可以提供更多的选择。
在租房源户型TOP10,两室一厅和一室一厅受到大部分人的青睐。但是这个数据也需要联系深圳住房建造情况进行对比。
房源价格总体上是正态分布
房源来源可以看到,目前我们能看到的房源大部分来自于商业化的公寓和职业房东。在找房子的时候记得擦亮眼睛

—-未完待续

--------------------- ----------------------