【數據採集】不到十行核心代碼實現房產數據抓取

背景

從去年開始大灣區、豪宅稅的取消、行示範區的概念,深圳房地產市場可謂是紅紅火火,未買房的剛需瑟瑟發抖。現在經歷過疫情影響深圳房價市場到底如何了?那麼寫個小爬蟲爬取下鏈家網站,大致瞭解下當下深圳房市的整體情況。

因爲網站主要是js動態渲染,因此普通的http請求獲取不到動態數據,這裏主要採用selenium ,selenium技術是一個用於Web應用程序測試的工具。Selenium測試直接運行在瀏覽器中,就像真正的用戶在操作一樣,支持大多數常見的瀏覽器。
selenium可以模擬真實瀏覽器,自動化測試工具,支持多種瀏覽器,爬蟲中主要用來解決JavaScript渲染問題。

廢話不多說直接上源代碼,大家也可以直接通過附件下載源代碼跑一跑數據。

from selenium import webdriver
from lxml import html

base="https://sz.lianjia.com"
fileObject = open('sampleListnanshan.txt', 'w')

browser = webdriver.Chrome("/Users/house/Downloads/chromedriver")

datasets = []

def get_singel_cummunity_data(community):
    datas=""
    try:
        browser.get(community)
        innerHTML = browser.execute_script("return document.body.innerHTML")
        trees = html.fromstring(innerHTML)
        result_name = trees.xpath('//*[@id="sem_card"]/div/div[1]/div[1]/div/a[1]/text()')  # 小區名
        result_number = trees.xpath('//*[@id="sem_card"]/div/div[1]/div[2]/div[4]/div[2]/text()')  # 帶看數據
        mean_price = trees.xpath('//*[@id="sem_card"]/div/div[1]/div[2]/div[1]/a/text()')  # 小區均價
        days90 =      trees.xpath('//*[@id="sem_card"]/div/div[1]/div[2]/div[3]/a/text()')  # 近90天成交
        onsale =     trees.xpath('//*[@id="sem_card"]/div/div[1]/div[2]/div[2]/div[2]/text()')  # 小區在售
        print(""+result_name[0]+",近30天帶看:"+result_number[0]+",均價:"+mean_price[0]+"近90天成交:"+days90[0]+",在售套數:"+onsale[0])
        datas= ""+result_name[0]+","+result_number[0]+","+mean_price[0]+","+days90[0]+","+onsale[0]
        return datas 
    except:
        print("this community dataset get error"+str(community))
    #return  datasets

## 獲取區域裏面的小區
def get_all_communites_by_region(region):
    browser.get(region)
    innerHTML = browser.execute_script("return document.body.innerHTML")
    tree = html.fromstring(innerHTML)
    communities = tree.xpath('/html/body/div[4]/div[1]/ul/li/div[2]/div/a/@href')  # 獲取某個片區數據
    #小區列表頁
    return communities

## 獲取某個區的街道辦
def get_all_regions_by_district(district):
    browser.get(district)
    innerHTML = browser.execute_script("return document.body.innerHTML")
    tree = html.fromstring(innerHTML)
    regions = tree.xpath('/html/body/div[3]/div[1]/dl[2]/dd/div/div[2]/a/@href')  # 獲取所有區下面的區域
    return regions

2
## 獲取深圳所有的小區
url='https://sz.lianjia.com/xiaoqu/' #需要爬數據的網址
def get_all_districts(url):
    browser.get(url)
    innerHTML = browser.execute_script("return document.body.innerHTML")
    tree = html.fromstring(innerHTML)
    districts = tree.xpath('/html/body/div[3]/div[1]/dl[2]/dd/div/div[1]/a/@href')  # 獲取所有區
    print(districts)
    return districts

#burl='https://sz.lianjia.com/xiaoqu/baoanqu/' #需要爬數據的網址
#furl='https://sz.lianjia.com/xiaoqu/futianqu/' #需要爬數據的網址
nurl='https://sz.lianjia.com/xiaoqu/nanshanqu/' #需要爬數據的網址
#luohuurl='https://sz.lianjia.com/xiaoqu/luohuqu/' #需要爬數據的網址

#strict=get_all_districts(url) #可以抓取深圳所有區的鏈接
#print("深圳的所有區"+str(strict))

districts=['https://sz.lianjia.com/xiaoqu/nanshanqu/']
datasets = [] #存儲每個小區信息的數組
regions=get_all_regions_by_district(nurl)


for region in regions:
    datasets.append(region)
    communities=[]
    if region.startswith(base):
        communities=get_all_communites_by_region(region)
    else:
        communities=get_all_communites_by_region(base+region)

    datas="" # 某個小區數據
    for community in communities:
        if community.startswith(base):
            datas=get_singel_cummunity_data(community)
        else:
            datas=get_singel_cummunity_data(base+community)

        datasets.append(datas)


for ip in datasets:
    fileObject.write(ip)
    fileObject.write('\n')
fileObject.close()

browser.close()
 

運行結果:

在這裏插入圖片描述
主要採集了每個小區近30天帶看次數,均價,近90天成交套書,以及在售套數。

關鍵點解析:

1、瀏覽器指定

browser = webdriver.Chrome("/Users/house/Downloads/chromedriver")
這塊要替換成自己電腦瀏覽器執行文件路徑,也可以選擇其它瀏覽器去執行抓取,chrome注意要下載對應的的執行文件,https://www.cnblogs.com/EthanHe97/p/11270528.html
2、頁面Xpath解析抽取
在這裏插入圖片描述
如上圖通過定位對應的字段copy xpath 就可以 獲取裏面的內容 如

onsale = trees.xpath(’//*[@id=“sem_card”]/div/div[1]/div[2]/div[2]/div[2]/text()’)#
具體xpath規則可以自行google。
結果圖

在這裏插入圖片描述

根據南山區爬行的結果,統計成圖標如上圖,Y軸是帶看次數,x軸是價格,可以看出帶看多的 還是便宜的房子。
這裏只是簡單的採集了每個小區的部分數據,數據輸出到一個txt文件當中可以大致看到每個片區鏈家上的帶看、銷售情況,大致判斷出哪些片區比較火,哪些樓盤價格低等信息。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章