1. 程式人生 > >零基礎掌握百度地圖興趣點獲取POI爬蟲(python語言爬取)(基礎篇)

零基礎掌握百度地圖興趣點獲取POI爬蟲(python語言爬取)(基礎篇)

region map 基礎 輸入 filter put mark page -h

實現目的:爬取昆明市範圍內的全部中學數據,包括名稱、坐標。

先進入基礎篇,本篇主要講原理方面,並實現步驟分解,為python代碼編寫打基礎。
因為是0基礎開始,所以講得會比較詳細。
如實現目的所講,爬取昆明市全部中學數據,就是獲取百度地圖上昆明市範圍內所有關鍵字帶中學的地理信息數據(興趣點)。
怎麽把百度地圖上的數據抓取下來呢?
以下是教程:
本篇目錄如下:
1. 百度地圖開放平臺註冊,AK獲取
2.關於ak的說明
3.請求URL說明
4.百度地圖坐標拾取器
5.以坐標範圍獲取興趣點POI
6.用excel完成URL陣列

1.百度地圖開放平臺註冊,AK獲取。
(1)
如果想獲取POI數據,首先要登陸百度地圖開放平臺(http://lbsyun.baidu.com/),完成註冊。
這個平臺是百度地圖為開發者提供接口用的,有很多其他的功能,這裏只講POI爬取相關。
當然,有百度賬號的話,直接登陸就可以。
這個界面很熟悉,不多說。

技術分享圖片

(2)登陸百度地圖開放平臺後,按照圖面上的序號操作。
一、點擊進入控制臺;
二、點擊進入創建應用;
三、起個應用名稱;
四、如果有必要,設置個IP白名單啥的,限制調用ak的電腦;
五、提交。
六、其他默認,不用改。

技術分享圖片

然後你就能看到自己創建的ak了。

技術分享圖片

2.關於ak的說明。
關於這部分的解釋,詳細的可以看開發文檔——web服務API部分。

技術分享圖片

這裏說一下配額方面的問題。
首先百度不支持你創建了一個ak就可以隨便用,對於大多數未認證用戶,每天的配額是有限的,不能超過十萬次,每分鐘不能超過6千次。
當然這個配額主要是觸發定位功能的。
在爬取POI上,用一次ak生成的URL頁面只能顯示20個興趣點的信息,而一個坐標範圍內,最多能生成20個URL頁面。
也就是說,一個坐標範圍內,用ak生成的URL頁面最多能爬取到400個興趣點的信息。
如果昆明市中學不超過400個,那麽一個坐標範圍就夠了,但是如果超過400個,那就不夠用了。
關於ak配額的說明先到這裏,下面的步驟詳解中還會涉及到。
3.請求URL說明。
把下面這個網址復制到瀏覽器裏看看。
http://api.map.baidu.com/place/v2/search?query=中學&region=昆明&output=json&ak=9s5GSYZsWbMaFU8Ps2V2VWvDlDlqGaaO
是不是生成了下面的一個頁面?

技術分享圖片

這就是爬取到的一頁昆明中學的信息。
然後我們分段解釋這行URL。
http://api.map.baidu.com/place/v2/search?query=中學&region=昆明&output=json&ak=9s5GSYZsWbMaFU8Ps2V2VWvDlDlqGaaO
http://api.map.baidu.com/place/v2/search? 這個前綴就是在百度地圖(API)上尋找。
query=中學 查詢關鍵字是中學。
region=昆明 查詢地區是昆明。
output=json 以json格式來輸出。
ak=9s5GSYZsWbMaFU8Ps2V2VWvDlDlqGaaO ak是9s5GSYZsWbMaFU8Ps2V2VWvDlDlqGaaO。(這個就是剛才申請的ak,圖上打了馬賽克,我為了寫教程便於理解,沒有給它設置IP白名單,就放在這裏了,大家練習用吧。)
這行URL很好理解,照貓畫虎,如果我要找北京的飯店,其URL就是:http://api.map.baidu.com/place/v2/search?query=飯店&region=北京&output=json&ak=9s5GSYZsWbMaFU8Ps2V2VWvDlDlqGaaO

但我們發現,網頁上呈現的數據一共就四五條,昆明的中學,北京的飯店,不可能就這麽幾個。
接著以昆明的中學為例,對這個URL進行改進。
http://api.map.baidu.com/place/v2/search?query=中學&region=昆明&page_size=20&page_num=0&output=json&ak=9s5GSYZsWbMaFU8Ps2V2VWvDlDlqGaaO
把這個URL復制到瀏覽器裏看一看,仔細數一下網頁上爬下來的中學數量,20個。
從這個實踐中能理解上文中提到的,每個URL頁面只能顯示20個興趣點的信息了吧!
然後把兩個URL仔細對比一下:
第一個:
http://api.map.baidu.com/place/v2/search?query=中學&region=昆明&output=json&ak=9s5GSYZsWbMaFU8Ps2V2VWvDlDlqGaaO
第二個:
http://api.map.baidu.com/place/v2/search?query=中學&region=昆明&page_size=20&page_num=0&output=json&ak=9s5GSYZsWbMaFU8Ps2V2VWvDlDlqGaaO
看看這兩個有什麽不同?
第二個多了一個page_size=20&page_num=0,這個是什麽意思呢?一共能生成20個URL頁面,這個是第0個,我們知道,程序語言的排號,一般都是從0開始的。
把page_size=20&page_num=0改成page_size=20&page_num=1,試一試,看看第二個頁面生成了什麽,再改成page_size=20&page_num=2……
改成page_size=20&page_num=19的時候,URL是http://api.map.baidu.com/place/v2/search?query=%E4%B8%AD%E5%AD%A6&region=%E6%98%86%E6%98%8E&page_size=20&page_num=19&output=json&ak=9s5GSYZsWbMaFU8Ps2V2VWvDlDlqGaaO。

技術分享圖片

改成page_size=20&page_num=20試一試,URL是http://api.map.baidu.com/place/v2/search?query=%E4%B8%AD%E5%AD%A6&region=%E6%98%86%E6%98%8E&page_size=20&page_num=20&output=json&ak=9s5GSYZsWbMaFU8Ps2V2VWvDlDlqGaaO。
顯示的是下圖,沒有興趣點,這回好理解上文中提到的,一個坐標範圍內,最多能生成20個URL頁面了吧!

技術分享圖片

這回我們知道了URL最多就能爬取400個興趣點,那我們要獲取的興趣點數量遠遠超過400個,可怎麽辦呢?
別急,接著往下看。

4.百度地圖坐標拾取器
在回答上面的問題之前,我們先了解一個工具,就是坐標拾取器。
進入開發文檔——工具支持——坐標拾取器。
打開坐標拾取器,進入百度地圖坐標拾取系統。

技術分享圖片

在這個拾取坐標系統上,一,先設定範圍;二,在地圖上點一下;三,看到當前坐標點如下,復制一下,就可以得到這點的百度坐標了。
自己估摸著一個矩形範圍,拾取一個左下角坐標,再拾取一個右上角坐標。

技術分享圖片

要是實在估摸不好,找一張全國行政區劃圖看看。
這個稍微有點麻煩,我以後會再寫一個教程介紹怎麽獲取行政區域範圍。
拾取一個昆明範圍的矩形坐標。
左下角:102.174112,24.390894
右上角:103.678942,26.548645
(獲取矩形左下角和右上角坐標值的簡捷方式在進階篇中。)

5.以坐標範圍獲取興趣點POI。
我們現在已經知道昆明的坐標範圍了。
那麽把上面的URL改一改。
這個是上文中的URL:http://api.map.baidu.com/place/v2/search?query=中學&region=昆明&page_size=20&page_num=0&output=json&ak=9s5GSYZsWbMaFU8Ps2V2VWvDlDlqGaaO
改動後的URL:http://api.map.baidu.com/place/v2/search?query=中學& bounds=24.390894,102.174112,26.548645,103.678942&page_size=20&page_num=0&output=json&ak=9s5GSYZsWbMaFU8Ps2V2VWvDlDlqGaaO
對比一下,有什麽不一樣的!
之前的範圍屬性是:region=昆明
改動後的範圍屬性是:bounds=24.390894,102.174112,26.548645,103.678942
註意,經緯度範圍是bounds=左下角緯度,左下角經度,右上角緯度,右上角經度。
其他的都沒有變化,以坐標範圍爬取,也只能最多爬400個興趣點。
好了,回答之前提出的問題,如果興趣點數量遠超過400個,怎麽辦?
可以把矩形範圍分割啊!
把昆明市的範圍換成經緯度,左下角和右上角構成了一個矩形,如果一塊矩形中的興趣點超過了400個,那麽我們可以把這個矩形切分,變成四個矩形。分別獲取四個小矩形範圍內的興趣點,然後匯總。
四個不夠的話,切分成八個,八個不夠的話,切分成十六個,只要保證每個矩形內興趣點不超過400個就行。
至於應該切分多少個,怎麽切分,靠經驗,自己估摸。
說到這裏,這就是後續python編程的思路了。

技術分享圖片

6.用excel完成URL陣列。
這個算是為之後的python爬蟲腳本編寫預熱了。
我們用excel強化一下編碼思路。

目的:
爬取昆明市中學的興趣點POI。
關鍵詞:中學
已有ak:9s5GSYZsWbMaFU8Ps2V2VWvDlDlqGaaO
昆明市坐標範圍:
左下角:24.390894,102.174112
右上角:26.548645,103.678942
URL模板:
http://api.map.baidu.com/place/v2/search?query=中學& bounds=24.390894,102.174112,26.548645,103.678942&page_size=20&page_num=0&output=json&ak=9s5GSYZsWbMaFU8Ps2V2VWvDlDlqGaaO

把坐標範圍輸入到excel中,計算4個矩形的範圍,然後4個矩形對應4列URL(page_num值0到19),用excel函數生成了4列共80個URL。

技術分享圖片

在這些URL中,只有兩個屬性是有變動的,既是bounds(邊界範圍),page_num(頁碼0-19),其他都是不變化的。
URL的生成是有規律可循的。
這就是編程的思路,代碼篇講解。

轉自-------http://blog.csdn.net/sinat_41310868/article/details/78746094

零基礎掌握百度地圖興趣點獲取POI爬蟲(python語言爬取)(基礎篇)