python在租房过程中的应用
總第84篇
01|背景介紹:
租房是再普遍不過的一件事情了,我們在租房過程中常考量的兩個因素是出租房離公司的遠近以及價格,而我們一般都會去鏈家上看相應的信息,但是鏈家網只有價格沒有距離,對于我這種對帝都不是很熟的人,對各個區域的位置是一臉懵逼,所以我就想著能不能自己計算距離呢,后來查了查還真可以。具體做法就是先獲取各個出租房所在地的經緯度和你公司所在地的經緯度,然后進行計算即可。
我們在獲取經緯度之前首先需要獲取各個出租房所在地的名稱,這里獲取的方法是用爬蟲對鏈家網上的信息進行獲取的。關于爬蟲可以先看看這幾篇:
爬蟲進階(一)
爬蟲進階(二)
爬蟲進階(三)
爬蟲進階(四)
02|Xpath介紹:
以前解析都是用的BeautifulSoup和正則表達式,見到網上有人說自從用了Xpath以后再也不想用BS了,所以決定這次來嘗試一下。
2.1Xpath是什么
XPath 是一門在XML文檔中查找信息的語言。XPath 可用來在XML文檔中對元素和屬性進行遍歷。
Xpath是在文檔中查找信息的,我們在之前用過的BeautifulSoup也是可以用來在文檔中查找信息的。這兩者有什么不一樣呢,我們來看看。
我們看看這兩種方式具體查找信息的過程。
BeautifulSoup在查找信息時,需要利用BeautifulSoup(html,”lxml”)對requests.get()得到的內容進行解析得到一個BeautifulSoup對象soup,然后再利用BeautifulSoup的一些方法去獲取對應的信息。
Xpath在查找信息的時候,也是需要先對requests.get()得到的內容進行解析,這里是用lxml庫中的etree.HTML(html)進行解析得到一個對象dom_tree,然后利用dom_tree.Xpath()方法進行獲取對應的信息。
(疑問:既然Xpath的目標對象是XML,而BeautifulSoup也有XML的解析器,是不是可以用BeautifulSoup的xml進行解析得到xml文檔,然后再用Xpath?我試了下好像不可以,同樣的response,用xml進行解析數據為空,也不知道是什么原因,是不是這種思路就有問題,求指正。)
關于BeautifulSoup的幾種解析器可以看:http://www.cnblogs.com/KoalaDream/p/4706316.html
這里面有提到兩種文件類型XML和HTML,那么這兩者又有什么區別。
http://blog.csdn.net/liu_yujie2011com/article/details/20284453
03|Xpath怎么用:
Xpath最常用的幾個符號就是“/”、“//”這兩個符號,“/”表示該標簽的直接子節點,就比如說一個人的眾多子女,而“//”表示該標簽的后代,就比如說是一個人的眾多后代(包括兒女、外甥、孫子之類的輩分)。
更多詳細內容這里就不Ctrl C/V了,大家直接看官方教程就好啦:http://www.w3school.com.cn/xpath/xpath_syntax.asp 。
04|數據抓取:
在前面也說過,我們本次抓取的流程是先獲得url,然后利用requests.get()獲得html,然后再利用lxml庫中的etree.HTML(html)進行解析得到一個對象dom_tree,然后利用dom_tree.Xpath()方法進行獲取對應的信息。
先分析目標網頁url的構造,鏈家網的url構造還是很簡單的,頁碼就是pg后面的數字,在租房這個欄目下一共有100頁,所以我們循環100次就好啦。
還有就是明確我們要獲取的信息,在前面我們說了是要研究公司附近的租房,但是我們在租房的時候也不是僅僅考慮距離這一個因素,這里我準備獲取標題、價格、區域(大概在哪一塊)、看房人數(說明該房的受歡迎程度)、第一特征(可以說是該房的一個優勢點,有的會寫離地鐵近,有的會寫隨時看房之類的),更新日期(判斷你看到的信息是不是該房源的最新動態),樓層情況(高樓層還是低樓層),房租建筑時間等等。(就是你能看到的信息差不多都要弄下來哈哈)。
#導入相關庫 from lxml import etree import requests from requests.exceptions import ConnectionError import pandas as pd#獲取目標網頁的url def get_page_index():base="https://bj.lianjia.com/zufang/pg"for i in range(1,101,1):url=base+str(i)+"/"yield url#yield為列表生成器得到目標網頁的url后,對其進行解析,采用的方法是先用lxml庫的etree對response部分進行解析,然后利用xpath進行信息獲取。
df1.info(通過下圖可以看出,我們一共抓取到2970條房屋信息)。
df1.head(3),預覽一下表的基本構成。
05|經緯度的獲取:
我們剛剛只是獲取了一些出租房的基本信息,但是我們要想計算距離還需要獲得這些出租房所在的地理位置,即經緯度信息。
這里的經緯度是獲取的區域層級的,即大概屬于哪一個片區,本次爬取的2970條房屋信息分布在北京的208個區域/區域。
關于如何獲取對應地點的經緯度信息,這里感謝雨哥提供方法,利用的XGeocoding_v2工具,具體的獲取方法點擊:
https://mp.weixin.qq.com/s/2Y92oxDUnR5VaT2E2Adowg
得到的如下的結果:
06|距離的計算:
#經緯度的計算函數 # input Lat_A 緯度A # input Lng_A 經度A # input Lat_B 緯度B # input Lng_B 經度B # output distance 距離(km) def calcDistance(Lat_A, Lng_A, Lat_B, Lng_B):ra = 6378.140 ?# 赤道半徑 (km)rb = 6356.755 ?# 極半徑 (km)flatten = (ra - rb) / ra ?# 地球扁率rad_lat_A = radians(Lat_A)rad_lng_A = radians(Lng_A)rad_lat_B = radians(Lat_B)rad_lng_B = radians(Lng_B)pA = atan(rb / ra * tan(rad_lat_A))pB = atan(rb / ra * tan(rad_lat_B))xx = acos(sin(pA) * sin(pB) + cos(pA) * cos(pB) * cos(rad_lng_A - rad_lng_B))c1 = (sin(xx) - xx) * (sin(pA) + sin(pB)) ** 2 / cos(xx / 2) ** 2c2 = (sin(xx) + xx) * (sin(pA) - sin(pB)) ** 2 / sin(xx / 2) ** 2dr = flatten / 8 * (c1 - c2)distance = ra * (xx + dr)return distance#具體的計算 #Lat_A,Lng_A為你公司地址,這里以望京為例, #你可以輸入你公司所在地 Lat_A=40.0011422082; Lng_A=116.4871328088 Distance0=[]#用于存放各個區域到公司的距離 region=[] for r in range(0,208,1):Lat_B=df3.loc[r][1];Lng_B=df3.loc[r][2]distance=calcDistance(Lat_A, Lng_A, Lat_B, Lng_B)Distance1='{0:10.3f} km'.format(distance)region0=df3.loc[r][0]Distance0.append(Distance1);region.append(region0) date={"region":region,"Distance":Distance0} ? ? Distance_result=pd.DataFrame(date,columns=["region","Distance"]) #將得到的距離望京最近的十個區域進行輸出 Distance_result.sort_values(by="Distance").head(10)(距離望京最近的十個區域,以及其對應的距離)
(距離望京最近的十個區域對應的雷達圖)
獲取經緯度信息的地址如下:http://www.gpsspg.com/maps.htm
最后將距離以及區域與對應的小區拼接在一起,得到下面的結果。
由于篇幅問題,怕各位看官看煩了,所以關于鏈家房屋信息的更多分析留在下一節。
我們通過這些數據還有很多的分析維度,下表是其中一個最基本統計,表頭依次為該區域內房屋數量,價格的平均值,標準差,最小值,25%,50%,75%以及最大值。
本次關于數據獲取(抓取)的部分并沒有太詳細的解釋,如果你覺得看得不是很懂那就回到文章開頭部分看看以往的推送的爬蟲文章,有詳細的解釋。
更多精彩內容,請持續關注。
有需要這些房屋信息的,后臺回復【租房】這兩個字領取吧。
總結
以上是生活随笔為你收集整理的python在租房过程中的应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 科幻电影《宇宙探索编辑部》今日 16 点
- 下一篇: 侠客风云传幽冥十三式获得(了解历史上真正