用Python+Selenium爬取高德地图充电桩数据,自动存Excel保姆级教程

张开发
2026/4/17 22:02:46 15 分钟阅读

分享文章

用Python+Selenium爬取高德地图充电桩数据,自动存Excel保姆级教程
PythonSelenium实战高德地图充电桩数据采集与自动化处理指南当新能源车主数量激增充电桩数据的商业价值也随之凸显。无论是商业选址分析、竞品调研还是用户行为研究获取精准的充电桩分布信息都成为关键。本文将手把手教你如何用PythonSelenium构建一个高效的充电桩数据采集系统从API调用到数据存储实现全流程自动化。1. 环境准备与基础配置在开始爬虫开发前我们需要搭建好Python环境并安装必要的库。推荐使用Python 3.8版本这是目前最稳定的选择。通过pip安装以下关键依赖pip install selenium openpyxl webdriver-manager pandas核心工具说明Selenium用于模拟浏览器操作获取动态加载内容Openpyxl处理Excel文件读写Webdriver-manager自动管理浏览器驱动版本Pandas后续数据清洗的利器提示建议使用虚拟环境隔离项目依赖避免包冲突。可以通过python -m venv myenv创建。高德地图API的申请是第一步。前往高德开放平台注册开发者账号创建新应用后获取Key。注意选择Web服务API类型每日免费调用限额足够中小规模数据采集。2. 高德API调用与POI数据获取高德地图的Place API提供了丰富的POI查询功能。我们先构造基础请求URL获取充电桩的初始信息import requests def get_poi_by_city(city, api_key, page_size20): base_url https://restapi.amap.com/v3/place/text params { key: api_key, city: city, types: 011100|011102|011103|073000|073001|073002, # 充电桩相关类型代码 offset: page_size, page: 1, extensions: base } response requests.get(base_url, paramsparams) return response.json()充电桩类型代码说明类型代码说明011100充电站(电动汽车)011102换电站(电动汽车)073000充电桩(住宅小区)073001充电桩(公共停车场)处理分页数据时需要注意API的限制。高德地图单次查询最多返回1000条结果需要通过分页策略获取更多数据def get_all_pois(api_key, city, max_pages50): all_pois [] for page in range(1, max_pages 1): data get_poi_by_page(city, api_key, page) pois data.get(pois, []) if not pois: break all_pois.extend(pois) return all_pois3. Selenium自动化采集详情数据基础API只能获取部分信息电话号码等关键数据需要从详情页提取。这里我们使用Selenium模拟浏览器操作from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager def setup_driver(): options webdriver.ChromeOptions() options.add_argument(--headless) # 无界面模式 options.add_argument(--disable-gpu) options.add_argument(--window-size1920,1080) driver webdriver.Chrome( serviceService(ChromeDriverManager().install()), optionsoptions ) return driver详情页数据提取需要分析页面结构。高德地图的详情数据通常存储在window.__INITIAL_STATE__中def get_poi_detail(driver, poi_id): detail_url fhttps://www.amap.com/place/{poi_id} driver.get(detail_url) try: detail_data driver.execute_script( return window.__INITIAL_STATE__.poiDetail.poiInfo || null ) return detail_data except: return None反爬应对策略随机等待时间time.sleep(random.uniform(1, 3))使用代理IP轮换模拟人类操作模式滚动页面、鼠标移动等4. 数据存储与自动化处理将采集到的数据存储到Excel需要处理多种数据格式。我们使用openpyxl进行灵活操作from openpyxl import Workbook def init_excel(file_path): wb Workbook() ws wb.active headers [ 省份, 城市, 名称, 地址, 电话, 经度, 纬度, 运营商, 充电桩数量, 停车费, 营业时间, POI ID, 详情链接 ] ws.append(headers) return wb, ws对于大规模数据建议采用分批写入策略def save_batch_to_excel(ws, batch_data): for item in batch_data: row [ item.get(province, ), item.get(city, ), item.get(name, ), item.get(address, ), item.get(tel, ), item.get(location, ).split(,)[0] if item.get(location) else , item.get(location, ).split(,)[1] if item.get(location) else , item.get(business_tag, ), item.get(charging_pile_num, ), item.get(parking_fee, ), item.get(business_time, ), item.get(id, ), fhttps://www.amap.com/place/{item.get(id, )} ] ws.append(row)5. 高级技巧与异常处理实际项目中会遇到各种异常情况需要健壮的错误处理机制from retrying import retry retry(stop_max_attempt_number3, wait_fixed2000) def safe_get_detail(driver, poi_id): try: return get_poi_detail(driver, poi_id) except Exception as e: print(f获取{poi_id}详情失败: {str(e)}) raise数据清洗是保证质量的关键步骤。常见问题包括电话号码格式不统一地址信息缺失或错误经纬度坐标异常使用Pandas进行高效数据清洗import pandas as pd def clean_data(df): # 电话格式标准化 df[电话] df[电话].str.replace(r[^\d-], , regexTrue) # 去除重复数据 df.drop_duplicates(subset[POI ID], keepfirst, inplaceTrue) # 处理空值 df[营业时间].fillna(未知, inplaceTrue) return df6. 项目优化与扩展思路当基础功能实现后可以考虑以下优化方向性能优化方案采用多线程/协程提高采集效率使用Redis做任务队列和去重实现断点续采功能数据应用扩展# 生成热力图所需数据格式 def prepare_heatmap_data(df): heat_data df[[纬度, 经度, 充电桩数量]].copy() heat_data.columns [lat, lng, count] return heat_data.to_dict(records)实际部署时可以将脚本打包为定时任务配合日志监控系统import schedule import time def daily_job(): # 这里放置数据采集逻辑 print(执行每日数据采集任务...) schedule.every().day.at(02:00).do(daily_job) while True: schedule.run_pending() time.sleep(60)在最近的一个商业项目中这套系统帮助客户在3天内采集了全国2万充电桩数据通过分析发现了3个高潜力选址位置。其中一个关键发现是高速服务区充电桩的平均使用率比市区低25%但节假日峰值却是市区的3倍。

更多文章