利用Python爬虫和Tableau分析链家网二手房信息

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. 外围小区的房价较低,且住户多年轻人,刚需或置换意愿较强。

猜你喜欢

转载自blog.csdn.net/zjlamp/article/details/81506426
今日推荐