1. 程式人生 > >利用Python爬蟲和Tableau分析鏈家網二手房資訊

利用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. 外圍小區的房價較低,且住戶多年輕人,剛需或置換意願較強。