星星充电 充电桩数据爬虫

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

某星充电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+时间戳生成的

   defget_signtrue(self, dic: dict):

       """

       生成signature参数:7.9.0版本

       """

       if (not"userId"indic):

           dic["userId"] =""

       new_list= []

       foriinself.run_sort(dic.keys()):

           new_list.append(f"{i}={dic[i]}")

       returnself.get_md5("&".join(new_list))

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

   defget_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

       whileTrue:

           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)

           ifnotres.textorres.status_code!=200:

               logger.info(f'{k}{page}页数据获取失败')

               return

           ifnotres.json().get('data'):

               logger.info(f'{k} 数据获取完成')

               return

           new_path='数据'+os.sep+k

           ifnotos.path.exists(new_path):

               os.makedirs(new_path)

           filename=new_path+os.sep+'站点列表.json'

           # 多页的情况直接把新数据添加至已有文件

           ifos.path.exists(filename):

               withopen(filename, 'r+', encoding='utf-8') asf:

                   row_data=json.load(f)

                   row_data['data'] +=res.json().get('data')

                   withopen(filename, 'w', encoding='utf-8') asf1:

                       json.dump(row_data, f1, ensure_ascii=False)

           else:

               withopen(filename, 'w', encoding='utf-8') asf:

                   # ensure_ascii 不适用ascii编码 解决不能显示中文问题

                   json.dump(res.json(), f, ensure_ascii=False)

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

           page+=1

获取站点详情信息

       defget_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)

       ifnotresponse.textorresponse.status_code!=200:

           logger.info(f'{name} 数据获取失败')

           return

       ifnotresponse.json().get('data'):

           logger.info(f'{name} 数据获取完成')

           return

       returnresponse.json()

效果

资源下载

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


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


相关文章
|
9月前
|
数据采集 NoSQL 关系型数据库
Python爬虫去重策略:增量爬取与历史数据比对
Python爬虫去重策略:增量爬取与历史数据比对
|
7月前
|
数据采集 Web App开发 JavaScript
Python爬虫解析动态网页:从渲染到数据提取
Python爬虫解析动态网页:从渲染到数据提取
|
9月前
|
数据采集 存储 缓存
Python爬虫与代理IP:高效抓取数据的实战指南
在数据驱动的时代,网络爬虫是获取信息的重要工具。本文详解如何用Python结合代理IP抓取数据:从基础概念(爬虫原理与代理作用)到环境搭建(核心库与代理选择),再到实战步骤(单线程、多线程及Scrapy框架应用)。同时探讨反爬策略、数据处理与存储,并强调伦理与法律边界。最后分享性能优化技巧,助您高效抓取公开数据,实现技术与伦理的平衡。
466 4
|
9月前
|
数据采集 云安全 人工智能
|
9月前
|
数据采集 搜索推荐 API
Python 原生爬虫教程:京东商品列表页面数据API
京东商品列表API是电商大数据分析的重要工具,支持开发者、商家和研究人员获取京东平台商品数据。通过关键词搜索、分类筛选、价格区间等条件,可返回多维度商品信息(如名称、价格、销量等),适用于市场调研与推荐系统开发。本文介绍其功能并提供Python请求示例。接口采用HTTP GET/POST方式,支持分页、排序等功能,满足多样化数据需求。
|
10月前
|
Web App开发 数据采集 前端开发
Python + Chrome 爬虫:如何抓取 AJAX 动态加载数据?
Python + Chrome 爬虫:如何抓取 AJAX 动态加载数据?
|
10月前
|
数据采集 XML 存储
Python爬虫实战:一键采集电商数据,掌握市场动态!
这个爬虫还挺实用,不光能爬电商数据,改改解析规则,啥数据都能爬。写爬虫最重要的是要有耐心,遇到问题别着急,慢慢调试就成。代码写好了,运行起来那叫一个爽,分分钟几千条数据到手。
|
11月前
|
数据采集 JSON Java
Java爬虫获取微店快递费用item_fee API接口数据实现
本文介绍如何使用Java开发爬虫程序,通过微店API接口获取商品快递费用(item_fee)数据。主要内容包括:微店API接口的使用方法、Java爬虫技术背景、需求分析和技术选型。具体实现步骤为:发送HTTP请求获取数据、解析JSON格式的响应并提取快递费用信息,最后将结果存储到本地文件中。文中还提供了完整的代码示例,并提醒开发者注意授权令牌、接口频率限制及数据合法性等问题。
|
9月前
|
数据采集 API 数据格式
Python 原生爬虫教程:京东商品详情页面数据API
本文介绍京东商品详情API在电商领域的应用价值及功能。该API通过商品ID获取详细信息,如基本信息、价格、库存、描述和用户评价等,支持HTTP请求(GET/POST),返回JSON或XML格式数据。对于商家优化策略、开发者构建应用(如比价网站)以及消费者快速了解商品均有重要意义。研究此API有助于推动电商业务创新与发展。
|
10月前
|
数据采集 存储 安全
Python爬虫实战:利用短效代理IP爬取京东母婴纸尿裤数据,多线程池并行处理方案详解
本文分享了一套结合青果网络短效代理IP和多线程池技术的电商数据爬取方案,针对京东母婴纸尿裤类目商品信息进行高效采集。通过动态代理IP规避访问限制,利用多线程提升抓取效率,同时确保数据采集的安全性和合法性。方案详细介绍了爬虫开发步骤、网页结构分析及代码实现,适用于大规模电商数据采集场景。