-
-
Python 懂车帝口碑分爬虫
-
发表于: 2022-4-3 14:42 14685
-
<table><tr><td bgcolor=orange>本文所有教程及源码、软件仅为技术研究。不涉及计算机信息系统功能的删除、修改、增加、干扰,更不会影响计算机信息系统的正常运行。不得将代码用于非法用途,如侵立删!</td></tr></table>
懂车帝全系车型懂车分(口碑)页面中的详细车系评分数据
先来web端试下能否找到需要的数据接口,随便找个车型打开口碑页面F12查看Network
根据页面关键字先搜索一波
只在页面的标签中找到了数据,没有发现有明显的数据接口,其实用charles抓包的时候发现一个疑似的js好像数据是通过这个js加载出来的,打开看了一下数据相当混乱,暂且先放一边,先从APP分析一波看能否直接拿到数据接口
PS:手机环境、抓包环境的配置在这不在赘述,有兴趣的可参考之前的文章 APP抓包环境配置
下载懂车帝APP,并安装至手机
手机开启Postern,pc打开charles
至此抓包工作准备完成,打开懂车帝APP,随便找个车型进入懂车分页面
拿到加载的数据包,和web一样先搜索一波,看能否直接找到需要的数据
直接匹配到了多个结果,看接口是同一个接口返回的数据,双击点进去看一下详细数据
看数据结构和具体的数值和页面中的数据很像,Charles界面太小,将数据拷贝至网页中解析,方便分析,分享一个常用的json数据在线解析网站
经过仔细分析,APP中展示的数据小数点第二位是四舍五入的,从下图的web页面中可以看出,数据是一样的,成功拿到数据接口!
口碑分数据接口:
对!你没看错,就是这么长,验证一下数据接口,在网页中直接请求一下这个url
这儿推荐安装一个网页json可视化的插件,这儿偷懒没装,在线解析了一下json数据,和Charles抓到的数据是一样,经过分析得知: series_id是车系id,修改此参数即可
获取车系id就很简单了,先拿到品牌id然后根据品牌id请求车系信息,注意这是一个post接口
实际的运行过程中,发现一个问题,不同的城市同价位平均分是不一样的,所以需要指定城市获取
https://download.csdn.net/download/qq_38154948/85072078
<table><tr><td bgcolor=orange>本文仅供学习交流使用,如侵立删!</td></tr></table>
https:
/
/
*
*
*
*
*
*
*
/
get_detail
/
?series_id
=
4182
&car_id
=
0
&only_owner
=
0
&year_id
=
all
&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
=
1648907286543
&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
=
1648907102913
&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
=
https:
/
/
*
*
*
*
*
*
*
/
get_detail
/
?series_id
=
4182
&car_id
=
0
&only_owner
=
0
&year_id
=
all
&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
=
1648907286543
&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
=
1648907102913
&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
=
def
get_series(
self
, brand_id):
"""
获取品牌所有车系
brand_id:品牌id
"""
headers
=
{
'User-Agent'
:
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36'
}
param
=
{
'offset'
:
0
,
'limit'
:
1000
,
'is_refresh'
:
1
,
'city_name'
:
'北京'
,
'brand'
: brand_id
}
response
=
requests.post(url
=
url, data
=
param, headers
=
headers)
rep_json
=
json.loads(response.text)
# print(response.text)
if
rep_json[
'status'
]
=
=
'success'
:
return
rep_json[
'data'
][
'series'
]
else
:
raise
Exception(
"get car series has exception!"
)
def
get_series(
self
, brand_id):
"""
获取品牌所有车系
brand_id:品牌id
"""
headers
=
{
'User-Agent'
:
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36'
}
param
=
{
'offset'
:
0
,
'limit'
:
1000
,
'is_refresh'
:
1
,
'city_name'
:
'北京'
,
'brand'
: brand_id
}
response
=
requests.post(url
=
url, data
=
param, headers
=
headers)
rep_json
=
json.loads(response.text)
# print(response.text)
if
rep_json[
'status'
]
=
=
'success'
:
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)