Python使用高德地圖API批量獲取地址所屬街道并寫回Excel
在日常的數(shù)據(jù)處理工作中,我們經(jīng)常需要根據(jù)公司、事件或門店的注冊地址,批量獲取其所在的街道信息,例如“浦東新區(qū)張江鎮(zhèn)”“徐匯區(qū)龍華街道”等。 手動查詢顯然低效,而借助 Python + 高德地圖API,我們可以輕松實現(xiàn)自動化批量查詢并將結(jié)果寫入 Excel 文件中。
本文將完整展示一個從 Excel 讀取地址 → 調(diào)用高德API → 獲取街道 → 寫回Excel的實用腳本,并講解實現(xiàn)細(xì)節(jié)與優(yōu)化思路。
一、功能概述
這段腳本的功能可以總結(jié)為四步:
- 從 Excel 文件中讀取地址數(shù)據(jù);
- 調(diào)用高德地圖地理編碼(geocode)與逆地理編碼(regeo)接口獲取街道名稱;
- 自動將查詢結(jié)果寫回到 Excel 的新列中;
- 對查詢失敗的地址進(jìn)行重試與記錄,保證數(shù)據(jù)盡量完整。
二、項目依賴與準(zhǔn)備工作
在開始之前,請確保安裝以下依賴:
pip install pandas openpyxl requests
并在高德開放平臺申請一個 API Key,申請地址為: lbs.amap.com/api/webservice/guide/create-project
拿到 key 后,將它填入腳本開頭的配置部分:
key = "你的高德API_KEY"
三、核心邏輯講解
1. Excel文件讀取與列處理
腳本使用 pandas 和 openpyxl 結(jié)合讀取 Excel 文件:
df = pd.read_excel(input_file)
if '注冊地址' not in df.columns:
df['注冊地址'] = df.iloc[:,16]
addresses = df['注冊地址'].tolist()
這段代碼首先讀取整個 Excel,然后確認(rèn)是否存在“注冊地址”列; 如果沒有,則自動取第 17 列(索引16)作為地址列,保證兼容不同格式的表格。
隨后,腳本用 openpyxl 打開同一個文件,以保留單元格樣式,準(zhǔn)備寫入新的“街道”列:
wb = load_workbook(input_file) ws = wb.active ws.insert_cols(target_col) ws.cell(row=header_row_index, column=target_col, value="街道")
這樣既能讀取數(shù)據(jù),又能保持表格原有格式,方便下游人員直接查看。
2. 調(diào)用高德API獲取街道信息
核心的查詢函數(shù)如下:
def get_street_from_amap(address, retries=max_retries):
if not isinstance(address, str) or not address.strip():
return ""
for attempt in range(1, retries+1):
try:
geo_resp = requests.get(
"https://restapi.amap.com/v3/geocode/geo",
params={"key": key, "address": address, "city": "上海"},
timeout=15
).json()
if not geo_resp.get("geocodes"):
continue
location = geo_resp["geocodes"][0]["location"]
regeo_resp = requests.get(
"https://restapi.amap.com/v3/geocode/regeo",
params={"key": key, "location": location, "extensions": "base", "radius":500},
timeout=15
).json()
if regeo_resp.get("regeocode"):
township = regeo_resp["regeocode"]["addressComponent"].get("township","") or ""
return township
except Exception as e:
print(f"[嘗試 {attempt}/{retries}] 地址查詢失敗: {address}, 錯誤: {e}")
time.sleep(sleep_time + random.random()*0.5)
return None
這段邏輯分為兩步:
- 正向地理編碼(geocode):根據(jù)地址字符串獲取經(jīng)緯度;
- 逆向地理編碼(regeo):根據(jù)經(jīng)緯度反查街道名稱(township)。
并加入了異常重試機(jī)制與隨機(jī)延時,防止頻繁請求觸發(fā)高德API限流。
3. 批量查詢與緩存優(yōu)化
查詢過程通過循環(huán)實現(xiàn):
cache = {}
failed_addresses = []
for row_idx, addr in enumerate(addresses, start=header_row_index+1):
if not isinstance(addr,str) or not addr.strip():
ws.cell(row=row_idx, column=target_col, value="")
continue
if addr in cache:
township = cache[addr]
else:
township = get_street_from_amap(addr)
if township is None:
failed_addresses.append((row_idx, addr))
township = ""
cache[addr] = township
time.sleep(sleep_time + random.random()*0.5)
ws.cell(row=row_idx, column=target_col, value=township)
這里有幾個優(yōu)化點:
- 緩存(cache)機(jī)制:如果同一地址出現(xiàn)多次,只請求一次;
- 延時策略:
sleep_time + random.random()*0.5,避免被API風(fēng)控; - 實時進(jìn)度輸出:每50行打印一次進(jìn)度。
4. 失敗重試與錯誤記錄
對于第一次查詢失敗的地址,腳本會自動發(fā)起第二輪重查:
if failed_addresses:
print(f"第一次查詢失敗地址共 {len(failed_addresses)} 條,開始自動重查……")
still_failed = []
for row_idx, addr in failed_addresses:
township = get_street_from_amap(addr)
if township is None:
still_failed.append((row_idx, addr))
township = ""
cache[addr] = township
ws.cell(row=row_idx, column=target_col, value=township)
time.sleep(sleep_time + random.random()*0.5)
failed_addresses = still_failed
最終仍查詢失敗的地址會被寫入單獨的 Excel 文件:
if failed_addresses:
df_fail = pd.DataFrame([addr for _, addr in failed_addresses], columns=["地址"])
df_fail.to_excel(failed_file, index=False)
這樣可以方便人工二次處理,比如手動調(diào)整地址格式或補(bǔ)錄缺失信息。
四、運(yùn)行結(jié)果
執(zhí)行腳本后,控制臺會顯示類似輸出:
已處理 50 行,最近地址:上海市浦東新區(qū)張江路123號 → 張江鎮(zhèn)
已處理 100 行,最近地址:上海市浦東新區(qū)川沙路56號 → 川沙新鎮(zhèn)
第一次查詢失敗地址共 5 條,開始自動重查……
完成,已保存:事件列表-上海浦東-帶街道.xlsx
最終仍失敗的地址已保存到 查詢失敗地址.xlsx
最終輸出文件中會新增一列“街道”,完整保留原有格式:
| 注冊地址 | 街道 |
|---|---|
| 上海市浦東新區(qū)張江路123號 | 張江鎮(zhèn) |
| 上海市浦東新區(qū)川沙路56號 | 川沙新鎮(zhèn) |
五、實用建議與擴(kuò)展方向
批量查詢速度控制
- 高德API對單IP有請求頻率限制,建議控制每秒請求數(shù)。
- 若數(shù)據(jù)量大,可考慮多線程+限速隊列模式。
地址清洗預(yù)處理
可先對地址進(jìn)行正則清洗,去掉多余標(biāo)點、括號、空格等,提高命中率。
多城市適配
當(dāng)前城市固定為“上海”,可通過參數(shù)配置實現(xiàn)全國適配。
異常日志記錄
建議在重查階段輸出更多日志,例如返回狀態(tài)碼、錯誤類型,方便調(diào)試。
接口替代方案
若數(shù)據(jù)量巨大,可以使用高德地圖的批量地理編碼接口(支持最多 10 條一次),進(jìn)一步提升效率。
六、總結(jié)
本文通過一個實戰(zhàn)案例展示了如何用 Python + 高德地圖API 實現(xiàn)“批量地址→街道歸屬”的自動化處理。 整個過程涵蓋了數(shù)據(jù)讀取、接口調(diào)用、異常重試、結(jié)果寫回等完整流程,既是一個實用工具腳本,也體現(xiàn)了 Python 在數(shù)據(jù)自動化中的強(qiáng)大能力。
核心亮點:
| 模塊 | 功能 |
|---|---|
| pandas + openpyxl | 高效讀取與寫入 Excel |
| requests | 調(diào)用高德API進(jìn)行地理解析 |
| 緩存與重試機(jī)制 | 提高查詢穩(wěn)定性與速度 |
| 自動生成失敗文件 | 方便人工補(bǔ)錄與質(zhì)量控制 |
如果你日常需要處理大量企業(yè)、門店、事件地址,這個腳本可以幫你節(jié)省大量時間。
到此這篇關(guān)于Python使用高德地圖API批量獲取地址所屬街道并寫回Excel的文章就介紹到這了,更多相關(guān)Python批量獲取地址內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
tensorflow使用range_input_producer多線程讀取數(shù)據(jù)實例
今天小編就為大家分享一篇tensorflow使用range_input_producer多線程讀取數(shù)據(jù)實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01
django自定義Field實現(xiàn)一個字段存儲以逗號分隔的字符串
這篇文章主要介紹了django自定義Field實現(xiàn)一個字段存儲以逗號分隔的字符串的示例,需要的朋友可以參考下2014-04-04
Python辦公自動化實戰(zhàn)之打造智能郵件發(fā)送工具
在數(shù)字化辦公場景中,郵件自動化是提升工作效率的關(guān)鍵技能,本文將演示如何使用Python的smtplib和email庫構(gòu)建一個支持圖文混排,多附件,多收件人的智能郵件系統(tǒng)2025-07-07
python實現(xiàn)在函數(shù)中修改變量值的方法
今天小編就為大家分享一篇python實現(xiàn)在函數(shù)中修改變量值的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07
使用python查找windows系統(tǒng)中所有程序的安裝信息
這篇文章主要為大家介紹了使用python查找windows系統(tǒng)中所有程序的安裝信息示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
Python中shutil模塊的常用文件操作函數(shù)用法示例
shutil模塊提供比OS模塊更強(qiáng)大的本地文件操作功能,包括文件的壓縮和解壓縮等,下面我們就來列舉Python中shutil模塊的常用文件操作函數(shù)用法示例:2016-07-07

