863
Python
我用 Python 爬取了全國 4500 個熱門景點,告訴你國慶哪裏去不得?
新媒體管家
作者 大吉大利小米醬
本文轉自簡書,轉載需授權
金秋九月,丹桂飄香,在這秋高氣爽,陽光燦爛的收獲季節裏,我們送走了一個個暑假餘額耗盡哭著走向校園的孩子們,又即將迎來一年一度偉大祖國母親的生日趴體(無心上班,迫不及待想為祖國母親慶生)。
那麼問題來了,去哪兒玩呢?百度輸了個“國慶”,出來的第一條居然是“去哪裏旅遊人少”……emmmmmmm,因缺思廳。
於是我萌生了通過旅遊網站的景點銷量來判斷近期各景點流量情況的想法(這個想法很危險啊)。
所以這次的目標呢,是爬去哪兒網景點頁麵,並得到景點的信息,大家可以先思考下大概需要幾步。
本文建議有一定 Python 基礎和前端(html,js)基礎的朋友閱讀,零基礎可以去看我之前的文。(咳咳,不能總更小白文,這樣顯得我不(mei)夠(you)專(xue)業(xi))。
百度的地圖 API 和 echarts
因為前幾次爬蟲都是爬一些文本信息,做一下詞雲之類的,我覺得:沒!意!思!了!這次正好爬的是數據,我決定用數據的好基友——圖表來輸出我爬取的數據,也就是說我要用爬取的景點銷量以及景點的具體位置來生成一些可視化數據。
安利一下百度的地圖 API 和 echarts,前者是專門提供地圖 API 的工具,聽說好多 APP 都在用它,後者是數據處理居家旅行的好夥伴,用了之後,它好,我也好(隱約覺得哪裏不對)。
API 是什麼,API 是應用程序的編程接口,就好像插頭與插座一樣,我們的程序需要電(這是什麼程序?),插座中提供了電,我們隻需要在程序中寫一個與插座匹配的插頭接口,就可以使用電來做我們想做的事情,而不需要知道電是如何產生的。
引入數據後的百度熱力圖
通過 API 對接的開發者與服務商
確定輸出文件
有人可能說,我已經懂了 API 是啥意思了,可是咋個用呢。關於這一點,我很負責任的告訴你:我也不會。
但是!百度地圖提供了很多 API 使用示例,有 html 基礎,大致可以看懂,有 js 基礎就可以嚐試改函數了(不會 js 的,我默默地複製源代碼),仔細觀察源代碼,可以知道熱力圖生成的主要數據都存放在 points 這個變量中。
這種[,]格式的數據,是一種 json 格式的數據,由於具有自我描述性,所以比較通俗易懂,大概可以知道這裏的三個值,前兩個是經緯度,最後一個應該是權重(我猜的)。
也就是說,如果我希望將景點的熱門程度生成為熱力圖,我需要得到景點的經緯度,以及它的權重,景點的銷量可以作為權重,並且這個數據應該是 json 格式的呈現方式。
echarts 也是一樣滴(*^__^*)。
爬取數據
這次的爬蟲部分是比較簡單的。分析網址(去哪兒景點)爬取分頁中信息(景點經緯度、銷量)轉為 json 文件。
分析去哪兒景點頁的網址,可得出結構:https://piao.qunar.com/ticket/list.htm?keyword=搜索地點®ion=&from=mpl_search_suggest&page=頁數
這次沒有用正則來匹配內容,而使用了 xpath 匹配,非常好用。
這裏把每個景點的所有信息都爬下來了(其實是為了練習使用 xpath……)。
使用了 while 循環,for 循環的 break 的方式是發現無銷量時給 i 值賦零,這樣 while 循環也會同時結束。
地址的匹配使用 re.sub() 函數去除了 n 多複雜信息,這點後麵解釋。
輸出本地文本
為了防止代碼運行錯誤,維護代碼運行的和平,將輸出的信息列表存入到 excel 文件中了,方便日後查閱,很簡單的代碼,需要了解 pandas 的用法。
百度經緯度 API
非常悲傷的,(ಥ﹏ಥ)我沒找到去哪兒景點的經緯度,以為這次學(zhuang)習(bi)計劃要就此流產了。(如果有人知道景點經緯度在哪裏請告訴我)
但是,enhahhahahaha,我怎麼會放棄呢,我又找到了百度經緯度 API。
網址:https://api.map.baidu.com/geocoder/v2/?address=地址&output=json&ak=百度密鑰,修改網址裏的“地址”和“百度密鑰”,在瀏覽器打開,就可以看到經緯度的 json 信息。
百度密鑰申請方法:https://jingyan.baidu.com/article/363872eccda8286e4aa16f4e.html
這樣我就可以根據爬到的景點地址,查到對應的經緯度辣!Python 獲取經緯度 json 數據的代碼如下:
觀察獲取的 json 文件,location 中的數據和百度 API 所需要的 json 格式基本是一樣,還需要將景點銷量加入到 json 文件中,這裏可以了解一下 json 的淺拷貝和深拷貝知識,最後將整理好的 json 文件輸出到本地文件中。
在設置獲取經緯度的地址時,為了匹配到更準確的經緯度,我選擇了匹配景點地址,然而,景點地址裏有各種神奇的地址,帶括號解釋在 XX 對麵的,說一堆你應該左拐右拐各種拐就能到的,還有英文的……
於是就有了第三章中複雜的去除信息(我終於圓回來了!)。
然而,就算去掉了複雜信息,還有一些匹配不到的景點地址,於是我使用了嵌套 try,如果景點地址匹配不到;就匹配景點名稱,如果景點名稱匹配不到;就匹配景點所在區域,如果依然匹配不到,那我……那我就……那我就跳過ㄒ_ㄒ……
身為一個景點,你怎麼能,這麼難找呢!不要你了!
這裏生成的三個 json 文件,一個是給百度地圖 API 引入用的,另兩個是給 echarts 引入用的。
網頁讀取 json 文件
將第二章中所述的百度地圖 API 示例中的源代碼複製到解釋器中,添加密鑰,保存為 html 文件,打開就可以看到和官網上一樣的顯示效果。
echarts 需要在實例頁麵,點擊頁麵右上角的 EN 切換到英文版,然後點擊 download demo 下載完整源代碼。
根據 html 導入 json 文件修改網頁源碼,導入 json 文件。
這裏使用了 jQuery之後,即使網頁調試成功了,在本地打開也無法顯示網頁了,在 chrome 中右鍵檢查,發現報錯提示是需要在服務器上顯示,可是,服務器是什麼呢?
百度了一下,可以在本地創建一個服務器,在終端進入到 html 文件所在文件夾,輸入python -m SimpleHTTPServer,再在瀏覽器中打開https://127.0.0.1:8000/,記得要將 html 文件名設置成 index.html 哦!
後記
因為注冊但沒有認證開發者賬號,所以每天隻能獲取 6K 個經緯度 API(這是一個很好的偷懶理由),所以我選擇了熱門景點中前 400 頁(每頁 15 個)的景點。
結果可想而知,(ಥ﹏ಥ)為了調試因為數據增多出現的額外 Bug,最終的獲取的景點數據大概在 4500 條左右(爬取時間為 2017 年 9 月 10 日,爬取關鍵詞:熱門景點,僅代表當時銷量)。
熱門景點熱力圖
熱門景點示意圖
這些地圖上很火爆的區域,我想在國慶大概是這樣的
這樣的
還有這樣的
將地圖上熱門景點的銷量 Top20 提取出來,大多數都是耳熟能詳的地點,帝都的故宮排在了第一位,而大四川則占據了 Top5 中的三位,排在 Top20 中四川省景點就占了 6 位。
如果不是因為地震,我想還會有更多的火爆的景點進入排行榜的~這樣看來如果你這次國慶打算去四川的話,可以腦補到的場景就是:人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人……
熱門景點銷量Top20
於是我又做了一個各城市包含熱門景點數目的排行,沒想到在 4 千多個熱門景點中,數目最多的竟是我大浙江,是第二個城市的 1.5 倍,而北京作為首都也……可以說是景點數/總麵積的第一位了。
主要城市熱門景點數
這些城市有辣麼多熱門景點,都是些什麼級別的景點呢?由下圖看來,各城市的各級別景點基本與城市總熱門景點呈正相關,而且主要由 4A 景區貢獻而來。
主要城市熱門景點級別
既然去哪些地方人多,去哪裏景多都已經知道了,那再看看去哪些地方燒得錢最多吧。
下圖是由各城市景點銷售起步價的最大值-最小值扇形組成的圓,其中湖北以單景點銷售起步價 600 占據首位。
但也可以看到,湖北的景點銷售均價並不高(在紅色扇形中的藏藍色線條)。而如果國慶去香港玩,請做好錢包減肥的心理和生理準備(•̀ω•́)。
PS:寫了個網頁,展示百度地圖的熱力圖效果和 echarts 的景點排行榜,方便大家查看。
熱力度效果:https://easyinfo.online
gayhub源碼:https://github.com/otakurice/notravellist/tree/master
寫完這篇文的時候發現 echarts 有針對 Python 的模塊可以引入,所以打算去學一下 Django、Flask 之類的 Web 框架,最近會更一些純理論的意識流文,大家一起進步吧~
參考資料:
1.地圖API:https://developer.baidu.com/map/reference/index.php
2.echarts:https://echarts.baidu.com/
3.API使用示例:https://developer.baidu.com/map/jsdemo.htm#c1_15
4.json:https://www.runoob.com/json/json-tutorial.html
5.xpath:https://www.runoob.com/xpath/xpath-tutorial.html
6.pandas:https://python.jobbole.com/84416/
7.百度經緯度api:https://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-geocoding
8.淺拷貝和深拷貝:https://python.jobbole.com/82294/
9.html導入json文件:https://www.jb51.net/article/36678.htm
作者簡介:
子科技大學畢業的機械設計喵一枚,致力於帶領 Python 小白們打破《從入門到放棄》的魔咒,夢想成為一名程序媛,坐標杭州~歡迎公司勾搭。
最後,懷著敬畏又惋惜的心情紀念一下 WePhone 創始人蘇享茂,在發生自殺事件之前我不認識他,我也不希望以這種方式認識他,希望程序員的世界永遠單純、沒有欺詐。
最後更新:2017-10-08 21:55:19