Python爬蟲 —3000+條北京二手房數據可視化分析


哈嘍,我是小張,大家好久不見啊~

最近呢,對鏈家平台上的北京二手房數據做了個可視化分析,對目前北京的二手房交易情況有了個大致了解,最終得到一個很實在的結論:奮斗一輩子也買不到一個廁所這句話不是騙人的,是真的;關於具體分析內容客官請看下文

1,工具說明

本文用到的 Python 庫有

pandas
re
requests
json
pyecharts
folium
random
stylecloud
jieba
pyquery
fake_useragent
time

外加 百度地圖 API

2,數據采集

所有數據來源於鏈家二手房交易平台,上面每頁排列 30 條二手房數據,本文采集了前 100 頁 數據,每條二手房交易數據中提取 標題、單價、價格、地址、年份、房間樣式 等字段作為可視化分析的數據來源

s

網站沒有設置很強的反爬機制, 爬取時用的是 requests + Cookies+ PyQuery 組合即可,最好在爬取時加條 time.sleep() 命令,隔幾秒休眠一次,代碼如下:

import requests
from pyquery import PyQuery as pq
from fake_useragent import UserAgent
import time
import random
import pandas as pd


UA = UserAgent()
headers = {
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
'Cookie': '你的Cookie',
'Host': 'bj.lianjia.com',
'Referer': 'https://bj.lianjia.com/ershoufang/',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36',
}
num_page = 2
class Lianjia_Crawer:
    def __init__(self,txt_path):
        super(Lianjia_Crawer,self).__init__()
        self.file = str(txt_path)
        self.df = pd.DataFrame(columns = ['title','community','citydirct','houseinfo','dateinfo','taglist','totalprice','unitprice'])


    def run(self):
        '''啟動腳本'''
        for i in range(100):
            url = "https://bj.lianjia.com/ershoufang/pg{}/".format(str(i))
            self.parse_url(url)
            time.sleep(random.randint(2,5))
            print('正在爬取的 url 為 {}'.format(url))
        print('爬取完畢!!!!!!!!!!!!!!')
        self.df.to_csv(self.file,encoding='utf-8')
    def parse_url(self,url):

        headers['User-Agent'] = UA.chrome
        res = requests.get(url, headers=headers)
        doc = pq(res.text)
        for i in doc('.clear.LOGCLICKDATA .info.clear'):
            try:
                pq_i = pq(i)
                title = pq_i('.title').text().replace('必看好房', '')
                Community = pq_i('.flood .positionInfo a').text()

                HouseInfo = pq_i('.address .houseInfo').text()
                DateInfo = pq_i('.followInfo').text()
                TagList = pq_i('.tag').text()
                TotalPrice = pq_i('.priceInfo .totalPrice').text()
                UnitPrice = pq_i('.priceInfo .unitPrice').text()
                CityDirct = str(Community).split(' ')[-1]
                Community = str(Community).split(' ')[0]
                data_dict ={
                    'title':title,
                               'community':Community,
                               'citydirct':CityDirct,
                               'houseinfo':HouseInfo,
                               'dateinfo':DateInfo,
                               'taglist':TagList,
                               'totalprice':TotalPrice,
                    'unitprice':UnitPrice
                }
                print(Community,CityDirct)
                self.df = self.df.append(data_dict,ignore_index=True)
                #self.file.write(','.join([title, Community, CityDirct, HouseInfo, DateInfo, TagList, TotalPrice, UnitPrice]))
                print([title, Community, CityDirct, HouseInfo, DateInfo, TagList, TotalPrice, UnitPrice])
            except Exception as e:
                print(e)
                print("索引提取失敗,請重試!!!!!!!!!!!!!")



if __name__ =="__main__":
    txt_path = "ershoufang_lianjia.csv"
    Crawer = Lianjia_Crawer(txt_path)
    Crawer.run() # 啟動爬蟲腳本

最終一共采集到 3000 條數據:

image-20210303001131288

3,地址經緯度坐標轉換

獲取到的數據是地址是字符串形式(例如梵谷水郡*酒仙橋),后面地圖位置標記時需要經緯度數據,需要把所有地址轉化為經緯度坐標,這里借助了百度地圖 API 完成這步操作

3.1 百度地圖 AK 申請

API 的使用需要在 百度地圖開放平台 申請一個 AK 效驗碼,網址:https://lbsyun.baidu.com/apiconsole/center#/home,登錄自己的百度賬號,在控制台創建一個應用,

控制台面板-> 我的應用-> 創建應用

image-20210303002409666

其他參數默認,應用名稱自定義命名即可,IP 白名單填入 0.0.0.0/0,點擊提交

image-20210303002603013

以上步驟操作完之后,控制台面板會多出一個應用,就是剛剛我們建立的,

image-20210303002750852

