1、明确分析的目标和思路
爬取链家网二手房信息,分析小区房价、买卖活跃度、建筑年代等信息。
分析思路:通过python爬取链家网二手房信息,经过数据清洗、规约等处理后,导入Tableau软件,进行可视化分析,得出结论。
2、爬取链家网二手房信息
以上海市中心城区为分析对象,包括黄浦、徐汇、长宁、静安(包括原静安和闸北)、普陀、虹口、杨浦。
首先,打开链家网,分析网页中的元素,如下图
标号1处是各行政区的小区数量,这个数字可用来控制python生成的小区列表页网址的数量;
标号2处是小区列表页各个小区的链接,可以获取链接的网页地址,进去各个小区的详情页,从而爬取各个小区的信息。
接下来,就可以用python编写爬虫程序了。
(1)导入需要用到的模板
import requests
import re
from bs4 import BeautifulSoup
(2)分析链家网小区页面的URL地址后,可以发现其中的规律,定义area_urls()函数,获取各个行政区小区页面的首页URL地址
def area_urls():
areas = ['xuhui','putuo','yangpu','changning','huangpu','zhabei','hongkou','jingan']
url_base = 'https://sh.lianjia.com/xiaoqu/{}/'
for area in areas:
yield url_base.format(area) #生成器
(3)定义detail_urls()函数,获取所有的小区页面的URL地址,这时标号1处的小区数量就派上用场了
def detail_urls():
for area_url in area_urls():
response = requests.get(area_url)
if response.status_code == 200:
soup1 = BeautifulSoup(response.text, 'lxml')
numlist = soup1.select('body > div.content > div.leftContent > div.resultDes.clear > h2 > span') #获取小区数量
num1 = int(numlist[0].text)
if num1 % 30 == 0:
pages = num1 // 30
else:
pages = num1 // 30 + 1 #获取小区页面的数量
for page in range(1,pages+1):
yield area_url + 'pg' + str(page) #生成所有小区页面的URL地址
(4)定义get_community_info()函数,爬取小区信息(小区名称、地址、房屋总数、建筑年代、小区均价、在售二手房)
def get_community_info(detail_url):
global count
url = requests.get(detail_url)
if url.status_code == 200:
re_set = re.compile('<a class="img" href="(.*?)"')
re_get = re.findall(re_set, url.text)
for community_url in re_get[:-1]:
res = requests.get(community_url)
if res.status_code == 200:
soup = BeautifulSoup(res.text, 'lxml')
names = soup.select('body > div.xiaoquDetailHeader > div > div.detailHeader.fl > h1') #小区名称
adds = soup.select('body > div.xiaoquDetailHeader > div > div.detailHeader.fl > div') #地址
nums = soup.select('body > div.xiaoquOverview > div.xiaoquDescribe.fr > div.xiaoquInfo > div:nth-of-type(7) > span.xiaoquInfoContent') #房屋总数
years = soup.select('body > div.xiaoquOverview > div.xiaoquDescribe.fr > div.xiaoquInfo > div:nth-of-type(1) > span.xiaoquInfoContent') #建筑年代
prices = soup.select('body > div.xiaoquOverview > div.xiaoquDescribe.fr > div.xiaoquPrice.clear > div') #小区均价
onsales = soup.select('body > div.content > div.leftContent > div.resultDes.clear > h2 > span') #在售二手房
最后,把爬取的结果存到Excel文档中。
3、数据处理
(1)根据小区地址字段解析地图经纬度,这里用到软件XGeocoding,工作界面如下:
结果输出如下,P、Q列即为纬度和精度。
(2)绘制各区的多边形地图的坐标点,用到软件Draw Tool for Tableau,界面如下:
结果输出如下:
这样就可以在Tableau地图上绘制多边形地图了。
(3)数据规约
买卖活跃度 = 在售二手房 / 房屋总数
建筑年代根据“5年以内”,“10年以内”,“15年以内”,“20年以内”,“20年以上”分为五类,分别评分100/80/60/40/20。
区域人口稠密程度 = 面积 / 人口数(百度可知)
最终处理好的数据如下所示:
4、数据可视化
(1)分析各区域的人口稠密程度
根据多边形地图颜色的深浅可知,长宁区的人口稠密程度最高,虹口区最低。
(2)分析小区房龄的分布情况
如图所示:
a. 上海市中心城区的小区房龄大部分在20年以上;
b. 越往外围扩散,房龄小的房子越多。
(3)分析小区均价的分布情况
如图所示:
a. 均价高的小区多集中在内环,越往外围扩散,均价越低;
b. 由于黄浦区基本都处于中心区域,所以均价高的小区数最多;杨浦区和普陀区的位置相对较偏,所以均价相对低的小区居多。
(4)分析小区的买卖活跃度
如图所示,基本与小区房龄的分析图如出一辙,上海市中心城区的小区买卖活跃度相对外围小区偏低。
原因分析如下:
a. 中心城区房价偏高,且住户多本地老人,换房意愿不强;
b. 外围小区的房价较低,且住户多年轻人,刚需或置换意愿较强。