一、前言

在当今数据驱动的时代,汽车销量数据对于消费者购车决策、汽车厂商市场分析都具有重要参考价值。本文将详细介绍如何使用Python爬取懂车帝平台的汽车销量数据,并通过pyecharts库实现数据的可视化展示。

二、项目概述

2.1 实现目标

  • 爬取长沙市汽车销量排行数据
  • 将数据保存为CSV文件
  • 使用pyecharts生成可视化图表

2.2 技术栈

  • Python 3.x
  • requests:发送HTTP请求
  • csv:数据存储
  • pandas:数据处理
  • pyecharts:数据可视化
  • random + time:请求延时控制

三、环境准备

3.1 安装依赖库

pip install requests pandas pyecharts

3.2 导入所需模块

import time
import random
import csv
import requests
import pandas as pd
from pyecharts.charts import Bar, Pie
from pyecharts import options as opts

四、爬虫实现详解

4.1 请求头与Cookie配置

爬取数据时需要模拟浏览器请求,配置合适的请求头和Cookie:

cookies = {
    # 使用自己的cookie
}

headers = {
    'accept': '*/*',
    'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
    'referer': 'https://www.dongchedi.com/sales/city-x-x-430100-x',
}

注意:Cookie和请求头会随时间变化失效,实际使用时需要从浏览器获取最新的值。

4.2 定义数据字段

fieldnames = ['排行', '车型号', '卖出数量', '最低价', '最高价', '车品牌', 
              '官方指导价', '经销商参考价', '指导价最低', '指导价最高', 
              '经销商最低', '车型图片']

4.3 发送请求获取数据

懂车帝的销量数据接口为分页加载,每页返回10条数据:

with open('长沙市汽车销售数据.csv', 'w+', encoding='utf-8-sig', newline='') as f:
    csv_writer = csv.DictWriter(f, fieldnames=fieldnames)
    csv_writer.writeheader()

    for i in range(0, 290, 10):
        # 随机延时,避免请求过于频繁
        time.sleep(random.uniform(2.5, 3.5))
        
        params = {
            'aid': '1839',
            'app_name': 'auto_web_pc',
            'city_name': '长沙',
            'count': '10',
            'offset': str(i),
            'rank_data_type': '64',
            # ... 其他参数
        }
        
        response = requests.get('https://www.dongchedi.com/motor/pc/car/rank_data', 
                                headers=headers, params=params, cookies=cookies)
        dataList = response.json()['data']['list']
        
        for index in dataList:
            dit = {
                '排行': index.get('rank', ''),
                '车型号': index.get('series_name', ''),
                '卖出数量': index.get('count', 0),
                '最低价': index.get('min_price', ''),
                '最高价': index.get('max_price', ''),
                '车品牌': index.get('brand_name', ''),
                '官方指导价': index.get('price', ''),
                '经销商参考价': index.get('dealer_price', '') or '暂无报价',
                '指导价最低': f"{index.get('min_price', '')}万" if index.get('min_price') else '',
                '指导价最高': f"{index.get('max_price', '')}万" if index.get('max_price') else '',
                '经销商最低': index.get('dealer_price', '').split('-')[0] if index.get('dealer_price') else '',
                '车型图片': index.get('image', '')
            }
            csv_writer.writerow(dit)
        
        print(f'第{i // 10 + 1}页数据获取完成,共{len(dataList)}条')

在这里插入图片描述

4.4 关键点说明

  1. 分页处理:通过offset参数控制分页偏移量
  2. 延时控制:使用random.uniform(2.5, 3.5)随机延时,降低被封IP的风险
  3. 异常处理:实际生产环境中建议添加try-except处理网络异常
  4. 数据清洗:对空值进行默认值填充, 使用get增加了报错处理, 比用索引获取更加方便

五、数据可视化

5.1 读取CSV数据

df = pd.read_csv('长沙市汽车销售数据.csv')

5.2 绘制销量排行柱状图

# 获取前15行数据
top15 = df.head(15)

bar = (
    Bar()
    # x轴, 将"车型号"转化为列表
    .add_xaxis(top15['车型号'].tolist())
    # y轴, 第一个参数: 字段名称, 第二个参数: 值
    .add_yaxis('销量(辆)', top15['卖出数量'].tolist())
    .set_global_opts(
        title_opts=opts.TitleOpts(title='长沙汽车销量TOP15'),
        xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=45)),
    )
)
bar.render('销量排行柱状图.html')

5.3 绘制品牌销量占比饼图

brand_sales = df.groupby('车品牌')['卖出数量'].sum().sort_values(ascending=False).head(10)