3.2 地址經緯度坐標轉換

獲取到你的 AK 參數之后,把 AK 和 address(中文地址) 作為參數傳入下面函數中,就能獲取到對應的經緯度坐標

def get_location(address,AK):
    #根據地址轉化為經緯度
    try:
        url = 'http://api.map.baidu.com/geocoding/v3/?address={}&output=json&ak={}&callback=showLocation'.format(address,AK)
        res_test = requests.get(url).text
        res = re.search('\((.*?)\)', res_test).group(0).strip('(').strip(')')
        lng = json.loads(res)['result']['location']['lng']
        lat = json.loads(res)['result']['location']['lat']
        print(lng, lat)
        return lng, lat
    except Exception as e:
        print('error ---------\n')
        return None

百度地圖 API 的 地址經緯度轉換 功能 定位不僅僅局限於省、市,還能定位到門牌號,只要你提供的地址越詳細,獲取的經緯度信息越准確

image-20210303003638193

4,可視化分析

這一部分進入可視化分析內容,城市畢竟是北京么所以首要的就是關注房價問題,在抓取的數據中,最高的將近19萬+/每平方,最低的僅有 1.5 萬/每平方

image-20210303004058082

我看到 1.5 萬每平方就不淡定了,這數據肯定有貓膩(北京房價按常理不可能這么低);為了驗證想法,首先做了房產地段標記(經緯度地圖標記借助百度地圖地址 相關 Demo )

先看一下排名前十的:

image-20210303005302868

image-20210303005802821

上面是房價最高 Top10 的地段位置,看起來地理位置還行,都是在三環四環之內、分布在市中心附件,如果單看這張圖的地圖的話得不到有用的信息,可以對比一下 房價最低 Top10

下面是排名倒數前十的

image-20210303010210384

image-20210303010245990

上面是北京二手房房價排名后十 地段分布,房價在 1.5萬-3萬 不等,沒看到這個分布圖之前僅僅認為上面價格是賣家標錯了,看完這個圖后才發現賣家是 掛着羊頭賣狗肉,掛着北京的名號,賣着北京以外的房子(有的房子已經位於河北境內),這可能就是賣房的套路之一吧

事出反常必有妖,無論買房還是買其他商品也好,賣家不會平白無故地給我們優惠,當價格遠低於市場價之前交易需慎重、慎重、再慎重!

房價我分為 5 個區間,分別為 0-3萬、3-8萬、8-12萬、12-15萬,15萬+ 五段,看一下各自的占比分布

image-20210303083107857

其中房價位於 3-8萬 占比最大達 76 %占比,次之就是8-12萬、12-15萬,依次占比為16.38%、3.46%,而房價位於 15 萬 + 占比最少,僅有1.12% 左右;

接下來我們再看一下,不同價位二手房在北京的分布

15萬+的

image-20210303083834061

12-15萬

image-20210303083905448

8-12萬

image-20210303083939248

3-8萬

image-20210303084102354

image-20210303084128883

從地段分布來看北京房價以8萬作為分水嶺,8萬+和8萬以內房產分布明顯變化,價格越高,越靠市中心以外;從地圖信息來看,想在北京買一套地段不錯的房子,預期房價最低也要在8萬+,8 萬是什么概念,也就說如果你想在北京買一套50平米的房子,最低也要 400萬!

關於15萬+ 的房產,大致都分布兩個區域,一個是高校區(周圍是人大、北航、清華等高校),另一個位於右下角,也就是北京朝陽區

image-20210303085517332

北京賣的二手房不一定都是裝修之后的,有可能也是毛坯(剛建造交付之后,未進行任何裝修);參考下圖,北京二手房中毛坯占比約1.39%共41套,戶主買來這些房子大概率用於資產增值而不是作為剛需;

image-20210303090233943

借助 Treemap 圖再看一下北京二手房建築時間分布,大部分都集中於2002-2010 這 9 年,北京房產也是在這段期間迅速發展, 到 2015 年之后明顯收緩,源於可建築地段已經達到飽和再加上國家相關政策的施壓

image-20210303100403126

最后貼張詞雲圖作為本文的結束,選取的文本信息為3000條房產信息的標題,從圖中來看,標題中高頻詞匯有 南北通透、高樓層、精裝修、采光好 等,也可以說這幾個特點也是大多數房源的最大賣點(拋去價格、地段等因素)

22

5,小總結

本文針對北京二手房的分析角度並不全面,僅僅圍繞着房價、地段、修建年份等幾個維度做了簡單分析,分析結果僅供學習,其數據真實性有考察

好了以上就是本文的全部內容,最后感謝大家的閱讀,我們下期見~

6,源碼獲取

關於本文中涉及的全部源碼和數據 獲取方式,在微信公號:小張Python ,后台回復關鍵字 210303 即可~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM