懂车帝新能源汽车销量数据API实战:从请求到解析的完整爬虫指南

📅 2026/7/15 3:28:03 👁️ 阅读次数 📝 编程学习
懂车帝新能源汽车销量数据API实战:从请求到解析的完整爬虫指南

1. 懂车帝API接口初探

第一次接触懂车帝的新能源汽车销量API时,我像发现宝藏一样兴奋。这个接口设计得非常友好,不需要复杂的鉴权流程,直接用GET请求就能获取结构化数据。接口地址是https://www.dongchedi.com/motor/pc/car/rank_data,参数设计也很直观:

  • new_energy_type:1代表纯电动,2代表插电混动
  • month:1000表示近一年,500表示近半年,202108表示2021年8月
  • count:返回数据条数
  • city:城市名称(如"成都")
  • rank_data_type:固定传11表示销量榜

实测发现,即使官方更新了网页端,这个接口依然可用。比如想获取成都地区近一年纯电动车销量前100名,请求URL是这样的:

url = "https://www.dongchedi.com/motor/pc/car/rank_data?new_energy_type=1&month=1000&count=100&city=成都&rank_data_type=11"

2. 构建Python请求环境

2.1 安装必要库

建议使用conda或virtualenv创建独立环境:

pip install requests pandas

2.2 基础请求代码

我封装了一个带异常处理的请求函数,这是踩过几次坑后的经验总结:

import requests from requests.exceptions import RequestException def fetch_data(url, retry=3): headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36' } for i in range(retry): try: resp = requests.get(url, headers=headers, timeout=10) resp.raise_for_status() # 自动处理HTTP错误 return resp.json() except RequestException as e: print(f"第{i+1}次请求失败: {str(e)}") if i == retry - 1: raise

3. 解析JSON响应数据

3.1 数据结构分析

返回的JSON包含三个关键部分:

{ "data": { "list": [ # 核心数据数组 { "series_id": 4499, "series_name": "五菱宏光MINIEV", "rank": 1, "count": 380278 # 销量数字 } ], "sells_rank_month": [ # 可选时间范围 {"text": "2021年11月", "month": 202111} ] } }

3.2 数据清洗技巧

我习惯用pandas做二次处理:

import pandas as pd def parse_data(json_data): df = pd.DataFrame(json_data['data']['list']) # 处理价格字段 df['price_range'] = df.apply(lambda x: f"{x['min_price']}-{x['max_price']}万", axis=1) # 转换时间戳 df['update_time'] = pd.to_datetime(df['update_time'], unit='ms') return df[['rank', 'series_name', 'count', 'price_range']]

4. 构建完整爬虫脚本

4.1 参数化请求

通过函数封装实现灵活查询:

def get_car_rank(energy_type=1, time_range=1000, limit=50, city="全国"): params = { 'new_energy_type': energy_type, 'month': time_range, 'count': limit, 'city': city, 'rank_data_type': 11 } base_url = "https://www.dongchedi.com/motor/pc/car/rank_data" return fetch_data(f"{base_url}?{'&'.join(f'{k}={v}' for k,v in params.items())}")

4.2 数据持久化

建议同时保存原始JSON和清洗后的CSV:

import json from datetime import datetime def save_data(data, prefix='car_rank'): timestamp = datetime.now().strftime("%Y%m%d_%H%M") # 保存原始数据 with open(f"{prefix}_{timestamp}.json", 'w') as f: json.dump(data, f, ensure_ascii=False) # 保存清洗数据 parse_data(data).to_csv(f"{prefix}_{timestamp}.csv", index=False)

5. 实战注意事项

5.1 反爬策略应对

  • 随机User-Agent:建议使用fake_useragent库
  • 请求频率控制:添加time.sleep(random.uniform(1,3))
  • 代理IP池:当出现403错误时需要轮换IP

5.2 数据更新机制

我发现销量数据通常在每月10号左右更新,建议设置定时任务:

import schedule import time def monthly_job(): data = get_car_rank() save_data(data) schedule.every().month.at("10:00").do(monthly_job) while True: schedule.run_pending() time.sleep(3600) # 每小时检查一次

6. 数据可视化延伸

用Matplotlib生成销量TOP10柱状图:

import matplotlib.pyplot as plt def plot_top10(df): plt.figure(figsize=(12,6)) df.head(10).plot.bar(x='series_name', y='count') plt.title('新能源车销量TOP10') plt.xticks(rotation=45) plt.tight_layout() plt.savefig('top10.png')

7. 异常处理经验

这些坑我都亲自踩过:

  • 城市参数要URL编码:urllib.parse.quote("成都")
  • 销量数字可能是字符串:int(str_count.replace(',',''))
  • 部分车型没有价格数据:要用df['min_price'].fillna(0)

8. 项目结构建议

规范的目录结构能让脚本更易维护:

dongchedi-spider/ ├── config.py # API配置 ├── crawler.py # 核心爬虫 ├── utils/ # 工具函数 │ ├── storage.py │ └── visual.py └── data/ # 存储结果 ├── raw/ # 原始JSON └── processed/ # 清洗后CSV

当处理到具体车型的详细数据时,可以进一步解析series_id关联的详情页API。比如五菱宏光MINIEV的详情页URL就包含其series_id(4499),这种设计让数据采集形成了完整闭环。