pie = (
    Pie()
    .add('', [list(z) for z in zip(brand_sales.index.tolist(), brand_sales.values.tolist())])
    .set_global_opts(title_opts=opts.TitleOpts(title='品牌销量TOP10占比'))
    .set_series_opts(label_opts=opts.LabelOpts(formatter='{b}: {d}%'))
)
pie.render('品牌销量饼图.html')

在这里插入图片描述
在这里插入图片描述

六、完整代码

import time
import random
import csv
import requests
import pandas as pd
from pyecharts.charts import Bar, Pie
from pyecharts import options as opts

# Cookie和Headers配置(此处省略,请根据实际情况填写)
cookies = { ... }
headers = { ... }

fieldnames = ['排行', '车型号', '卖出数量', '最低价', '最高价', '车品牌', 
              '官方指导价', '经销商参考价', '指导价最低', '指导价最高', 
              '经销商最低', '车型图片']

# 爬取数据
with open('长沙市汽车销售数据.csv', 'w+', encoding='utf-8-sig', newline='') as f:
    csv_writer = csv.DictWriter(f, fieldnames=fieldnames)
    csv_writer.writeheader()

    for i in range(0, 290, 10):
        time.sleep(random.uniform(2.5, 3.5))
        params = {
            'aid': '1839',
            'app_name': 'auto_web_pc',
            'city_name': '长沙',
            'count': '10',
            'offset': str(i),
            'rank_data_type': '64',
            # ... 其他参数
        }
        
        response = requests.get('https://www.dongchedi.com/motor/pc/car/rank_data', 
                                headers=headers, params=params, cookies=cookies)
        dataList = response.json()['data']['list']
        
        for index in dataList:
            dit = {
                '排行': index.get('rank', ''),
                '车型号': index.get('series_name', ''),
                '卖出数量': index.get('count', 0),
                '最低价': index.get('min_price', ''),
                '最高价': index.get('max_price', ''),
                '车品牌': index.get('brand_name', ''),
                '官方指导价': index.get('price', ''),
                '经销商参考价': index.get('dealer_price', '') or '暂无报价',
                '指导价最低': f"{index.get('min_price', '')}万" if index.get('min_price') else '',
                '指导价最高': f"{index.get('max_price', '')}万" if index.get('max_price') else '',
                '经销商最低': index.get('dealer_price', '').split('-')[0] if index.get('dealer_price') else '',
                '车型图片': index.get('image', '')
            }
            csv_writer.writerow(dit)
        
        print(f'第{i // 10 + 1}页数据获取完成,共{len(dataList)}条')

# 可视化
df = pd.read_csv('长沙市汽车销售数据.csv')

# 柱状图
top15 = df.head(15)
bar = (
    Bar()
    .add_xaxis(top15['车型号'].tolist())
    .add_yaxis('销量(辆)', top15['卖出数量'].tolist())
    .set_global_opts(
        title_opts=opts.TitleOpts(title='长沙汽车销量TOP15'),
        xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=45)),
    )
)
bar.render('销量排行柱状图.html')

# 饼图
brand_sales = df.groupby('车品牌')['卖出数量'].sum().sort_values(ascending=False).head(10)
pie = (
    Pie()
    .add('', [list(z) for z in zip(brand_sales.index.tolist(), brand_sales.values.tolist())])
    .set_global_opts(title_opts=opts.TitleOpts(title='品牌销量TOP10占比'))
    .set_series_opts(label_opts=opts.LabelOpts(formatter='{b}: {d}%'))
)
pie.render('品牌销量饼图.html')

print('数据爬取和可视化完成!')

七、运行结果

运行代码后,将生成以下文件:

  • 长沙市汽车销售数据.csv:原始数据文件
  • 销量排行柱状图.html:销量TOP15柱状图
  • 品牌销量饼图.html:品牌销量占比饼图

可视化效果示例

柱状图展示了长沙市销量前15的车型,方便直观比较各车型的销量差距。饼图则展示了销量TOP10品牌的市场份额占比。

八、注意事项

  1. Cookie时效性:文中的Cookie可能会过期,如果请求失败,需要从浏览器重新获取最新Cookie
  2. 请求频率:建议适当增加延时,避免对目标网站造成压力
  3. 数据准确性:爬虫获取的数据仅供参考,官方数据请以权威渠道为准
  4. 法律合规:请遵守网站的robots协议,合理使用爬虫技术

九、总结

本文详细介绍了使用Python爬取懂车帝汽车销量数据的完整流程,包括请求配置、数据解析、CSV存储,以及使用pyecharts进行数据可视化。这个项目涵盖了Web爬虫和数据可视化的核心技能,可以作为Python数据分析入门的一个实践案例。

希望本文对您有所帮助!如有问题,欢迎私信或者在评论区交流讨论。

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