关于爬虫:Python-懂车帝口碑分爬虫

8次阅读

共计 2966 个字符,预计需要花费 8 分钟才能阅读完成。

Python 懂车帝口碑分爬虫

需要

懂车帝全系车型懂车分(口碑)页面中的具体车系评分数据

操作环境

  • win10
  • Google nexus5x(root)
  • Python3.9
  • Charles

需要剖析

先来 web 端试下是否找到须要的数据接口,轻易找个车型关上口碑页面 F12 查看 Network

依据页面关键字先搜寻一波

只在页面的标签中找到了数据,没有发现有显著的数据接口,其实用 charles 抓包的时候发现一个疑似的 js 如同数据是通过这个 js 加载进去的,关上看了一下数据相当凌乱,暂且先放一边,先从 APP 剖析一波看是否间接拿到数据接口

PS:手机环境、抓包环境的配置在这不在赘述,有趣味的可参考之前的文章 APP 抓包环境配置

下载懂车帝 APP,并装置至手机

手机开启 Postern,pc 关上 charles

至此抓包工作筹备实现,关上懂车帝 APP,轻易找个车型进入懂车分页面

拿到加载的数据包,和 web 一样先搜寻一波,看是否间接找到须要的数据

间接匹配到了多个后果,看接口是同一个接口返回的数据,双击点进去看一下具体数据

看数据结构和具体的数值和页面中的数据很像,Charles 界面太小,将数据拷贝至网页中解析,不便剖析,分享一个罕用的 json 数据在线解析网站

通过仔细分析,APP 中展现的数据小数点第二位是四舍五入的,从下图的 web 页面中能够看出,数据是一样的,胜利拿到数据接口!

口碑分数据接口:

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=

对!你没看错,就是这么长,验证一下数据接口,在网页中间接申请一下这个 url

这儿举荐装置一个网页 json 可视化的插件,这儿偷懒没装,在线解析了一下 json 数据,和 Charles 抓到的数据是一样,通过剖析得悉:series_id 是车系 id,批改此参数即可

获取全副车系 id

获取车系 id 就很简略了,先拿到品牌 id 而后依据品牌 id 申请车系信息,留神这是一个 post 接口

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_score(self, series_id, city):
    """
    获取车系口碑分
    series_id: 车系 id
    """
    response = self._parse_url(url).json()
    # 以后车系评分 综合
    series_info = list()
    series_info.append(response.get('data').get('series_info').get('score'))
    # 以后车系评分 具体
    score_info = response.get('data').get('score_info')
    if not score_info:
    return ['-'] * 16
    score = series_info + [i.get('value') for i in score_info]
    # 同价位平均分 综合
    tab_info_score = list()
    if response.get('data').get('tab_info_list'):
    tab_info_score.append(response.get('data').get('tab_info_list')[0].get('info')[0].get('score'))
    tab_info_score_info = response.get('data').get('tab_info_list')[0].get('info')[0].get('score_info')
    tab_info_score_info = tab_info_score + [i.get('value') for i in tab_info_score_info]
    else:
    tab_info_score_info = ['-'] * 8
    data = score + tab_info_score_info

    return data

运行后果


资源下载

https://download.csdn.net/download/qq_38154948/85072078


本文仅供学习交换应用,如侵立删!

——

正文完
 0