ChatGPT工作提效系列文章目錄
ChatGPT工作提效系列
- ChatGPT工作提效之初探路徑獨孤九劍遇強則強
- ChatGPT工作提效之在程序開發(fā)中的巧勁和指令(創(chuàng)建MySQL語句、PHP語句、Javascript用法、python的交互)
- ChatGPT工作提效之生成開發(fā)需求和報價單并轉為Excel格式
- ChatGPT工作提效之小鵝通二次開發(fā)批量API對接解決方案(學習記錄同步、用戶注冊同步、權益訂購同步、開發(fā)文檔)
前言
一般來說,利用 Python 對接百度地圖開放平臺 API 主要有以下幾種方式:
- 直接通過 requests 請求發(fā)送 HTTP 請求,獲取響應結果。
這種方式比較簡單直接,可以通過 requests 庫發(fā)送 GET、POST 等不同類型的請求,獲取響應結果后進行解析和處理。示例代碼:
import requests
# 百度地圖 API 地址
url = "https://api.map.baidu.com/place/v2/search"
# 請求參數(shù)
params = {
"query": "酒店",
"region": "北京",
"output": "json",
"ak": "你的百度地圖開發(fā)者密鑰"
}
# 發(fā)送請求
response = requests.get(url, params=params)
# 處理響應結果
if response.status_code == 200:
json_data = response.json()
# 進行數(shù)據(jù)解析和處理
else:
print("請求失敗,狀態(tài)碼為", response.status_code)
- 使用百度地圖 Python SDK 進行操作。
百度提供了 Python SDK 接口,可以方便地實現(xiàn)地理編碼、路線規(guī)劃、地圖可視化等功能。SDK 中提供了豐富的 API 接口,也支持上傳數(shù)據(jù)到百度云存儲等操作。使用 SDK,需要先安裝并導入百度地圖的 Python SDK 包,示例代碼:
from baidumap.api import PlaceSearch
ak = "你的百度地圖開發(fā)者密鑰"
params = {
"query": "酒店",
"region": "北京",
"output": "json"
}
search = PlaceSearch(ak=ak)
res = search.place_search(**params)
if res.status == 0:
print(res.results)
else:
print("請求失敗,狀態(tài)碼為", res.status)
- 使用百度地圖開放平臺提供的其他開發(fā)接口實現(xiàn)。
百度地圖開放平臺提供了多個開發(fā)接口,比如 JavaScript API、Web API、移動端 API 等等,選擇適合自己場景的 API 接口可以更加方便地實現(xiàn)自己的應用和功能。每個接口都會提供詳細的 API 文檔和示例,根據(jù)需求選擇合適的 API 接口進行開發(fā)即可。
那么如何利用ChatGPT來提效呢?
一、批量經(jīng)緯度坐標路線規(guī)劃
百度地圖路線規(guī)劃什么意思
百度地圖路線規(guī)劃,是指根據(jù)起始地點和終止地點,使用百度地圖提供的駕車、步行或公交等不同出行方式,計算出最優(yōu)路徑和行駛時間等信息的過程。具體來說,百度地圖路線規(guī)劃通常包含以下幾個步驟:
-
解析起始地點和終止地點的坐標:用戶輸入的起始地點和終止地點一般是以地址的形式呈現(xiàn),需要通過地理編碼的技術將其轉換為經(jīng)緯度坐標。
-
根據(jù)不同出行方式選擇最優(yōu)路徑:根據(jù)用戶選擇的出行方式(駕車、步行、公交等),通過算法和實時交通情況,選擇并規(guī)劃出一條最優(yōu)路徑。其中,駕車路徑規(guī)劃還包括交通限制、高速費用、實時路況等因素的考慮。
-
計算行駛距離和時間:在規(guī)劃出最優(yōu)路徑后,通過計算路徑距離和行駛時間等指標,提供給用戶參考。
-
顯示路徑和導航:將規(guī)劃的路徑展示到地圖上,標注主要路線和途經(jīng)的關鍵點,并提供導航和語音提示等輔助功能。
通過百度地圖路線規(guī)劃,可幫助人們更好地了解出行路線、行駛距離、行駛時間等相關信息,方便出行安排和交通規(guī)劃。
如何批量實現(xiàn)起始點路線規(guī)劃,進行計算距離和耗時,封裝成一個函數(shù),并導出excle表格。
以下是一個將起始點路線規(guī)劃計算封裝成函數(shù),并批量計算距離和耗時,并導出 Excel 表格的 Python 代碼示例:
首先,安裝必要的依賴:
pip install requests openpyxl
然后,導入需要的模塊:
import requests
import openpyxl
from openpyxl.utils import get_column_letter
from openpyxl.styles import Alignment
最后,定義封裝函數(shù)并調用:
def calculate_distance_duration(api_key, origins, destinations, excel_file_path):
"""
計算起始點路線規(guī)劃的距離和耗時,并保存到 Excel 表格中
:param api_key: 百度地圖開發(fā)者密鑰
:param origins: 起點坐標列表,每個元素為一個字符串,如 ['116.43213,39.99858', '116.118904, 24.46807']
:param destinations: 終點坐標列表,每個元素為一個字符串
:param excel_file_path: Excel 文件路徑
:return: 返回導出的 Excel 表格路徑
"""
# 定義 API 路徑和請求參數(shù)
api_url = 'http://api.map.baidu.com/direction/v2/driving'
api_params = {
'ak': api_key,
}
# 創(chuàng)建 Excel 工作簿和工作表
wb = openpyxl.Workbook()
ws = wb.active
# 創(chuàng)建表頭
ws['A1'] = '起始點'
ws['B1'] = '終點'
ws['C1'] = '距離(米)'
ws['D1'] = '耗時(分鐘)'
# 格式化表頭
for cell in ws[1]:
cell.font = openpyxl.styles.Font(bold=True)
cell.alignment = Alignment(horizontal='center', vertical='center')
# 遍歷起始點和終點坐標列表,計算路線規(guī)劃
for i, origin in enumerate(origins, start=2):
for j, destination in enumerate(destinations, start=2):
# 構造請求參數(shù)
api_params.update({
'origin': origin,
'destination': destination,
})
# 發(fā)送請求
response = requests.get(api_url, params=api_params)
if response.status_code == 200:
# 解析響應
json_data = response.json()
routes = json_data['result']['routes']
if routes:
# 獲取最短路線方案
route = min(routes, key=lambda x: x['distance'])
# 提取距離和時間
distance = route['distance']
duration = route['duration'] // 60
# 將結果保存到 Excel 表格中
row = [origin, destination, distance, duration]
for k, value in enumerate(row, start=1):
cell = ws.cell(row=i, column=k, value=value)
cell.alignment = Alignment(horizontal='center', vertical='center')
else:
print(f'未找到起點 {origin} 和終點 {destination} 之間的路線規(guī)劃')
else:
print(f'獲取起點 {origin} 和終點 {destination} 的路線規(guī)劃失敗,狀態(tài)碼:{response.status_code}')
# 自適應列寬
for column in ws.columns:
column_letter = get_column_letter(column[0].column)
ws.column_dimensions[column_letter].width = max(len(str(cell.value)) for cell in column)
# 保存 Excel 文件,并返回文件路徑
wb.save(excel_file_path)
return excel_file_path
使用示例:
# 測試數(shù)據(jù)
my_api_key = 'your_api_key'
start_locations = ['116.43213,39.99858', '116.118904, 24.46807']
end_locations = ['116.43187,39.99765', '117.2428, 31.8427']
# 計算起始點路線規(guī)劃的距離和耗時,并保存到 Excel 表格中
calculate_distance_duration(my_api_key, start_locations, end_locations, '計算距離.xlsx')
其中,參數(shù) api_key
為你的百度地圖開發(fā)者密鑰,`origins
二、批量爬取某城市指定類目POI
使用python如何批量爬取某城市指定類目POI,如杭州市拱墅區(qū)美食的興趣點,并導出excel表格,具體代碼怎么寫
1.爬取POI 數(shù)量有限制
以下是使用 Python 爬取某城市指定類目 POI(例如杭州市拱墅區(qū)美食)并導出 Excel 表格的代碼示例:
import requests
import openpyxl
# 輸入百度地圖開發(fā)者密鑰
MY_API_KEY = 'your_api_key'
# 定義 API 路徑
url = 'http://api.map.baidu.com/place/v2/search'
# 起點坐標和查詢類別
query = '美食'
region = '杭州市拱墅區(qū)'
page_size = 20 # 每頁數(shù)據(jù)量,最大為 20
page_num = 0 # 起始頁碼
# 創(chuàng)建 Excel 工作簿和工作表
wb = openpyxl.Workbook()
ws = wb.active
ws['A1'] = '名稱'
ws['B1'] = '經(jīng)度'
ws['C1'] = '緯度'
ws['D1'] = '地址'
# 循環(huán)爬取每一頁的數(shù)據(jù)
while True:
# 構建請求參數(shù)
payload = {
'query': query,
'region': region,
'ak': MY_API_KEY,
'output': 'json',
'page_size': page_size,
'page_num': page_num,
}
# 發(fā)送請求
response = requests.get(url, params=payload)
if response.status_code != 200:
print('請求錯誤', response.status_code)
break
# 解析響應
json_data = response.json()
if json_data.get('status') != 0:
print(f"獲取 {region} {query} 數(shù)據(jù)失敗: {json_data.get('message')}")
break
# 獲取總記錄數(shù)和當前頁碼的數(shù)據(jù)
total = json_data.get('total')
results = json_data.get('results')
# 將當前頁碼的數(shù)據(jù)寫入 Excel 表格
for i, result in enumerate(results, start=2 + page_num * page_size):
name = result.get('name')
location = result.get('location')
address = result.get('address')
ws.cell(row=i, column=1, value=name or '')
ws.cell(row=i, column=2, value=location.get('lng', '') or '')
ws.cell(row=i, column=3, value=location.get('lat', '') or '')
ws.cell(row=i, column=4, value=address or '')
# 如果已經(jīng)獲取了總記錄數(shù),則跳出循環(huán)
if total:
if page_num * page_size + len(results) >= total:
break
# 自增頁碼
page_num += 1
# 自適應列寬
for column in ws.columns:
cell = max(column, key=lambda x: len(str(x.value)))
width = min(100, max(10, len(str(cell.value))))
ws.column_dimensions[cell.column_letter].width = width
# 保存 Excel 文件
wb.save(f"{region}{query}.xlsx")
需要注意以下幾點:
- 首先,需要在百度地圖開放平臺上注冊并獲取自己的開發(fā)者密鑰 MY_API_KEY。
- 請求路徑參數(shù)
url
中的/place/v2/search
表示的是 POI 搜索,如果要獲取其他類型的信息,需要更改請求路徑,具體可以參考官方文檔。 - 請求參數(shù)
payload
中的query
和region
分別表示查詢類別和查詢地點,在實際使用中,可以根據(jù)自己的需求進行更改,如美食
可以改成酒店
或其他類別,杭州市拱墅區(qū)
可以改成浙江省杭州市
或其他地點。 - 更改請求參數(shù)中的
page_size
可以控制每頁數(shù)據(jù)量,最大值為 20。 - 結果會在工作簿第一個活動工作表中創(chuàng)建,包含 POI 的名稱、經(jīng)度、緯度和地址信息。
- 自適應列寬代碼可以讓每一列的寬度自適應單元格內容的長度。
- 生成的POI地址,因百度地圖接口的顯示,數(shù)量不多;
2.突破POI 數(shù)量有限制
百度地圖 API 請求返回的 POI 數(shù)量有限制,即每個開發(fā)者密鑰每天只能調用一定次數(shù)的 API 接口,并且每個查詢請求也有最大結果數(shù)、頁碼等限制。如果需要盡可能獲取更多的 POI,可以參考以下幾點:
- 在多個城市或區(qū)域中查詢,可以通過
region
參數(shù)傳遞多個城市或區(qū)域的信息,例如'杭州市拱墅區(qū)|杭州市西湖區(qū)|杭州市余杭區(qū)'
。 - 增加查詢關鍵詞的精度或縮小查詢范圍,例如可以使用
'火鍋|串串香|川菜'
替代'美食'
。 - 對于一個城市或一個區(qū)域,可以通過循環(huán)調用多個頁面的方式來獲取更多的結果,例如設置
page_num
的初始值不為 0,并不斷自增page_num
直至達到最大頁碼數(shù)或者超過總的記錄數(shù)。例如,可以設置max_page_num = 20
或其他自定義值,最大也不得超過ceil(total / page_size)
。
下面是修改過后的代碼示例:
import math
import requests
import openpyxl
# 輸入百度地圖開發(fā)者密鑰
MY_API_KEY = 'your_api_key'
# 定義 API 路徑
url = 'http://api.map.baidu.com/place/v2/search'
# 起點坐標和查詢類別
query = '火鍋|串串香|川菜'
region = '杭州市拱墅區(qū)'
page_size = 20 # 每頁數(shù)據(jù)量,最大為 20
page_num = 0 # 起始頁碼
max_page_num = 100 # 最大頁碼數(shù),最大不得超過 ceil(total / page_size)
# 創(chuàng)建 Excel 工作簿和工作表
wb = openpyxl.Workbook()
ws = wb.active
ws['A1'] = '名稱'
ws['B1'] = '經(jīng)度'
ws['C1'] = '緯度'
ws['D1'] = '地址'
# 獲取總記錄數(shù)
total = None
while not total or page_num * page_size < total:
# 構建請求參數(shù)
payload = {
'query': query,
'region': region,
'ak': MY_API_KEY,
'output': 'json',
'page_size': page_size,
'page_num': page_num,
}
# 發(fā)送請求
response = requests.get(url, params=payload)
if response.status_code != 200:
print('請求錯誤', response.status_code)
break
# 解析響應
json_data = response.json()
if json_data.get('status') != 0:
print(f"獲取 {region} {query} 數(shù)據(jù)失敗: {json_data.get('message')}")
break
# 獲取總記錄數(shù)
if total is None:
total = json_data.get('total')
# 獲取當前頁碼的數(shù)據(jù)
results = json_data.get('results')
# 將當前頁碼的數(shù)據(jù)寫入 Excel 表格
for i, result in enumerate(results, start=2 + page_num * page_size):
name = result.get('name')
location = result.get('location')
address = result.get('address')
ws.cell(row=i, column=1, value=name or '')
ws.cell(row=i, column=2, value=location.get('lng', '') or '')
ws.cell(row=i, column=3, value=location.get('lat', '') or '')
ws.cell(row=i, column=4, value=address or '')
# 自增頁碼
page_num += 1
# 如果已經(jīng)獲取了總記錄數(shù),則控制最大頁碼數(shù)
if total is not None:
max_page_num = min(math.ceil(total / page_size), max_page_num)
# 如果達到最大頁碼數(shù),則跳出
if page_num >= max_page_num:
break
# 自適應列寬
for column in ws.columns:
cell = max(column, key=lambda x: len(str(x.value)))
width = min(100, max(10, len(str(cell.value))))
ws.column_dimensions[cell.column_letter].width = width
# 保存 Excel 文件
wb.save(f"{region}{query}.xlsx")
需要注意以下幾點:
- 在獲取查詢結果總記錄數(shù)時,只需要獲取一次即可,可以通過判斷
total
是否為None
來控制。獲取到total
后,可以計算出最大頁碼數(shù),確保不會超過ceil(total / page_size)
。 - 循環(huán)爬取每一頁的數(shù)據(jù)時,可以通過
page_num * page_size < total
的判斷條件來控制循環(huán)次數(shù),并在到達最大頁碼數(shù)后及時跳出循環(huán),避免超調用 API 接口次數(shù)。 - 增加查詢詞和查詢地點的精度或范圍可以控制返回結果數(shù)量。查詢結果數(shù)量過大時,需要對數(shù)據(jù)進行去重、排序、過濾等處理,以避免數(shù)據(jù)冗余和格式不統(tǒng)一的問題。
3.百度地圖API升級與ChatGPT的舊代碼沖突
在調試的過程中,由于近期百度地圖的升級,ChatGPT生成的代碼還是老的版本,無法直接運行。需要我們重新梳理,借鑒ChatGPT的算法。
- 構建請求參數(shù)的變化
# 構建請求參數(shù)
payload = {
'query': '酒店',
"tag": "商務酒店,招待所,星級酒店",
'region': '浙江省杭州市拱墅區(qū)',
'ak': MY_API_KEY,
'output': 'json',
'page_size': 20,
'page_num': 0,
}
- ‘APP 服務被禁用’
{‘status’: 240, ‘message’: ‘APP 服務被禁用’}的解決方案:替換成服務端的ak,也是近期的百度地圖升級。
- origin or destination is invalid,起始點無效。
{‘status’: 2, ‘message’: ‘origin or destination is invalid’}的解決方案:API路徑和請求參數(shù)的升級,參照官網(wǎng)比對。
三、獲取當前城市的天氣情況
使用百度地圖開放平臺,獲取當前城市的天氣情況,代碼怎么寫
以下是使用百度地圖開放平臺,獲取當前城市天氣情況的 Python 代碼示例:
import requests
# 輸入百度地圖開發(fā)者密鑰
MY_API_KEY = 'your_api_key'
# 獲取當前 IP 和城市信息
ip_api_url = 'http://api.map.baidu.com/location/ip'
payload = {
'ak': MY_API_KEY,
'ip': '',
'coor': 'bd09ll',
}
response = requests.get(ip_api_url, params=payload)
if response.status_code != 200:
print('請求錯誤', response.status_code)
raise SystemExit(0)
json_data = response.json()
if json_data.get('status') != 0:
print(f"獲取 IP 地址數(shù)據(jù)失敗: {json_data.get('message')}")
raise SystemExit(0)
city_name = json_data['address_detail']['city']
# 獲取城市天氣數(shù)據(jù)
weather_api_url = 'http://api.map.baidu.com/weather/v1'
payload = {
'district_id': '',
'output': 'json',
'ak': MY_API_KEY,
}
response = requests.get(weather_api_url, params=payload)
if response.status_code != 200:
print('請求錯誤', response.status_code)
raise SystemExit(0)
json_data = response.json()
if json_data.get('status') != 0:
print(f"獲取天氣數(shù)據(jù)失敗: {json_data.get('message')}")
raise SystemExit(0)
# 解析天氣數(shù)據(jù)
weather_data = {}
for city in json_data['result']:
if city_name in (city.get('name', ''), city.get('alias', '')):
weather_data = {
'城市': city_name,
'天氣': city['weather_data'][0]['wea'],
'溫度': city['weather_data'][0]['tem'],
'風向': city['weather_data'][0]['win'],
'濕度': city['weather_data'][0]['humidity'],
'空氣質量': city['air'],
'更新時間': city['update_time'],
}
break
# 輸出天氣數(shù)據(jù)
if weather_data:
print(f"城市: {weather_data['城市']}")
print(f"天氣: {weather_data['天氣']}")
print(f"溫度: {weather_data['溫度']}")
print(f"風向: {weather_data['風向']}")
print(f"濕度: {weather_data['濕度']}")
print(f"空氣質量: {weather_data['空氣質量']}")
print(f"更新時間: {weather_data['更新時間']}")
else:
print(f"當前城市:{city_name} 無天氣數(shù)據(jù)")
需要注意以下幾點:
- 首先需要在百度開放平臺上注冊并獲取密鑰
MY_API_KEY
。 - 獲取當前 IP 和城市信息,可以通過發(fā)送請求訪問百度地圖開放 API 的
location/ip
接口,然后解析返回的 JSON 數(shù)據(jù)來獲取 IP 地址和城市信息。 - 獲取城市天氣數(shù)據(jù),可以通過發(fā)送請求訪問百度地圖開放 API 的
weather/v1
接口,然后將查詢結果中包含當前城市天氣數(shù)據(jù)的條目提取出來。 - 天氣結果中包含城市、天氣、溫度、風向、濕度、空氣質量和更新時間等信息,可以針對不同的信息進行處理、顯示或統(tǒng)計。
如何解決獲取 IP 地址數(shù)據(jù)失敗: Unkown Error:no ipv6 permission, please apply through feedback
百度地圖開放平臺的 location/ip
接口是需要用戶的設備支持 IPv6 協(xié)議才能正常使用的,否則會出現(xiàn) Unkown Error:no ipv6 permission, please apply through feedback
的錯誤提示。
為了解決此問題,可以參考以下兩種方法:
- 在設備上開啟 IPv6 協(xié)議支持。具體的開啟方式和步驟會因設備和系統(tǒng)版本而不同,可以在設備設置中進行查找和開啟。
- 向百度地圖開放平臺反饋問題。如果設備無法支持 IPv6 協(xié)議,則可以向百度地圖開放平臺反饋該問題,請求其增加對 IPv4 協(xié)議的支持。具體的操作流程可以參考百度地圖開放平臺的官方文檔。
四、批量地理編碼
如何使用百度地圖web API,對地址批量進行轉換為經(jīng)緯度坐標,并輸出excel
可以使用百度地圖 web API 的 Geocoding API
接口實現(xiàn)將批量地址轉換為經(jīng)緯度坐標,并將結果輸出到 Excel 文件中。以下是 Python 代碼示例:
import requests
import openpyxl
# 輸入百度地圖開發(fā)者密鑰和讀取的地址列表(每個地址占據(jù)列表中一行)
MY_API_KEY = 'your_api_key'
addr_list = ['浙江省杭州市西湖區(qū)浙江大學紫金港校區(qū)1號樓', '浙江省杭州市西湖區(qū)浙江大學紫金港校區(qū)2號樓']
# 定義 API 路徑和 Excel 文件名
url = 'http://api.map.baidu.com/geocoding/v3/'
excel_file = '地址坐標.xlsx'
# 創(chuàng)建 Excel 工作簿和工作表
wb = openpyxl.Workbook()
ws = wb.active
ws['A1'] = '地址'
ws['B1'] = '經(jīng)度'
ws['C1'] = '緯度'
# 循環(huán)獲取地址坐標并寫入 Excel 表格
for i, addr in enumerate(addr_list, start=2):
payload = {'address': addr, 'output': 'json', 'ak': MY_API_KEY}
response = requests.get(url, params=payload)
if response.status_code != 200:
print('請求錯誤', response.status_code)
break
json_data = response.json()
if json_data.get('status') != 0:
print(f"獲取坐標數(shù)據(jù)失敗: {json_data.get('message')}")
break
location = json_data['result']['location']
ws.cell(row=i, column=1, value=addr or '')
ws.cell(row=i, column=2, value=location.get('lng', '') or '')
ws.cell(row=i, column=3, value=location.get('lat', '') or '')
# 自適應列寬
for column in ws.columns:
cell = max(column, key=lambda x: len(str(x.value)))
width = min(100, max(10, len(str(cell.value))))
ws.column_dimensions[cell.column_letter].width = width
# 保存 Excel 文件
wb.save(excel_file)
print(f"文件{excel_file}保存成功")
需要注意以下幾點:
- 首先需要在百度開放平臺上注冊并獲取密鑰
MY_API_KEY
。 - 將需要查詢的地址存儲在以地址為元素的列表
addr_list
中,每個地址占據(jù)列表中的一行。 - 使用
requests
庫向百度地圖 web API 的Geocoding API
接口發(fā)送查詢請求,查詢參數(shù)為地址和密鑰。返回的 JSON 數(shù)據(jù)中包含地址的經(jīng)緯度坐標信息。 - 將查詢結果寫入一個新的 Excel 工作簿,并設置工作表的列寬自適應。
總結
ChatGPT是在不斷學習和成長中的AI,對于及時更新的信息還達不到實時更新,尤其是對于一些商用平臺開放平臺API接口,需要技術開發(fā)者,在官方文檔為主的情況下,借助ChatGPT進行快速有效的技術開發(fā)。文章來源:http://www.zghlxwxcb.cn/news/detail-464336.html
@漏刻有時文章來源地址http://www.zghlxwxcb.cn/news/detail-464336.html
到了這里,關于ChatGPT工作提效之使用python開發(fā)對接百度地圖開放平臺API的實戰(zhàn)方案(批量路線規(guī)劃、批量獲取POI、突破數(shù)量有限制、批量地理編碼)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!