中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python爬蟲實例_利用百度地圖API批量獲取城市所有的POI點

發布時間:2020-09-03 22:18:51 來源:腳本之家 閱讀:571 作者:WenWu_Both 欄目:開發技術

上篇關于爬蟲的文章,我們講解了如何運用Python的requests及BeautifuiSoup模塊來完成靜態網頁的爬取,總結過程,網頁爬蟲本質就兩步:

1、設置請求參數(url,headers,cookies,post或get驗證等)訪問目標站點的服務器

2、解析服務器返回的文檔,提取需要的信息。

而API的工作機制與爬蟲的兩步類似,但也有些許不同:

1、API一般只需要設置url即可,且請求方式一般為“get”方式

2、API服務器返回的通常是json或xml格式的數據,解析更簡單

也許到這你就明白了,API簡直就是開放的“爬蟲”呀,可以告訴你,基本就是這個意思。好的,言歸正傳,本篇我們就演示如何運用Python結合百度地圖API來批量獲取POI(興趣點)。

所謂POI(興趣點),指的是人們感興趣,比較常去的地方,比如銀行、醫院、學校等,利用城市的POI的空間屬性可以做非常多的事情,至于什么事情呢,此處省略10000字。。。

說干就干,Let's go!

(1)創建百度地圖應用

訪問百度地圖API需要一個信令(AK),打開百度地圖開放平臺,點擊右上角“API控制臺”,即進入了百度地圖的開發界面。

Python爬蟲實例_利用百度地圖API批量獲取城市所有的POI點

選擇“創建應用”-應用類型勾選“瀏覽器端”–勾選所用到的服務(一般全選即可),此時就創建好了應用賬號,得到“AK”

Python爬蟲實例_利用百度地圖API批量獲取城市所有的POI點

Python爬蟲實例_利用百度地圖API批量獲取城市所有的POI點

(2)Place API 及Web服務API

打開百度地圖API的POI模塊,網址:http://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-placeapi,這個頁面詳細介紹了Place API的請求參數及返回數據的情況。

可以看到,Place API 提供區域檢索POI服務與POI詳情服務。

1. 區域檢索POI服務提供三種區域檢索方法:

a.城市內檢索(對應JavaScriptAPI的Search方法)

b.矩形檢索(對應JavaScript API的SearchInBound方法)

c.圓形區域檢索(對應JavaScript的SearchNearBy方法)。

2. POI詳情服務提供查詢單個POI的詳情信息,如好評。

并給出了請求的一個示例,設置檢索城市為北京,檢索關鍵字為“飯店”,檢索后返回10條數據:

http://api.map.baidu.com/place/v2/search?q=飯店&region=北京&output=json&ak=您的AK

將上述url粘貼到瀏覽器里,返回的數據如下:

Python爬蟲實例_利用百度地圖API批量獲取城市所有的POI點

上圖是將返回的json數據解析之后的結果,可以看到,服務器返回了10條北京市的飯店的信息,包括飯店名稱、經緯度、地址、聯系電話等。

具體的參數設置,自行去該網頁去看吧,這里就不再贅述,這里我們主要利用“矩形檢索”的方式來獲取整個城市的特定POI信息,其url格式如下:

http://api.map.baidu.com/place/v2/search?query=美食&page_size=10&page_num=0&scope=1&bounds=39.915,116.404,39.975,116.414&output=json&ak={您的密鑰}

Python爬蟲實例_利用百度地圖API批量獲取城市所有的POI點

通過實驗可以發現,一個矩陣區域最多返回400(20*20)個POI點,即page_size = 20 & page_total = 20,雖然官方文檔里說一個區域返回760+都不成問題的,但是測試了一下,發現并沒有這么多,最多400個。

Python爬蟲實例_利用百度地圖API批量獲取城市所有的POI點

顯然,整個城市不可能僅400個特定描述的POI點,所以我們需要對整個城市進行分片操作,然后每片進行訪問,通過Python的循環實現。

(3)獲取城市特定POI點集合

比如:我們想獲取北京市四環以內所有飯店的信息,即可通過上述步驟借助Python快速實現,廢話不多說,直接上代碼:

# -*- coding: utf-8 -*-
# Python 2.7
# 提取城市的POI點信息并將其保存至MongoDB數據庫
import urllib2 
import json 
from pymongo import MongoClient
left_bottom = [116.282387,39.835862]; # 設置區域左下角坐標(百度坐標系)
right_top = [116.497405,39.996569]; # 設置區域右上角坐標(百度坐標系)
part_n = 2; # 設置區域網格(2*2)
client = MongoClient('localhost',27001)
db = client.transdata
db.authenticate("user", "password")
col = db.taxi; # 連接集合
url0 = 'http://api.map.baidu.com/place/v2/search?';
x_item = (right_top[0]-left_bottom[0])/part_n;
y_item = (right_top[1]-left_bottom[1])/part_n;
query = '飯店'; #搜索關鍵詞設置
ak = 'xxxxxxxxxxxxxxxxxxxxxx'; #百度地圖api信令
n = 0; # 切片計數器
for i in range(part_n):
 for j in range(part_n):
 left_bottom_part = [left_bottom[0]+i*x_item,left_bottom[1]+j*y_item]; # 切片的左下角坐標
 right_top_part = [right_top[0]+i*x_item,right_top[1]+j*y_item]; # 切片的右上角坐標
 for k in range(20):
  url = url0 + 'query=' + query + '&page_size=20&page_num=' + str(k) + '&scope=1&bounds=' + str(left_bottom_part[1]) + ',' + str(left_bottom_part[0]) + ','+str(right_top_part[1]) + ',' + str(right_top_part[0]) + '&output=json&ak=' + ak; 
  data = urllib2.urlopen(url);
  hjson = json.loads(data.read());
  if hjson['message'] == 'ok':
  results = hjson['results'];  
  for m in range(len(results)): # 提取返回的結果
   col.insert_one(results[m]);
 n += 1;
 print '第',str(n),'個切片入庫成功'

執行為上述代碼,運行結果如下:

Python爬蟲實例_利用百度地圖API批量獲取城市所有的POI點

Python爬蟲實例_利用百度地圖API批量獲取城市所有的POI點

可以看到,我們將北京市四環以內區域分成4個切片來進行處理,之所以分切片處理,主要是單個區域訪問最多返回400個結果,當區域較大的時候,區域內往往不止400個,所以講大區域進行切片處理,最后,我們通過數據聚合操作,發現返回的結果總共1014個。(理論上應該返回1600,實際返回1014,說明切片的數量是合適的)

Python爬蟲實例_利用百度地圖API批量獲取城市所有的POI點

好的,我們本篇的分享到這里就要結束了,最后只想說,API真的是個好東西,科學地使用它我們可以做出很多炫酷的應用,像現在比較活躍的數據型應用,其數據接口基本都是基于API形式的,后面的分享我們還會用到更多API的,大家一起期待吧,哈哈,今天就到這里了,各位回見。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

丹东市| 凤凰县| 阿拉尔市| 平度市| 错那县| 东乌| 秀山| 安塞县| 正蓝旗| 靖远县| 黑山县| 定边县| 合肥市| 文化| 鹰潭市| 丰台区| 湘阴县| 抚宁县| 漳浦县| 威远县| 洛南县| 昌江| 右玉县| 松江区| 徐闻县| 筠连县| 搜索| 彩票| 孙吴县| 塘沽区| 华亭县| 民丰县| 加查县| 阳春市| 从江县| 龙山县| 梨树县| 东城区| 通江县| 镇平县| 普洱|