李 紅
大連理工大學城市學院工程實踐中心 遼寧 大連 116101
beautif ulsoup4是一個python庫,能夠?qū)t ml或者x ml文檔解析為樹結(jié)構(gòu),方便我們查找和抓取數(shù)據(jù),因此我們需要手動安裝pip install
beautif ulsoup。
抓取到的數(shù)據(jù)通常都會用到pandas進行處理,它具有功能強大的函數(shù)來幫助我們進行數(shù)據(jù)的分析和存儲。故我們需要手動安裝pip install pandas。
為了直觀顯示數(shù)據(jù)分析結(jié)果,需要將房屋信息進行可視化展示,我們需要強大的pyechart,所以繼續(xù)手動安裝pip install pyecharts。
手動安裝好所需python庫之后,在lj Spider.py文件最開始導入相關(guān)庫:
i mport requests
fro m bs4 i mport Beautif ul Soup
i mport re
i mport pandas as pd
i mport os
i mport l x ml
1.分析目標網(wǎng)頁ht ml結(jié)構(gòu)。以鏈家為例,使用googlechrome或者火狐瀏覽器打開鏈家網(wǎng)站,我們發(fā)現(xiàn)該網(wǎng)站每頁顯示30條房屋記錄,這部分房屋信息在列表ul中,選擇其中一條房屋信息,右鍵-->檢查,即可發(fā)現(xiàn)該條房屋信息在class="inf o clear"的div標簽中,找出標題、詳細信息、樓層、價格等信息所在的標簽。
2.抓取數(shù)據(jù)。找到數(shù)據(jù)之后,我們可以使用requests進行網(wǎng)頁抓取,在使用requests進行網(wǎng)頁抓取時,容易被目標網(wǎng)站發(fā)現(xiàn)而進行反爬,比如IP被限制的情況,此時我們一般可以添加user-agent、Referer、cookie等進行偽裝,以便順利獲得目標網(wǎng)頁信息。使用beautif ulsoup4進行格式轉(zhuǎn)化。設計house_item(url),進行單個房屋信息抓起并存儲,主要使用soup的find函數(shù)進行標簽定位爬取數(shù)據(jù),房屋信息中標題和小區(qū)在div標簽中的內(nèi)嵌a標簽中,使用ite m['area Na me']=soup.find("div",attrs={"class":"area Na me"}).find("a").text,比較容易獲得數(shù)據(jù),也可以用正則獲取。如果感覺列表頁面提供的房屋信息不夠用,則可以去詳細頁面進行數(shù)據(jù)抓取。只是那樣的話,抓取的速度會很慢,我們要考慮清楚再行動。
接下來在主程序中,利用for循環(huán),按頁碼進行數(shù)據(jù)抓取,每頁的30條房屋信息用字典list進行存儲,使用pandas的DataFrame將list保存成二維表結(jié)構(gòu)。并使用t o_csv函數(shù)同時將每頁房屋信息存儲到文本文件house_inf o.csv中,對應的列為“標題”“房屋信息”“總價”“單價”“樓層”“朝向”“裝修”……。注意,如果不是第一次導入數(shù)據(jù),則存儲數(shù)據(jù)時要采用追加形式,即設置mode='a',否則會出現(xiàn)數(shù)據(jù)被覆蓋的現(xiàn)象。同時header=False,index=False,即不再添加表頭和索引。
3.數(shù)據(jù)清理。房屋總價爬取到的數(shù)據(jù)為XX萬,單價XXXX平/米,面積XX平米,樓層信息中我們只關(guān)注樓層信息,但是卻獲得到了完整的樓層信息以及建筑時間等。此時我們就需要進行數(shù)據(jù)的清理。簡單的我們可以直接用str的函數(shù)index、split、strip等進行處理,例如data['area']=data['eara_mainInf o'].str.split('平米').str[0],floor_inf o.text[:floor_info.text.index(')')+1],soup0.find('div',attrs={'class':'total Price'}).text[:-1]。復雜些的可以使用正則表達式進行處理,例如re.findall('d+',soup.find('div',{'class':'unit Price'}).text)
先將大連地區(qū)所有行政分區(qū)的數(shù)據(jù)分批次導入到house_info.csv中(樣本數(shù)據(jù)總計9271條記錄,按各個分區(qū)平均抓取),接下來進行分析數(shù)據(jù)時,從csv文件中讀取出來生成表結(jié)構(gòu)data,利用mean函數(shù)求平均值,max函數(shù)求最大值,min函數(shù)求最小值。按行政分區(qū)進行房價平均值計算,直觀的體現(xiàn)城市資源高配所在行政區(qū),首先按各個區(qū)使用data的groupby函數(shù)進行分組并統(tǒng)計各個區(qū)的房源總數(shù)gp=data.groupby(['fenqu'],as_index=False)['tit'].count(),計算各個區(qū)的面積單價平均值然后使用sort_values函數(shù)排序。使用pyecharts.Line來繪制折線圖,并標記房價最高、最低值。類似思路,先按小區(qū)進行分組,算出小區(qū)平均單價,然后用pyecharts.Bar來繪制柱狀圖展示排名top10的小區(qū),方便購房者看出整個城市的房價最高(即黃金地段)小區(qū)排名。由于篇幅有限,其他圖不在此展示。

本文以房價數(shù)據(jù)分析為研究目標,利用鏈家網(wǎng)站收集數(shù)據(jù)資源作為參考,在研究了網(wǎng)站頁面結(jié)構(gòu)基礎(chǔ)上,采用pyt hon語言的request、Beautif ulsoup、pandas等庫,設計了爬蟲ljspider進行數(shù)據(jù)爬取,并采用pyecharts進行生成圖表,直觀展示數(shù)據(jù),可供在該地區(qū)購買房屋者作為參考。筆者通過該程序的設計與實現(xiàn),發(fā)現(xiàn)不足并正在努力專研技術(shù)為后續(xù)改進努力。