首页 > 其他分享 >星星充电 充电桩数据爬虫

星星充电 充电桩数据爬虫

时间:2023-02-23 01:11:21浏览次数:51  
标签:星星 get self 爬虫 json Signature 充电 lng data

本文所有教程及源码、软件仅为技术研究。不涉及计算机信息系统功能的删除、修改、增加、干扰,更不会影响计算机信息系统的正常运行。不得将代码用于非法用途,如侵立删!

某星充电APP 充电桩信息

环境

  • win10
  • 某星充电 APP 7.9.0版本
  • Android8.1

X-Ca-Signature参数分析

APP有防抓包检测,使用算法助手启动可正常抓包,分析数据包后发现关键的就是X-Ca-Timestamp和X-Ca-Signature, Timestamp很明显看出来是时间戳,重点分析一下Signature参数
在这里插入图片描述
脱壳后搜索关键词:X-Ca-Signature
只有一处跟进去分析一下具体的参数构造
在这里插入图片描述
在这里插入图片描述
可以很明显看到是参数加上固定的key拼接后做了md5处理

在这里插入图片描述

Signature参数分析

站点详情有一个Signature参数是H5加载js生成的,定位到具体赋值的位置,然后往上跟可以看到是经过一个随机uid+时间戳生成的
在这里插入图片描述

    def get_signtrue(self, dic: dict):
        """
        生成signature参数:7.9.0版本
        """
        if (not "userId" in dic):
            dic["userId"] = ""
        new_list = []
        for i in self.run_sort(dic.keys()):
            new_list.append(f"{i}={dic[i]}")
        return self.get_md5("&".join(new_list))

获取指定城市所有站点数据

    def get_SearchStation(self, k, v):
        """
        获取指定城市所有站点数据
        """
        # 提取城市经纬度
        center = v['districts'][0]['center']
        lng = center.split(',')[0]  # 经度
        lat = center.split(',')[1]  # 维度
        CityCode = v['districts'][0]['adcode']  # 城市代码
        _time = self.get_time()  # 时间戳
        page = 1
        while True:
            data = {
                "stubGroupTypes": "0",
                "currentLat": lat,  # 当前坐标经度
                "orderType": "1",
                "orCityCode": CityCode,  # 城市代码
                "lng": lng,  # 城市坐标维度
                "pagecount": "50",
                "currentLng": lng,  # 当前坐标维度
                "page": page,
                "radius": "10000",
                "lat": lat,  # 城市坐标经度
                "showPromoteLabel": "1"
            }
            X_Ca_Signature = self.get_X_Ca_Signature(data, _time)
            headers = {
                'appVersion': '7.9.1.1',
                'X-Ca-Timestamp': _time,
                'X-Ca-Signature': X_Ca_Signature,
                'Connection': 'Keep-Alive',
                'User-Agent': 'okhttp/3.12.1',
            }
            # res = requests.post(url=url, data=data, headers=headers, proxies=self.proxies, verify=True, allow_redirects=True, timeout=60)
            res = self._parse_url(url=url, data=data, headers=headers)
            # print(res.text)
            if not res.text or res.status_code != 200:
                logger.info(f'{k} 第{page}页数据获取失败')
                return
            if not res.json().get('data'):
                logger.info(f'{k} 数据获取完成')
                return

            new_path = '数据' + os.sep + k
            if not os.path.exists(new_path):
                os.makedirs(new_path)
            filename = new_path + os.sep + '站点列表.json'
            # 多页的情况直接把新数据添加至已有文件
            if os.path.exists(filename):
                with open(filename, 'r+', encoding='utf-8') as f:
                    row_data = json.load(f)
                    row_data['data'] += res.json().get('data')
                    with open(filename, 'w', encoding='utf-8') as f1:
                        json.dump(row_data, f1, ensure_ascii=False)
            else:
                with open(filename, 'w', encoding='utf-8') as f:
                    # ensure_ascii 不适用ascii编码 解决不能显示中文问题
                    json.dump(res.json(), f, ensure_ascii=False)

            logger.info(f'{k} 第{page}页数据获取成功')
            page += 1

