Scrapy提供了基于XPath和CSS的Selector方式對網頁文件進行解析,根據系統自動選擇最優的解析方法,可解析HTML和XML兩種文件類型。在XPath中,‘//’表示從文檔節點開始抓取,‘/’表示從上一級標簽節點開始抓取,@href表示提取標簽超鏈接。實現提取小區超鏈接代碼如下:
foreachhouse in houses:
#從
提取href的屬性值
xq=eachhouse.xpath('div[@class="info-panel"]/h2/a/@href')
xq_+str(xq[0])
2.3 解析網頁文件
在Scrapy中,解析函數命名為parse,傳入參數為服務器返回值response。直接返回的response需要程序提取所需數據。首先需要生成一個selector實例sel,對其可使用XPath等方法解析。以安居客在售二手房(http://shanghai.anjuke.com/sale/)信息為例,說明解析步驟。觀察當前在售房屋信息,在view-source中尋找對應源碼。面對嵌套標簽,可利用類似于list的提取方式提取嵌套標簽的同胞標簽。
HTML解析函數代碼如下:
def parse(self,response): #返回的response傳入parse解析
sel=Selector(response) #聲明選擇器對象sel
datalist=sel.XPath('//div[@class="house-details"]/div[2]')
#抓取屬性為class="house-details"的div標簽下嵌套的第二個div標簽
items=[]
item=ConItem()#聲明Items
item['address']=sel.xpath('//span[@class="comm-address"]/@title')
for data in datalist:
item['area']=data.xpath('.//span[1]')
#抓取的面積數據存放在area中
item['area']=item['area'].xpath('string(.)')
#讀取span標簽下面的文本
item['price']=data.xpath('.//span[3]')
item['price']=item['price'].XPath('string(.)')
item['btime']=data.XPath('.//span[5])
item['btime']=item['btime].XPath('string(.)')
items.append(item)
return items
2.4 存儲數據
從網頁中抓取的文本數據一般可以選擇存儲為CSV、JSON等形式。為避開編碼問題,將網頁數據存儲為JSON格式。打開ajkspider所在文件夾路徑的命令提示符,直接輸入:scrapy crawl ajkspider -o ajkdata.json -t json,即可在根目錄中找到數據文件。Python中自帶JSON模塊解析,將原始數據存儲規范格式后存儲為Excel文件。
3 房產數據的空間定位
在鏈家網中,網頁中含有百度地圖的經緯度坐標,可以直接獲取;而在安居客網站中,可直接抽取地理信息為地址,因此需要進一步地理編碼,從而得到地理坐標。根據上述兩種地理信息類型來介紹房產數據的空間坐標獲取方法。
3.1 坐標糾偏
一般移動設備上安裝GPS芯片或北斗芯片,獲取WGS84坐標系下的經緯度,谷歌地圖應用WGS84坐標系。根據國家測繪地理信息局國土測繪司在2006年發布的文件《導航電子地圖安全處理技術基本要求》,導航電子地圖在公開出版時必須進行空間位置技術處理,該技術由指定機構采用國家規定辦法統一實現,因此開放給大眾的地理坐標是經過首次技術處理的。高德地圖、谷歌中國地圖和搜搜地圖應用該坐標系,而百度地圖使用百度坐標系。針對不同的地理坐標數據,需要統一坐標系統,才可進行下一步研究。
3.2 地理編碼
鏈家小區數據中含有地理坐標,因此只需要坐標轉換即可,而安居客房屋只有地址,因此需要使用地圖API得到地理坐標。選用百度API,一方面是因為目前較為主流的地圖API為高德和百度,而百度API當日可返回數據量高于高德;另一方面是考慮到抓取鏈家小區經緯度坐標時,該網站采用的是百度API接口,以保持地理坐標的一致性。使用API類似于爬蟲的原理,區別是百度的坐標返回只有單一數據,在瀏覽器中打開也是一組文本數據,因此讀寫方便。
首先在百度官網(http://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-geocoding)申請密鑰AK,在對百度服務器的請求中輸入AK和要返回坐標的地址。而后對服務器返回的JSON結果進行函數解析。實現上述功能的代碼示例如下:
def parseaddress(url): #對返回結果解析函數
response=urllib2.urlopen(url)
s=response.read()
dic=json.loads(s) #聲明一個JSON實例
status=dic.get('status',11)#讀取JSON中status的值,0為成功返回結果
if status==0:#如果返回結果成功,那么依次讀取參數值
bd_lng=dic["result"]["location"]["lng"] #規范JSON數據格式
bd_lat=dic["result"]["location"]["lat"]
precise=dic["result"]["precise"]
confidence=dic["result"]["confidence"]
else:
bd_lng,bd_lat,precise,confidence=0,0,0,0
data.extend([status,precise,confidence])
return data#返回"longitude","latitude","status","precise","confidence"
urlAddress='http://api.map.baidu.com/geocoder/v2/?address=%s&output=json&ak=申請的
AK'%(‘上海市’+address) #向服務器請求數據,輸入參數為AK和地址address
dataAddress=parseaddress(urlAddress)#使用函數解析,得到結果
4 房產信息在線分析工具開發
根據上述方法,開發可內嵌在瀏覽器中的房產信息在線分析工具,Web中數據量膨脹的同時也要求數據分析結果的同步。該工具集成房產數據獲取與空間定位功能,用戶只需輸入要爬取的房產網站,即可獲得網站實時數據。同時,工具按照用戶選擇的統計方法,以地圖和圖表方式即時顯示房產信息的特征。在線工具界面如圖4所示。

圖4 房產信息在線分析工具使用界面
該工具基于PyQt等模塊開發,輕量級,用戶可以直接下載并運行.exe文件即可,不需要配置Python環境。在線分析工具主要針對普通用戶,使用基本的科學計算方法與直觀的地圖可視化實現對網站數據的進一步分析。由于其開源的設計,在數據分析方面用戶可以自行加入一些計算方法,來設計更符合自身需求的在線分析工具。面對Web中大量的房產數據,如何在短時間內高效處理大量數據才是工具面對的關鍵問題。同時,由于網速等的限制,瀏覽器加載工具時更希望工具是輕量級的,而不是幾十兆、幾百兆的應用程序。房產信息開發工具考慮了上述兩點,旨在開發面向大眾的輕量級工具。以安居客網站和鏈家網為例,以上海市為研究區域演示工具運行。
4.1 房產信息獲取
選擇網站:
在“網址”處輸入需要抓取的房產網站網址。單擊“開始并保存”按鈕,獲取全網數據。抓取數據存入Excel中。考慮到兩點因素:一是大量的數據會占用系統內存空間,拖慢計算機運行速度;二是網站中的數據抓取下來可能存在格式錯誤或無效數據,需要進一步的數據清洗才可以進行分析。由于每次爬蟲抓取是向服務器請求當前全部界面,遇到錯誤數據不得不重新請求相同的網頁,對資源造成浪費。基于上述兩點,抓取的數據存入Excel。
以安居客、鏈家網作為輸入URL,上海市作為抓取城市,截止2016年4月20日,共抓取上海市16個行政區(不包括崇明縣)小區數據21 371條,二手房在售數據41 849條,在售信息中,獲取房產屬性包括小區名稱,地址,所售樓層與該樓房總層數,建造時間,該房屋售價,房屋面積等。小區信息中,“房產屬性”包括小區名稱地址,建成時間,總樓棟數,總戶數,綠化率,容積率等。
4.2 房產的空間分布
(1)轉化為Shapefile文件。
在爬蟲抓取數據的同時,會相應返回房產經緯度坐標。利用ArcGIS中自帶的Python接口,導入ArcPy模塊,將點對經緯度坐標轉化為點要素并存儲在ESRI Shapefile文件中。
(2)地圖可視化。
在“地圖可視化”組合框中設置各項參數,“城市”選擇“上海市”,“建造時間”根據用戶需要,單個年份顯示,例如1981年,1982年,或者選擇周期性年份,如1980年以前,1981年-1990年等。同時勾選“顯示底圖”復選框,可將點要素與地圖疊合在一起。在圖框右側有“放大”和“縮小”按鈕實現對地圖縮放操作。
4.3 不同類型房屋數據分析
選擇統計分析指標:
在“房源種類”中包括二手房、新房、租房、商業寫字樓、海外房產等,工具按照不同類型分析數據。數據分析的指標包括“房產屬性”中的價格、面積等。可在“統計類型”中選擇不同的統計方式顯示結果。
環線二手房、新房房價與出售數量統計圖如圖5所示。
(1)折線圖統計分析。
在“房源種類”中選擇二手房,“房產屬性”選擇價格,“統計類型”選擇折線圖。以上海市三條交通環線為分割線,將區域劃分為四部分,分別是內環以內區域,內環—中環區域,中環—外環區域,外環以外區域。(截止2016年4月20日)內環—中環區域二手房出售數量占16%,中環—外環區域占12%,與同一時期新房相比,內環—中環區域,中環—外環區域的二手房,新房均出售較少,反映出該區域是住宅密度較大的城市生活區。內環以內區域,外環以外區域出現了二手房出售的高峰,相對的外環以外區域出現了新房出售的高峰,體現出人們生活水平的提高。從前在郊區住的人會選擇靠近市區買房,因此出現郊區售樓高峰;而從前在市中心居住的人們希望在郊區買到環境質量更好的房屋,因此出現了市中心二手房出售和郊區新房出售的高峰。
(2)餅狀圖統計分析。
在“房源種類”中選擇二手房,“房產屬性”選擇建造年份,“統計類型”選擇餅狀圖,生成圖表表示上海市不同建造年份二手房占比,數據標簽在餅圖中標出。其中2001年-2010年的二手房數量占在售二手房的50%,其次是1991年-2000年,占比為25%,2011年至今的二手房占18%,而這一數字將持續上漲。用戶在為自己選擇二手房時,可參考該統計數據判斷房屋新舊和價格的合理性,糾正決策。

圖5 環線二手房、新房房價與出售數量統計圖
5 結束語
房產在線分析工具包括抓取數據、統計分析、地圖可視化三大功能,旨在面向大眾對Web數據做進一步的數據分析處理。工具抓取數據方法使用Scrapy爬蟲,根據Python的多線程特點,可快速抓取全網數據,但同時向服務器發送請求也給網站服務器帶來了負擔。用戶可選擇所需數據類型進行抓取并保存,減輕服務器壓力,也可以設置定時抓取,例如每一個月抓取一次數據,存儲在本機中,這同樣也是一種歷史數據保存方式,便于對房產數據做長期數據分析時使用。其統計分析功能利用Python科學計算方法,在工具中即時計算結果,并直觀顯示在圖表中。雖然Python相較于C語言沒有計算速度優勢,但是萬級單位數據還是影響不大的,另外Python數據處理方面有很多第三方包,數據可視化同樣不亞于C語言,其代碼比C語言要簡潔得多,因此將Python作為在線工具開發的編程語言。工具的地圖可視化借助ArcPy函數自動生成地圖結果,實時顯示在工具界面,使用戶對房產數據有一定的空間認識。如今網頁已經不僅僅是向人們展示數據,同時也可以幫助人們計算指標,量化分析數據,更加便于人的決策。在線工具實際上是對網頁功能的彌補,輕量級和開源性是在線工具的特點,其優勢在于彌補了數據獲取與分析的不同步情況,以便用戶在短期內掌握房產變化動態,預測趨勢等。在線工具經過不斷的完善和發展,將不僅局限于對特定網站的數據獲取以及分析,還可應用于各個領域。但其局限性也是顯而易見的,并不能具備應用程序完整的數據分析功能。就像電子書和紙質書一樣,兩者永遠不會相互替代,反而是相輔相成共同進步。
[1] Liu Bing,Crossman R,Zhai Yanhong.Mining data records in web pages[C]//KDD2003.[s.l.]:[s.n.],2003:601-606.
[2] Zhai Y,Liu B.Web data extraction based on partial tree alignment[C]//International conference on world wide web.[s.l.]:[s.n.],2005:76-85.
[3] 梅 雪,程學旗,郭 巖,等.一種全自動生成網頁信息抽取Wrapper的方法[J].中文信息學報,2008,22(1):22-29.
[4] 歐健文,董守斌,蔡 斌.模板化網頁主題信息的提取方法[J].清華大學學報:自然科學版,2005,45(S1):1743-1747.
[5] 王 曙,吉雷靜,張雪英,等.面向網頁文本的地理要素變化檢測[J].地球信息科學學報,2013,15(5):625-634.
[6] 廖邦固,徐建剛,梅安新.1947~2007年上海中心城區居住空間分異變化—基于居住用地類型視角[J].地理研究,2012,31(6):1089-1102.
[7] 鄒高祿,渠文晉,鄧 沛,等.二手房價格對于住房特征和區位變化敏感性分析[J].西南師范大學學報:自然科學版,2005,30(3):552-555.
[8] 李曉文,方精云,樸世龍.上海城市土地利用形成、變化及其空間作用機制[J].長江流域資源與環境,2006,15(1):34-40.
[9] 郭太飛,何潔月.歸納學習XPATH Web信息提取規則[J].計算機技術與發展,2007,17(3):98-101.
[10] 赫特蘭.Python基礎教程[M].第2版.北京:人民郵電出版社,2010.
[11] Shaw Z A.笨辦法學Python[M].王巍巍,譯.北京:人民郵電出版社,2014.
[12] Beazley D,Jones B K.Python cookbook[M].南京:東南大學出版社,2014.
[13] Bird S,Klein E,Loper E.Python自然語言處理[M].陳 濤,譯.北京:人民郵電出版社,2014.
[14] McKinney W.利用Python進行數據分析[M].唐學韜,譯.北京:機械工業出版社,2013.
[15] 高 軍,楊冬青,唐世渭,等.基于樹自動機的XPath在XML數據流上的高效執行[J].軟件學報,2005,16(2):223-232.
Data Acquisition and Development of Online Analysis Tools Based on Real Estate Transaction Websites
WANG Jin-zi,LAI Wen-jie
(School of Geographic Sciences,East China Normal University,Shanghai 200241,China)
Real estate transaction websites provide every detail about the real estate data.It would be helpful for people to know better about real estate,which is helpful for final decision.Development of online analysis tools meets the trend to analyze big data on real estate with less code to expect the integration of data mining with data analysis in real time owning the function no less than practical programs as new favorite in tool development.This analysis tool online has been developed with Python language as well as third party modules including Scrapy,ArcPy etc. to acquire information on real estate and to monitor and analyze spatial distributions and variations of real estate information from various types of data.Taking two trade websites of real estate,Network for Linking Family and Dwelling Guest,as examples,real estate data in Shanghai has been acquired to display spatial distributions and variations of housing prices as well as percents of real estates in diverse districts for convenience to analysis.
real estate transaction websites;website spiders;geocoding;ArcPy
2016-06-10
2016-09-15 網絡出版時間:2017-03-07
國家自然科學基金資助項目(41001270);上海市自然科學基金項目(14ZR1412200);閔行區中小企業技術創新計劃項目(2014MH011)
王藎梓(1995-),女,研究方向為數據挖掘、GIS開發與應用;導師:吳健平,教授,博導,研究方向為地理信息系統開發。
http://kns.cnki.net/kcms/detail/61.1450.TP.20170307.0922.074.html
TP39
A
1673-629X(2017)05-0154-06
10.3969/j.issn.1673-629X.2017.05.032