一文教你利用Python租到最合適的房子
前言
書接上回,在前陣子的一篇文章(為了在上海租房,我用python連夜爬了20000多條房源信息)中,我們用python獲取到了上海地區(qū)某平臺(tái)的2w多條房源數(shù)據(jù)。
但上篇文章中只做了簡(jiǎn)單的篩選,這只是第一步,接下來(lái),我們應(yīng)當(dāng)如何從這些數(shù)據(jù)中挑選出符合自己要求的房子呢?
為了確保換房后我和女友前往各自上班地點(diǎn)的通勤時(shí)間都在可接受范圍內(nèi),我需要知道從各處房源位置前往兩家公司所需的時(shí)間。為了獲取這些信息,我們需要借助高德地圖api這個(gè)工具。
使用高德api,我們能夠輕松地根據(jù)地址或名稱獲取到地址對(duì)應(yīng)的坐標(biāo)位置,進(jìn)而獲取到對(duì)應(yīng)地點(diǎn)的通勤和周邊信息,十分的方便。
在使用api之前,我們首先需要獲取到自己的Key值。進(jìn)入高德開放平臺(tái)網(wǎng)站,完成個(gè)人開發(fā)者注冊(cè)和zfb實(shí)名認(rèn)證后,點(diǎn)擊控制臺(tái)→應(yīng)用管理→我的應(yīng)用→創(chuàng)建新應(yīng)用,來(lái)完成應(yīng)用的創(chuàng)建。
之后點(diǎn)擊右上角的添加,來(lái)為自己創(chuàng)建一個(gè)Key,注意這里服務(wù)平臺(tái)要選擇Web服務(wù),不同選項(xiàng)對(duì)應(yīng)的服務(wù)范圍是不同的。
創(chuàng)建key值之后,就可以開始使用api獲取數(shù)據(jù)了。
首先我們要根據(jù)地點(diǎn)名稱得到對(duì)應(yīng)的坐標(biāo)值,然后用出發(fā)地和目的地的坐標(biāo)調(diào)用接口,得到兩個(gè)位置之間的通勤時(shí)間。
思路理清之后,就到了操作時(shí)間了。
獲取房源坐標(biāo)
因?yàn)榭偟姆吭磾?shù)量太大,所以我們可以用小區(qū)的坐標(biāo)位置代替房源的具體位置進(jìn)行調(diào)用,這樣需要進(jìn)行的處理量就大大減小了,可以節(jié)省一些不必要的成本。
因此首先我們對(duì)上篇文章中獲取到的數(shù)據(jù)做一個(gè)簡(jiǎn)單的處理,利用set對(duì)小區(qū)名做一個(gè)去重。
csv_read=pd.read_csv('../document/sh.csv',header=None) village_set?=?set(csv_read[2]) village_list?=?list(village_set)
獲取到小區(qū)列表后,我們嘗試調(diào)用一下獲取坐標(biāo)的API。
#?高德API的URL geourl?=?'https://restapi.amap.com/v3/geocode/geo'?? #?地址前要加地區(qū)名,否則可能定位到其他城市 params?=?{'key':'在這里填入個(gè)人的Key值', ????????'address':?'上海市國(guó)金中心'} #?發(fā)送請(qǐng)求???????????????? res?=?requests.get(geourl,?params) jd?=?json.loads(res.text) #?返回值的具體格式可以在API文檔中查看 geopoint_1?=?jd['geocodes'][0]['location'] print(geopoint_1) #?121.502021,31.236814
調(diào)用成功之后,我們就可以用相同的方法,獲取到列表中所有小區(qū)的坐標(biāo)。
獲取路程時(shí)間
在得到各個(gè)小區(qū)的坐標(biāo)位置之后,我們就可以調(diào)用api獲取兩個(gè)坐標(biāo)之間的路程時(shí)間了。
舉個(gè)例子,如果我需要獲取兩個(gè)坐標(biāo)之間的公交地鐵通勤時(shí)間,可以用如下的方法:
#?高德API的URL puburl?=?'https://restapi.amap.com/v3/direction/transit/integrated?origin={}&destination={}&key={}&time=9:00&city=上海'?? #?發(fā)送請(qǐng)求?? r=requests.get(puburl.format(geopoint_1,?geopoint_vill,?'在這里填入個(gè)人的Key值'))?? r=r.text?? jsonData=json.loads(r) #?獲取步行距離 publength?=?round(int(jsonData['route']['transits'][0]['walking_distance'])/1000,?2) #?獲取總時(shí)間 pubtime?=?round(int(jsonData['route']['transits'][0]['duration'])/60)
這里一般會(huì)獲取到多條路線,不過(guò)因?yàn)榈谝粭l路線通常是用時(shí)最短的,所以這里就以第一條路線的數(shù)據(jù)為代表。
用類似的方法,通過(guò)使用不同的url,就能獲取到駕車、步行等方式的路程時(shí)間。不過(guò)要注意不同的這些api的輸入和輸出參數(shù)是有一定區(qū)別的,具體的要參照文檔。
完整代碼
import?pandas?as?pd import?requests import?json import?csv import?codecs #?創(chuàng)建導(dǎo)出文件 with?open(r'..\document\village.csv',?'wb+')as?fp: ????fp.write(codecs.BOM_UTF8) f?=?open(r'..\document\village.csv','w+',newline='',?encoding='utf-8') writer?=?csv.writer(f) writer.writerow(("小區(qū)名",?"坐標(biāo)",?"步行距離-地點(diǎn)1","通勤時(shí)間-地點(diǎn)1",?"步行距離-地點(diǎn)2","通勤時(shí)間-地點(diǎn)2")) geourl?=?'https://restapi.amap.com/v3/geocode/geo'?? puburl?=?'https://restapi.amap.com/v3/direction/transit/integrated?origin={}&destination={}&key={}&time=9:00&city=上海'?? #?讀取文件 csv_read=pd.read_csv('../document/sh.csv',header=None) village_set?=?set(csv_read[2]) village_list?=?list(village_set) #?獲取第一個(gè)坐標(biāo) geourl?=?'https://restapi.amap.com/v3/geocode/geo'?? #?地址前要加地區(qū)名,否則可能定位到其他城市 params?=?{'key':'在這里填入個(gè)人的Key值', ????????'address':?'上海市國(guó)金中心'} #?發(fā)送請(qǐng)求???????????????? res?=?requests.get(geourl,?params) jd?=?json.loads(res.text) #?返回值的具體格式可以在API文檔中查看 geopoint_1?=?jd['geocodes'][0]['location'] #?獲取第二個(gè)坐標(biāo) params?=?{'key':'在這里填入個(gè)人的Key值', ????????'address':?'上海市國(guó)正中心'}??????????????? res?=?requests.get(geourl,?params) jd?=?json.loads(res.text) geopoint_2?=?jd['geocodes'][0]['location'] for?adr?in?village_list: ????#?獲取小區(qū)坐標(biāo) ????params?=?{'key':'在這里填入個(gè)人的Key值', ????????'address':?'上海市'+adr}???????????????? ????res?=?requests.get(geourl,?params) ????jd?=?json.loads(res.text) ????geopoint?=?jd['geocodes'][0]['location'] ????#?獲取第一個(gè)位置的信息 ????r=requests.get(puburl.format(geopoint_1,?geopoint,?'在這里填入個(gè)人的Key值'))?? ????r=r.text?? ????jsonData=json.loads(r) ????publength_1?=?round(int(jsonData['route']['transits'][0]['walking_distance'])/1000,?2) ????pubtime_1?=?round(int(jsonData['route']['transits'][0]['duration'])/60)?? ????#?獲取第二個(gè)位置的信息 ????r=requests.get(puburl.format(geopoint_2,?geopoint,?'在這里填入個(gè)人的Key值'))?? ????r=r.text?? ????jsonData=json.loads(r) ????publength_2?=?round(int(jsonData['route']['transits'][0]['walking_distance'])/1000,?2) ????pubtime_2?=?round(int(jsonData['route']['transits'][0]['duration'])/60)?? ????writer.writerow((adr,?geopoint,?publength_1,?pubtime_1,?publength_2,?pubtime_2)) f.close()
將腳本執(zhí)行后,就能獲得各個(gè)小區(qū)距離目標(biāo)地點(diǎn)的路程時(shí)間。后面再經(jīng)過(guò)一些簡(jiǎn)單的篩選,就能大大縮小找房的選擇范圍了。
高德API還有很多其他的功能,比如POI周邊搜索可以查詢小區(qū)周邊指定范圍內(nèi)(比如方圓1公里)是否有便利店,健身房等設(shè)施,結(jié)合前端組件還可以在地圖中顯示出指定的位置,合理運(yùn)用這些功能,能夠?qū)崿F(xiàn)更多的個(gè)性化需求,文中只用了很小一部分,大伙可以參照API文檔自行嘗試。
不過(guò)也要注意一點(diǎn),對(duì)于個(gè)人開發(fā)者而言,高德API每日的調(diào)用次數(shù)是有限制的,為了避免超額,大家在爬取數(shù)據(jù)的時(shí)候可以根據(jù)實(shí)際情況適度縮小范圍,減少處理的數(shù)據(jù)量。
到此這篇關(guān)于一文教你利用Python租到最合適的房子的文章就介紹到這了,更多相關(guān)Python租房?jī)?nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
對(duì)Python 網(wǎng)絡(luò)設(shè)備巡檢腳本的實(shí)例講解
下面小編就為大家分享一篇對(duì)Python 網(wǎng)絡(luò)設(shè)備巡檢腳本的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-04-04pyqt6實(shí)現(xiàn)QTimer定時(shí)器介紹和使用場(chǎng)景
PyQt6中的QTimer是一個(gè)定時(shí)器類,用于在指定的時(shí)間間隔內(nèi)執(zhí)行某個(gè)操作,本文主要介紹了pyqt6實(shí)現(xiàn)QTimer定時(shí)器介紹和使用場(chǎng)景,具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02numpy和pandas中數(shù)組的合并、拉直和重塑實(shí)例
今天小編就為大家分享一篇numpy和pandas中數(shù)組的合并、拉直和重塑實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-06-06python 殺死自身進(jìn)程的實(shí)現(xiàn)方法
今天小編就為大家分享一篇python 殺死自身進(jìn)程的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07python實(shí)現(xiàn)機(jī)械分詞之逆向最大匹配算法代碼示例
這篇文章主要介紹了python實(shí)現(xiàn)機(jī)械分詞之逆向最大匹配算法代碼示例,具有一定借鑒價(jià)值,需要的朋友可以參考下。2017-12-12Python中Scipy庫(kù)在信號(hào)處理中的應(yīng)用詳解
信號(hào)處理作為數(shù)字信號(hào)處理領(lǐng)域的關(guān)鍵技術(shù),涵蓋了從信號(hào)獲取、傳輸、存儲(chǔ)到最終應(yīng)用的一系列處理步驟,在這篇博客中,我們將深入探討Python中Scipy庫(kù)在信號(hào)處理領(lǐng)域的應(yīng)用,需要的朋友可以參考下2023-12-12