利用高德API++Python解決租房問題
一、課程介紹
1. 課程背景
課程來自一段租房血淚史(夸張):事情是這樣的,筆者是接著念大四準備考研,而室友是應屆畢業在找工作,說白了就是都沒有錢,于是打算合租。因為窮所以不可能找有門店的的中介,只能看看趕集、58、和一些租房APP。期間需要考慮兩個人的通勤范圍來選地段,由于對交通的不熟悉,只有選擇自己附近的較貴的地段,花了很多時間閱覽趕集或者58里的個人房源信息,然而個人房源信息中仍充斥著大量中介,抱著一點希望打了幾個電話,得到的回答都是這個價位根本租不到,再高點也租不到(大都與發布的房源信息不符)。最后終于還是在宿舍關閉前一個星期租到一個性價比還可以的隔斷。畢竟隔斷還是不方便的,所以打算在室友找到工作后換一個新地方,于是就有了這個租房腳本和課程。
相信也有不少的應屆畢業生可能會遭遇同樣的境況,希望這門課能真的幫到大家,也許不光是在租房子方面。推薦閱讀知乎上的一個問題:你有哪些用計算機技能解決生活問題的經歷?
總結一下租房難的癥結:
沒錢。
小中介發布的價位一般都是假的,會浪費你很多時間。
對交通路線不熟悉以致于選擇面窄。
如果是多人,得同時考慮多人的通勤時間。
本課程將解決的問題:
學習了技術,增長了知識,就能找到好工作,找到好工作就能有錢。
這次選的房源信息來自58的品牌公寓館,所以沒有那種小中介,價位就我和我室友來說可以接受。其實可以做個分類器過濾趕集上的中介來找低價個人房源的,有需要的同學可以試一下。
通勤范圍在地圖上圈出,解決了對交通路線不熟悉的問題
本課程是單人版的,但代碼中只要刪掉一個語句就能當多人用了(但是路徑規劃的功能是只能給一個人用)。如果是直接拿來多人用的話,還是開多個頁面比較好。
最終效果圖如下:
由于沒做前端兼容,導致右上角崩了。自用的小工具其實也不用整多好看,效率第一。
如圖,劃出來的大片藍***塊就是距離工作地點一小時車程內的區域。藍色的標記就是房源,點擊后會自動給出路徑規劃和房源地址。紅色標記(不是"終")是工作地點,在圖里被擋住了。工作地點的輸入框有自動補完的功能,也是很方便的。至于房源文件我們會通過編寫Python腳本在抓取房源信息后生成。
2. 課程知識點
本課程項目完成過程中,我們將學習:
requests、BeautifulSoup、csv?等庫的簡單使用
高德地圖 Javascript API 的使用
二、實驗環境
打開終端,進入?Code?目錄,創建?rent_proj?文件夾, 并將其作為我們的工作目錄。
$?cd?Code $?mkdir?rent_proj?&&?cd?rent_proj
安裝需要的庫:
$?sudo?apt-get?install?python-bs4
三、實驗原理
實驗中會用到三個文件:crawl.py,rent.csv與index.html,其中rent.csv由crawl.py生成,是房源文件。crawl.py是一個非常簡單的爬取網頁的腳本。index.html是最重要的顯示地圖的部分。實現的流程大致如下:
我為什么不把js代碼和css代碼從index.html中分出來呢,寫腳本怎么順手怎么來就好。
代碼沒有難度,主要就是看看幾個API如何使用,下面給出文檔鏈接:
高德 JavaScript API 幫助文檔
高德 JavaScript API 示例中心
Requests: HTTP for Humans
Beautiful Soup 4.2.0 文檔
csv — CSV 文件的讀寫
四、實驗步驟
1. 分析頁面
先分析一下我們需要爬取的頁面:http://bj.58.com/pinpaigongyu/
選擇好目標價位:
打開查看器:
審查元素,分頁上的 1 2 3 4 5 隨便選一個:
大致了解了它的路徑規則:/pingpaigongyu/pn/{page}/minprice={min_rent}_{max_rent}
對比第一頁和第一千頁:
經過觀察,決定將頁面有無.list元素來作為是否已讀取完所有房源的判斷條件。
看一下頁面能夠提供給我們什么信息:
框框圈出的信息對我們來說已經足夠了。當然房源的具體經緯度也可以點進去查看代碼得到:
簡便起見每一個房源就只記錄以下信息:[房源名稱,地址,月租,房源url地址]。
其中地址直接取房源名稱里的小區名,有的房源第二列是公寓名而不是小區名,那就只能取第一列作為地址了,有些公寓如果合并第一列第二列地圖上會搜不到。
2. 編寫Python腳本
在工作目錄下創建crawl.py文件,這里先直接給出全部代碼。
#-*-?coding:utf-8?-*-from?bs4?import?BeautifulSoupfrom?urlparse?import?urljoin import?requests import?csv url?=?"http://bj.58.com/pinpaigongyu/pn/{page}/?minprice=2000_4000"#已完成的頁數序號,初時為0page?=?0csv_file?=?open("rent.csv","wb")? csv_writer?=?csv.writer(csv_file,?delimiter=',')while?True: ????page?+=?1 ????print?"fetch:?",?url.format(page=page) ????response?=?requests.get(url.format(page=page)) ????html?=?BeautifulSoup(response.text) ????house_list?=?html.select(".list?>?li")????#?循環在讀不到新的房源時結束 ????if?not?house_list:????????break ????for?house?in?house_list: ????????house_title?=?house.select("h2")[0].string.encode("utf8") ????????house_url?=?urljoin(url,?house.select("a")[0]["href"]) ????????house_info_list?=?house_title.split()????????#?如果第二列是公寓名則取第一列作為地址 ????????if?"公寓"?in?house_info_list[1]?or?"青年社區"?in?house_info_list[1]: ????????????house_location?=?house_info_list[0]????????else: ????????????house_location?=?house_info_list[1] ????????house_money?=?house.select(".money")[0].select("b")[0].string.encode("utf8") ????????csv_writer.writerow([house_title,?house_location,?house_money,?house_url]) csv_file.close()
鑒于爬的量不大所以就簡單處理了。
csv一般用作表格文件,直接用文本編輯器打開也可讀,行與行之間就是換行來隔開,列與列之間就是用逗號(也可指定其它字符)隔開,Python標準庫中的csv庫就是用來讀寫csv文件的。
這里只需要寫csv文件:
#導入csvimport?csv#?打開rent.csv文件csv_file?=?open("rent.csv","wb")? #?創建writer對象,指定文件與分隔符csv_writer?=?csv.writer(csv_file,?delimiter=',') #?寫一行數據csv_writer.writerow([house_title,?house_location,?house_money,?house_url])#關閉文件csv_file.close()
requests是一個對使用者非常友好的http庫,看一遍Quickstart就能基本掌握它的使用。
用到它的地方也就僅僅兩句:
#?抓取目標頁面response?=?requests.get(url.format(page=page)) #?獲取頁面正文response.text
Beautiful Soup是一個用來解析html或者xml文件的庫,支持元素選擇器,使用起來也非常方便:
#?創建一個BeautifulSoup對象html?=?BeautifulSoup(response.text) #?獲取class=list的元素下的所有li元素house_list?=?html.select(".list?>?li") #?得到標簽包裹著的文本house.select("h2")[0].string.encode("utf8") #?得到標簽內屬性的值house.select("a")[0]["href"]
由于讀取到的鏈接路徑是相對路徑,所以需要urljoin得到完整的url地址。
urljoin(url,?house.select("a")[0]["href"])
實驗樓環境中文粘貼進去會變成???,這樣的話幾個公寓房源的位置就不能確定了,不過不影響做實驗。
講解完畢,運行代碼python crawler.py:
可能要1分半鐘,可以先去玩一局掃雷。
筆者用自己的電腦跑差不多是20多秒。
此時目錄下已生成了rent.csv:
注意如果你太頻繁地抓取頁面IP可能會被屏蔽,那樣就抓不到頁面而是直接報錯了。如果抓取不成功的話,可以使用這個文件繼續接下來的實驗:
$?wget?https://labfile.oss.aliyuncs.com/courses/599/rent.csv
3. 設計頁面
頁面大框架可直接從示例中心復制:高德 JavaScript API 示例中心
這里先給出全部的設計代碼,新建index.html復制粘貼下面的代碼:
???? ???? ???? ????講解一下部分代碼:
這一句中你會看到key這個參數,它需要你注冊高德的開發者用戶,創建應用才能得到,由于 JS API 不像它家的 Web API 一樣有流量限制,所以這個key大可隨意使用。
亚洲精品乱码久久久久66| 亚洲av高清在线观看一区二区| 亚洲国产精品无码久久青草| 亚洲精品中文字幕无码A片老| 亚洲人6666成人观看| 亚洲综合一区二区| 337p日本欧洲亚洲大胆精品555588| 亚洲AV福利天堂一区二区三| 久久亚洲免费视频| 亚洲国产天堂久久综合网站| 久久91亚洲精品中文字幕| 亚洲AV无码日韩AV无码导航| 亚洲国产精品VA在线看黑人| 久久亚洲成a人片| 亚洲ⅴ国产v天堂a无码二区| 99久久精品国产亚洲| 亚洲精品福利视频| 亚洲色欲或者高潮影院| 亚洲人成电影青青在线播放| 亚洲va久久久久| 亚洲另类无码专区首页| 亚洲av片在线观看| 亚洲国产精品嫩草影院久久| 国产亚洲成人在线播放va| 亚洲欧洲无码AV电影在线观看 | 亚洲中文字幕无码一区| 亚洲日韩小电影在线观看| 日韩亚洲人成在线综合日本| 久久久久久亚洲AV无码专区| 亚洲欧洲日产专区| 亚洲成年网站在线观看| 亚洲AV香蕉一区区二区三区| 免费观看亚洲人成网站| 老司机亚洲精品影视www| 亚洲国产精品高清久久久| 亚洲视频手机在线| 最新亚洲卡一卡二卡三新区| 午夜在线亚洲男人午在线| 亚洲精品无码永久中文字幕| 亚洲视频精品在线| 亚洲va精品中文字幕|