获取站点详情信息

        def get_detail(self, stationId, name, lat, lng):
        """
        获取站点详情
        """
        _time = self.get_time()  # 时间戳
        nonce = self.get_nonce()  # nonce参数
        test_ = {
            "id": stationId,
            "gisType": "1",
            "lat": lat,
            "lng": lng,
            "stubType": "0",
            "versionFlag": "1",
            "nonce": nonce,
            "timestamp": _time
        }
        get_signtrue = self.get_signtrue(test_)
        headers = {
            "referrer": "web",
            "Accept": "application/json, text/plain, */*",
            "timestamp": _time,
            "signature": get_signtrue,
            "User-Agent": "Mozilla/5.0 (Linux; Android 8.1.0; Nexus 5X Build/OPM7.181205.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/61.0.3163.98 Mobile Safari/537.36",
            "appVersion": "7.9.0",
            "Accept-Language": "zh-CN,en-CA;q=0.8,en-US;q=0.6",
        }
        params = {
            "id": stationId,
            "gisType": "1",
            "lat": lat,
            "lng": lng,
            "stubType": "0",
            "versionFlag": "1",
            "nonce": nonce,
        }
        response = requests.get(url, headers=headers, params=params)
        print(response.text)
        if not response.text or response.status_code != 200:
            logger.info(f'{name} 数据获取失败')
            return

        if not response.json().get('data'):
            logger.info(f'{name} 数据获取完成')
            return
        return response.json()

效果

请添加图片描述

资源下载

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


本文仅供学习交流使用,如侵立删!

标签:星星,get,self,爬虫,json,Signature,充电,lng,data
From: https://www.cnblogs.com/c1033383881/p/17146531.html

相关文章

  • Day 22 22.1.2:增量式爬虫 - 场景2的实现
    场景2的实现:数据指纹使用详情页的url充当数据指纹即可。创建爬虫爬虫文件:cdproject_name(进入项目目录)scrapygenspider爬虫文件的名称(自定义一个名字即可)起始u......
  • Day 22 22.1.1:增量式爬虫 - 场景1的实现
    场景1的实现:创建爬虫爬虫文件:cdproject_name(进入项目目录)scrapygenspider爬虫文件的名称(自定义一个名字即可)起始url(例如:scrapygenspiderfirstwww.xxx.com)......
  • Day 22 22.1:增量式爬虫
    Day2222.1:增量式爬虫爬虫应用场景分类通用爬虫聚焦爬虫功能爬虫分布式爬虫增量式爬虫:用来监测网站数据更新的情况(爬取网站最新更新出来的数据)。只是一种程序......
  • Python爬虫常用:谷歌浏览器驱动——Chromedriver 插件安装教程
    我们在做爬虫的时候经常要使用谷歌浏览器驱动,今天分享下这个Chromedriver插件的安装方法。第一步、打开谷歌浏览器打开设置面板第二步、查看当前谷歌浏览器版本号第三步、......
  • Day21 21.2:CrawlSpider-redis分布式爬虫
    CrawlSpider-redis分布式分布式在日常开发中并不常用,只是一个噱头!概念:可以使用多台电脑搭建一个分布式机群,使得多台对电脑可以对同一个网站的数据进行联合且分布的......
  • 5V升压充电16.8V芯片
    ​HU5912是一款5V升压16.8V充电芯片,最大充电电流4A在多串锂电池方案广泛。HU5912采用恒流和准恒压模式(Quasi-CVTM))对电池进行充电管理,内部集成有基准电压源,电感电流检测......
  • 5V升压充电12.6V芯片
    HU5913是一款5V升压12.6V充电芯片,最大充电电流4A在多串锂电池方案广泛。HU5913采用恒流和准恒压模式(Quasi-CVTM))对电池进行充电管理,内部集成有基准电压源,电感电流检测单......
  • 如何用chatGPT、爬虫IP和网络爬虫,打造一个智能有趣的聊天机器人?
    AI(人工智能)是指让机器具有感知、合成和推理信息的能力,与人类和非人类动物的智能相对应。AI可以实现从经验中学习、适应新的输入和执行类似人类的任务。我们今天听到的大多数......
  • 2.21爬虫的一些笔记
    imporyurllib.requestresponse=urllib.request,urlopen('http://www.baidu.com')#请求站点获得一个httpResponse对象print(response.reqd().decode('utf-8'))#返回网......
  • 为啥Python多线程爬虫跑的慢?
    单线程和多线程进行数据抓取结果还是大有不同的,但是要值得注意的事,如果多线程没调配好可能连单线程的效率都比不上。本次就和大家一起聊一聊单线程多线程的一些需要注意的......