基于高德API与Selenium的全国充电桩POI数据自动化采集实战

张开发
2026/6/6 14:04:03 15 分钟阅读
基于高德API与Selenium的全国充电桩POI数据自动化采集实战
1. 为什么需要自动化采集充电桩数据最近几年新能源汽车越来越普及充电桩作为基础设施的需求量激增。作为数据分析师或者开发者我们经常需要获取全国范围内的充电桩分布数据来做市场分析、竞品调研或者商业选址。手动收集这些数据不仅效率低下而且很难保证数据的完整性和准确性。高德地图作为国内领先的地图服务提供商其Place API接口提供了丰富的POIPoint of Interest数据查询功能。但是单纯依靠API接口获取的数据往往不够详细很多关键信息比如联系电话、营业时间等需要进入详情页才能获取。这时候就需要结合Selenium这样的自动化测试工具模拟浏览器操作来抓取完整的POI信息。我在实际项目中就遇到过这样的需求需要收集全国300多个城市的充电桩数据包括位置、联系方式、运营状态等详细信息。手动操作根本不可能完成于是开发了这套自动化采集方案。下面我就把这个实战经验完整分享给大家。2. 准备工作与环境配置2.1 申请高德开发者账号首先需要注册高德开放平台账号并申请Web服务API的Key。这个Key是调用高德API的凭证每个账号每天有免费调用额度对于小规模数据采集完全够用。注册流程很简单访问高德开放平台官网注册开发者账号进入控制台创建新应用获取Web服务的Key记得把Key保存好后续所有API请求都需要带上这个参数。2.2 安装Python环境这套方案使用Python作为开发语言需要安装以下依赖库pip install selenium openpyxl webdriver-manager requestsselenium用于浏览器自动化操作openpyxl处理Excel文件webdriver-manager自动管理浏览器驱动requests发送HTTP请求建议使用Python 3.7及以上版本我在3.8和3.9环境下都测试过运行很稳定。2.3 配置Selenium环境Selenium需要配合浏览器驱动使用这里推荐Chrome浏览器。使用webdriver-manager可以自动下载和配置对应版本的驱动省去手动配置的麻烦。from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager # 配置无头模式 chrome_options webdriver.ChromeOptions() chrome_options.add_argument(--headless) # 无界面运行 driver webdriver.Chrome(serviceService(ChromeDriverManager().install()), optionschrome_options)无头模式可以让浏览器在后台运行不弹出实际窗口适合服务器环境部署。3. 高德API数据采集实战3.1 理解高德Place API高德Place API提供了多种查询方式我们主要使用文本搜索接口。关键参数包括key开发者Keycity限定城市范围typesPOI类型编码offset每页返回结果数page页码extensions返回结果详细程度充电桩对应的types编码是011100|011102|011103|073000|073001|073002涵盖了各种类型的充电设施。3.2 构建API请求下面是一个完整的请求示例import requests def get_poi_list(city, page1): url fhttps://restapi.amap.com/v3/place/text?city{city}offset20page{page}key你的Keytypes011100|011102|011103|073000|073001|073002extensionsall response requests.get(url) if response.status_code 200: return response.json().get(pois, []) return []这个函数可以获取指定城市、指定页码的充电桩POI列表。实际使用时需要遍历所有页码直到返回结果为空为止。3.3 处理分页数据高德API单次请求最多返回20条记录所以需要处理分页。我通常的做法是先获取第一页数据然后根据返回的count值计算总页数。def get_all_pois(city): all_pois [] page 1 while True: pois get_poi_list(city, page) if not pois: break all_pois.extend(pois) page 1 return all_pois注意控制请求频率避免触发API的限流机制。建议在循环中加入time.sleep(0.5)做适当延迟。4. Selenium详情页数据抓取4.1 解析POI详情页结构高德地图的POI详情页采用了前后端分离的架构数据通常存储在window.__INITIAL_STATE__这个JavaScript变量中。我们可以通过Selenium执行JS代码直接获取这个对象。detail_json driver.execute_script(return window.__INITIAL_STATE__)这个JSON对象包含了非常丰富的信息我们需要从中提取关键字段基础信息名称、地址、坐标联系方式电话、营业时间服务信息充电桩类型、功率、价格等4.2 处理详情页数据获取到原始JSON后需要根据数据结构提取所需字段。高德详情页的数据结构比较复杂建议先打印出来研究清楚各个字段的位置。def parse_detail(detail_json, poi_id): try: poi_data detail_json[poi][poiinfo][poi_id] return { name: poi_data.get(name), address: poi_data.get(address), tel: poi_data.get(tel), location: poi_data.get(location), # 其他需要提取的字段... } except Exception as e: print(f解析详情页出错: {e}) return None实际项目中你可能还需要处理各种异常情况比如字段缺失、数据结构变化等。4.3 优化抓取效率详情页抓取是整个流程中最耗时的部分。我总结了几个优化技巧使用无头浏览器减少资源占用合理设置隐式等待时间避免不必要的等待实现断点续传功能记录已处理的POI ID多城市并行处理需要多个Key轮询使用5. 数据存储与导出5.1 Excel文件处理使用openpyxl库可以很方便地操作Excel文件。我建议采用增量写入的方式避免内存占用过高。import openpyxl def save_to_excel(data, filename): try: # 尝试加载已有文件 wb openpyxl.load_workbook(filename) sheet wb.active except FileNotFoundError: # 新建文件并写入表头 wb openpyxl.Workbook() sheet wb.active sheet.append([省份, 城市, 名称, 地址, 电话, 经度, 纬度, POI ID, 详情链接]) # 写入数据行 sheet.append(data) wb.save(filename)5.2 数据结构化最终存储的数据应该包含以下核心字段基础信息名称、地址、坐标联系方式电话唯一标识POI ID访问链接详情页URL行政区划省份、城市可以根据实际需求添加更多字段比如充电桩类型、运营商信息等。5.3 数据质量控制在写入Excel前应该对数据进行校验检查必填字段是否为空验证坐标格式是否正确去重处理基于POI ID格式化电话号码等字段6. 完整代码实现与优化6.1 主流程整合将上述各个模块整合起来形成完整的处理流程def main(): provinces [北京, 上海, 广州] # 待采集的省份列表 for province in provinces: cities get_cities_by_province(province) # 获取省份下的城市列表 for city in cities: pois get_all_pois(city) handle_detail_and_save_to_csv(pois, city, province)6.2 异常处理与日志完善的异常处理机制可以大大提高程序的稳定性try: # 业务代码 except requests.exceptions.RequestException as e: print(fAPI请求失败: {e}) except selenium.common.exceptions.WebDriverException as e: print(f浏览器操作失败: {e}) except Exception as e: print(f未知错误: {e}) finally: driver.quit() # 确保浏览器进程被关闭建议添加详细的日志记录方便排查问题。6.3 性能优化建议在大规模数据采集时可以考虑以下优化方案使用多线程/多进程并行处理不同城市实现断点续传功能将数据存储改为数据库如MySQL、MongoDB使用代理IP池防止被封禁7. 实际应用中的注意事项7.1 遵守高德API使用规范高德API有明确的调用限制和使用条款需要注意不要超过每日调用限额不得将数据用于商业用途除非获得授权缓存数据要定期更新7.2 反爬虫策略应对高德地图有一定的反爬虫机制建议控制请求频率添加随机延迟模拟真实用户行为如鼠标移动、滚动等使用多个Key轮询7.3 数据更新策略充电桩数据变化较快建议设置定期任务自动更新数据对新增和变更的POI做标记建立数据版本管理系统我在实际项目中每周全量更新一次数据同时每天增量检查新增点位这样既能保证数据新鲜度又不会给服务器造成太大压力。

更多文章