
1. 高德地图POI数据采集入门指南第一次接触POI数据采集时我也被各种专业术语绕得头晕。简单来说POIPoint of Interest就是地图上的兴趣点比如你家楼下的便利店、公司附近的咖啡厅。高德地图的POI数据特别丰富包含店铺名称、详细地址、经纬度坐标、联系电话等20多项信息简直就是商业分析的宝藏。要获取这些数据首先得有个钥匙——高德开放平台的API密钥。注册过程比想象中简单就像申请个普通账号。我去年帮连锁药店做选址分析时从注册到拿到密钥只用了10分钟。重点提醒创建应用时务必选择Web服务类型其他类型的密钥无法用于数据调用。拿到密钥后建议先到开发者文档里看看调用限制免费版每天最多能查2000条数据商业项目可能需要购买更高配额。这里有个实用建议把密钥保存在环境变量里别像我第一次那样傻傻地把密钥写在代码里上传到GitHub结果被人恶意调用账号直接被封。可以用Python的os模块管理密钥import os amap_key os.getenv(AMAP_WEB_KEY)2. Python爬虫实战从0到1获取POI数据写爬虫脚本就像搭积木我把核心功能拆解成三个部分数据获取、坐标转换、存储输出。先看最简单的数据获取部分高德的Place API用起来特别友好只需要构造一个包含关键词和城市的URL就能获取数据。比如想找武汉的药店请求URL长这样https://restapi.amap.com/v3/place/text?key你的密钥keywords药房city武汉实际项目中我发现三个坑首先是分页查询高德默认每页返回20条数据需要用while循环配合page参数翻页其次是中文编码问题必须用urllib.parse.quote处理关键词最后是API返回的坐标是火星坐标系GCJ02需要转换才能在地图上准确定位。这是我优化后的爬取函数def get_poi_data(city, keyword, max_pages10): poi_list [] for page in range(1, max_pages1): url f{poi_search_url}?key{amap_key}keywords{quote(keyword)}city{quote(city)}page{page} try: with request.urlopen(url) as f: data json.loads(f.read().decode(utf-8)) if data[count] 0: break poi_list.extend(data[pois]) except Exception as e: print(f第{page}页获取失败{str(e)}) return poi_list3. 数据清洗与坐标转换的实用技巧原始数据就像刚挖出来的矿石需要提炼才能用。我通常先处理这几个问题重复数据不同分页可能返回相同POI、地址缺失有些小店不填详细地址、坐标漂移火星坐标系偏移问题。分享一个真实案例去年分析上海咖啡馆分布时发现同一家星巴克在三个不同位置重复出现就是因为加盟店编号不同被当作不同POI。坐标转换是重头戏。高德用的是GCJ02坐标系而国际通用的WGS84坐标系就是GPS设备用的之间有0.5-3公里的偏移。这个转换算法网上有很多版本但实测下来高德官方提供的gcj02_to_wgs84函数最准确。这里有个细节转换后的坐标要保留6位小数否则地图显示会有偏差。数据存储我推荐用pandas代替xlwt处理大数据量时速度更快还能直接对接分析工具import pandas as pd def save_to_excel(poi_list, filename): df pd.DataFrame([{ name: poi[name], lng: gcj02_to_wgs84(*map(float, poi[location].split(,)))[0], lat: gcj02_to_wgs84(*map(float, poi[location].split(,)))[1], address: poi.get(address,), district: poi.get(adname,) } for poi in poi_list]) df.to_excel(filename, indexFalse)4. 商业分析实战药店选址的决策支持有了清洗好的数据真正的商业魔法才开始。以武汉药店分布分析为例我们团队去年帮某医药集团做过完整流程数据增强合并美团点评的评分数据需要另外爬取空间分析用ArcGIS做核密度分析找出空白市场区域竞品分析统计各行政区药店数量与人口比例可视化呈现Folium生成热力图直观展示分布情况关键发现江岸区药店数量饱和而洪山区高校周边存在明显供给缺口。这个结论帮助客户节省了200多万的无效选址成本。具体分析代码片段import folium from sklearn.cluster import DBSCAN # 创建武汉底图 wuhan_map folium.Map(location[30.52, 114.31], zoom_start12) # 添加药店热力图 heat_data [[row[lat], row[lng]] for _,row in df.iterrows()] folium.plugins.HeatMap(heat_data).add_to(wuhan_map) # 保存HTML文件 wuhan_map.save(pharmacy_distribution.html)5. 进阶技巧与避坑指南做了十几个POI分析项目后我总结出这些经验首先是定时爬取商业环境变化快最好每周更新数据。其次是异常处理高德API偶尔会返回错误需要设置重试机制。最后是法律风险爬取数据时注意控制频率每秒不超过5次请求避免被视为攻击。有个高级技巧用Selenium模拟浏览器获取POI详情页数据可以拿到联系电话、营业时间等扩展信息。但要注意反爬机制建议设置随机延迟from selenium import webdriver from time import sleep from random import uniform driver webdriver.Chrome() for poi in poi_list[:50]: # 控制获取数量 driver.get(poi[url]) sleep(uniform(1,3)) # 随机等待1-3秒 phone driver.find_element_by_class_name(phone).text最深刻的教训是有次没做数据备份连续爬了三天的数据因为程序异常全丢了。现在我的自动化脚本都配置了双重存储本地SQLite实时保存每日同步到云端。