共计 2286 个字符,预计需要花费 6 分钟才能阅读完成。
Python 懂车帝全车系销量排行榜
需要
车系 ID 城市 时间段 车系名称 销量
4363 深圳 2022 年 2 月 Model Y 1,224
分城市榜单,所有城市热销榜,拉到底部获取全副车系数据
操作环境
- win10
- Google nexus5x(root)
- Python3.9
-
Charles
需要剖析
既然须要所有城市的热销榜,那么第一步须要先拿到全国城市列表
先来 web 端试下是否找到须要的数据接口,关上页面 F12 查看 Network
依据页面关键词搜寻没有找到显著的数据接口,尽管说当初也能够应用 request 或者 selenium 间接在页面解析数据,然而毕竟这不是首选计划,还是从 APP 剖析一下在决定用什么计划。
PS:手机环境、抓包环境的配置在这不在赘述,有趣味的可参考之前的文章 APP 抓包环境配置
下载懂车帝 APP,并装置至手机
手机开启 Postern,pc 关上 charles
至此抓包工作筹备实现,关上懂车帝 APP,进入抉择城市页面
还是老套路先依据页面关键词搜寻一波
居然没有须要的数据!不焦急,多试几次,确定 Charles 抓到了所有的数据包,而后逐条剖析一下,找到下图这个接口,看路径名猜想应该就是须要的数据接口,原来数据中中文通过了编码,难怪搜寻不到,在线 json 解析看一下
分享一个罕用的 json 数据在线解析网站
正是所需数据
全国城市列表接口:
https://********?iid=2467735824764398&device_id=40011211486215&ac=wifi&channel=dcd-yd-11zh-and-74&aid=36&app_name=automobile&version_code=693&version_name=6.9.3&device_platform=android&os=android&ab_client=a1%2Cc2%2Ce1%2Cf2%2Cg2%2Cf7&ab_group=3167590%2C3577236%2C3333988&ssmix=a&device_type=Nexus+5X&device_brand=google&language=zh&os_api=27&os_version=8.1.0&manifest_version_code=693&resolution=1080*1794&dpi=420&update_version_code=6931&_rticket=1649079408626&cdid=f3163204-7faf-45d7-89c4-e82215c3216c&city_name=%E8%81%8A%E5%9F%8E&gps_city_name=%E8%81%8A%E5%9F%8E&selected_city_name&rom_version=27&longi_lati_type=1&longi_lati_time=1649079423941&content_sort_mode=0&total_memory=1.77&cpu_name=Qualcomm+Technologies%2C+Inc+MSM8992&overall_score=4.873&cpu_score=4.8872&host_abi=armeabi-v7a
对!你没看错,就是这么长,验证一下数据接口,在网页中间接申请一下这个 url
这儿举荐装置一个网页 json 可视化的插件,这儿偷懒没装,在线解析了一下 json 数据,和 Charles 抓到的数据是一样
城市热销榜数据接口就比较简单了,应用下面的办法很容易就能抓到数据接口,批改 city_name 参数和 offset 翻页即可
https:/******?city_name=%E8%A5%BF%E5%AE%89&count=10&offset=10&month=&new_energy_type=&
rank_data_type=64&brand_id=&price=&manufacturer=&outter_detail_type=&nation=0
获取全国城市列表
间接申请接口获取即可,这边应用了一个 jsonpath 模块用来提取 json 数据,很好用强烈推荐!
def get_month(self):
"""获取城市列表"""
response = self._parse_url(url).json()
# 提取 json 数据中所有的城市名
models = jsonpath(response, '$..city_name')
return models
获取指定城市热销榜
def get_score(self, city_name):
"""
获取指定城市热销榜
city_name: 城市名
"""
offset = 0
while True:
response = self._parse_url(url).json()
tag_list = response.get('data').get('list')
# 没有数据跳出
if not tag_list:
return
for tag in tag_list:
series_id = tag.get('series_id') # 车系 ID
series_name = tag.get('series_name') # 车系名称
count = tag.get('count') # 车系销量
yield series_id, series_name, count
# 翻页参数
offset += 100
运行成果
资源下载
https://download.csdn.net/download/qq_38154948/85077866
本文仅供学习交换应用,如侵立删! |
——