App接口爬取数据过程
使用抓包工具
手机使用代理,app所有请求通过抓包工具
获得接口,分析接口
反编译apk获取key
突破反爬限制
需要的工具:
夜神模拟器
Fiddler
Pycharm
实现过程
首先下载夜神模拟器模拟手机也可以用真机,然后下载Fiddler抓取手机APP数据包,分析接口完成以后使用Python实现爬虫程序

Fiddler安装配置过程
第一步:下载神器Fiddler
Fiddler下载完成之后,傻瓜式的安装一下!

第二步:设置Fiddler
打开Fiddler, Tools-> Fiddler Options (配置完后记得要重启Fiddler)
选中”Decrpt HTTPS traffic”, Fiddler就可以截获HTTPS请求
选中”Allow remote computers to connect”. 是允许别的机器把HTTP/HTTPS请求发送到Fiddler上来

记住这个端口号是:8888

夜神模拟器安装配置过程

第一步:下载安装

夜神模拟器下载完成之后,傻瓜式的安装一下!

第二步:配置桥接 实现互通

首先将当前手机网络桥接到本电脑网络 实现互通

安装完成桥接驱动后配置IP地址,要配成和本机互通的网段,配置完成后打开主机cmd终端ping通ok

第三步:配置代理
    1. 打开主机cmd

    1. 输入ipconfig查看本机IP 
    2. 配置代理 
      进入夜神模拟器–打开设置–打开WLAN 
    3. 点击修改网络–配置代理 如下图: 

      配置完后保存 
      到这里我们就设置好所有的值,下面就来测试一下,打开手机的超级课程表APP 
      1. 在夜神模拟器上下载你想爬取得App使用Fiddler抓包分析api后使用python进行爬取就可以了

      爬取充电网APP实例

      爬取部分内容截图: 

    4. 部分python代码分享:

      import requests
      import city
      import json
      import jsonpath
      import re

      city_list = city.jsons
      tags_list = city.Tag

      def city_func(city_id):
      try:
      city = jsonpath.jsonpath(city_list, '$..sub[?(@.code=={})]'.format(int(city_id)))[0]["name"]
      except:
      city = jsonpath.jsonpath(city_list, '$[?(@.code=={})]'.format(int(city_id)))[0]["name"]
      return city

      def tags_func(tags_id):
      tags_join = []
      if tags_id:
      for tags in tags_id:
      t = jsonpath.jsonpath(tags_list,'$..spotFilterTags[?(@.id=={})]'.format(int(tags)))
      tags_join.append(t[0]["title"])

      return ('-'.join(tags_join))

      def split_n(ags):
      return re.sub('\n',' ',ags)

      def request(page):
      print('开始下载第%d页'%page)
      url = 'https://app-api.chargerlink.com/spot/searchSpot'
      two_url = "https://app-api.chargerlink.com/spot/getSpotDetail?spotId={d}"
      head = {
      "device": "client=android&cityName=%E5%8C%97%E4%BA%AC%E5%B8%82&cityCode=110106&lng=116.32154281224254&device_id=8A261C9D60ACEBDED7CD3706C92DD68E&ver=3.7.7&lat=39.895024107858724&network=WIFI&os_version=19",
      "appId": "20171010",
      "timestamp": "1532342711477",
      "signature": "36daaa33e7b0d5d29ac9c64a2ce6c4cf",
      "forcecheck": "1",
      "Content-Type": "application/x-www-form-urlencoded",
      "Content-Length": "68",
      "Host": "app-api.chargerlink.com",
      "Connection": "Keep-Alive",
      "User-Agent": "okhttp/3.2.0"
      }

      data = {
      "userFilter[operateType]": 2,
      "cityCode": 110000,
      "sort": 1,
      "page": page,
      "limit": 10,
      }

      response = requests.post(url,data=data,headers=head)
      #获取数据
      data = response.json()
      for i in data['data']:
      c = []
      id = i['id']
      name = i["name"] #充电桩名
      phone = i["phone"] #手机号
      num = i['quantity'] #有几个充电桩
      city = city_func(i["provinceCode"]) #城市
      tags =tags_func(i["tags"].split(','))#标签
      message = c + [id,name,phone,num,city,tags]
      parse_info(two_url.format(d=id),message)

      def parse_info(url,message):

      #打开文件
      with open('car.csv','a',encoding='utf-8')as c:
      head = {
      "device": "client=android&cityName=&cityCode=&lng=116.32154281224254&device_id=8A261C9D60ACEBDED7CD3706C92DD68E&ver=3.7.7&lat=39.895024107858724&network=WIFI&os_version=19",
      "TOKEN": "036c8e24266c9089db50899287a99e65dc3bf95f",
      "appId": "20171010",
      "timestamp": "1532357165598",
      "signature": "734ecec249f86193d6e54449ec5e8ff6",
      "forcecheck": "1",
      "Host": "app-api.chargerlink.com",
      "Connection": "Keep-Alive",
      "User-Agent": "okhttp/3.2.0",
      }
      #发起详情请求
      res = requests.get(url,headers=head)
      price = split_n(jsonpath.jsonpath(json.loads(res.text),'$..chargingFeeDesc')[0]) #价钱
      payType = jsonpath.jsonpath(json.loads(res.text),'$..payTypeDesc')[0] #支付方式
      businessTime =split_n(jsonpath.jsonpath(json.loads(res.text),'$..businessTime')[0]) #营业时间
      result = (message + [price,payType,businessTime])
      r = ','.join([str(i) for i in result])+',\n'
      c.write(r)

      def get_page():
      url = 'https://app-api.chargerlink.com/spot/searchSpot'
      head = {
      "device": "client=android&cityName=%E5%8C%97%E4%BA%AC%E5%B8%82&cityCode=110106&lng=116.32154281224254&device_id=8A261C9D60ACEBDED7CD3706C92DD68E&ver=3.7.7&lat=39.895024107858724&network=WIFI&os_version=19",
      "appId": "20171010",
      "timestamp": "1532342711477",
      "signature": "36daaa33e7b0d5d29ac9c64a2ce6c4cf",
      "forcecheck": "1",
      "Content-Type": "application/x-www-form-urlencoded",
      "Content-Length": "68",
      "Host": "app-api.chargerlink.com",
      "Connection": "Keep-Alive",
      "User-Agent": "okhttp/3.2.0"
      }

      data = {
      "userFilter[operateType]": 2,
      "cityCode": 110000,
      "sort": 1,
      "page": 1,
      "limit": 10,
      }
      response = requests.post(url, data=data, headers=head)
      # 获取数据
      data = response.json()
      total = (data["pager"]["total"])
      page_Size = (data["pager"]["pageSize"])
      totalPage = (data['pager']["totalPage"])
      print('当前共有{total}个充电桩,每页展示{page_Size}个,共{totalPage}页'.format(total=total,page_Size=page_Size,totalPage=totalPage))
      if __name__ == '__main__':
      get_page()
      start = int(input("亲,请输入您要获取的开始页:"))
      end = int(input("亲,请输入您要获取的结束页:"))
      for i in range(start,end+1):
      request(i)
      ---------------------
      作者:爱python的王三金
      来源:CSDN
      原文:https://blog.csdn.net/qq_37275405/article/details/81181439
      版权声明:本文为博主原创文章,转载请附上博文链接!

使用python抓取App数据的更多相关文章

  1. Python 逆向抓取 APP 数据

    今天继续给大伙分享一下 Python 爬虫的教程,这次主要涉及到的是关于某 APP 的逆向分析并抓取数据,关于 APP 的反爬会麻烦一些,比如 Android 端的代码写完一般会进行打包并混淆加密加固 ...

  2. fillder抓取APP数据之小程序

    1.下载fillder ,fillder官网:https://www.telerik.com/fiddler 2.安装好后设置fillder: 工具—>选项,打开设置面板.选择HTTPS选项卡. ...

  3. Python3.x+Fiddler抓取APP数据

    随着移动互联网的市场份额逐步扩大,手机APP已经占据我们的生活,以往的数据分析都借助于爬虫爬取网页数据进行分析,但是新兴的产品有的只有APP,并没有网页端这对于想要提取数据的我们就遇到了些问题,本章以 ...

  4. python 抓取金融数据,pandas进行数据分析并可视化系列 (一)

    终于盼来了不是前言部分的前言,相当于杂谈,算得上闲扯,我觉得很多东西都是在闲扯中感悟的,比如需求这东西,一个人只有跟自己沟通好了,总结出某些东西了,才能更好的和别人去聊,去说. 今天这篇写的是明白需求 ...

  5. 利用python抓取页面数据

    1.首先是安装python(注意python3.X和python2.X是不兼容的,我们最好用python3.X) 安装方法:安装python 2.安装成功后,再进行我们需要的插件安装.(这里我们需要用 ...

  6. python 抓取alexa数据

    要抓取http://www.alexa.cn/rank/baidu.com网站的排名信息:例如抓取以下信息: 需要微信扫描登录 因为这个网站抓取数据是收费,所以就利用网站提供API服务获取json信息 ...

  7. 记录使用jQuery和Python抓取采集数据的一个实例

    从现成的网站上抓取汽车品牌,型号,车系的数据库记录. 先看成果,大概4w条车款记录 一共建了四张表,分别存储品牌,车系,车型和车款 大概过程: 使用jQuery获取页面中呈现的大批内容 能通过页面一次 ...

  8. 利用Fidder工具抓取App数据包

    第一步:下载神器Fiddler,下载链接: http://fiddler2.com/get-fiddler 下载完成之后,傻瓜式的安装一下了! 第二步:设置Fiddler打开Fiddler,     ...

  9. 网络爬虫-使用Python抓取网页数据

    搬自大神boyXiong的干货! 闲来无事,看看了Python,发现这东西挺爽的,废话少说,就是干 准备搭建环境 因为是MAC电脑,所以自动安装了Python 2.7的版本 添加一个 库 Beauti ...

随机推荐

  1. php利用href进行页面传值的正确姿势

    首先在a.php中 <?php $a = "world"; echo "<a href='b.php?m=$a'>删除</a>"; ...

  2. 访问Storm ui界面,出现org.apache.storm.utils.NimbusLeaderNotFoundException: Could not find leader nimbus from seed hosts ["master" "slave1"]. Did you specify a valid list of nimbus hosts for confi的问题解决(图文详解)

    不多说,直接上干货! 前期博客 apache-storm-1.0.2.tar.gz的集群搭建(3节点)(图文详解)(非HA和HA)  问题详情 org.apache.storm.utils.Nimbu ...

  3. Elasticsearch开发环境搭建(Eclipse\MyEclipse + Maven)

    前提是, Elasticsearch 编程API入门系列---说在前面的话 Eclipse下Maven新建项目.自动打依赖jar包(包含普通项目和Web项目) setting.xml配置文件 如何在M ...

  4. MyBatis数据持久化(九)动态sql

    本文摘自:mybatis参考文档中文版 MyBatis的一个强大的特性之一通常是它的动态SQL能力.如果你有使用JDBC或其他相似框架的经验,你就明白条件地串联SQL字符串在一起是多么的痛苦,确保不能 ...

  5. png库结合zlib库使用出现的一个链接问题的解决

    作者:朱金灿 来源:http://blog.csdn.net/clever101 要使用png库,首先得编译png库,要编译png库,得依赖zlib库的头文件.在使用png库读取一个png文件时,代码 ...

  6. Hibernate框架学习(一)——入门

    一.框架是什么 1.框架是用来提高开发效率的 2.封装好了一些功能,我们需要使用这些功能时,调用即可,不需要手动实现 3.框架可以理解成一个半成品的项目,只要懂得如何驾驭这些功能即可 二.hibern ...

  7. php 基础------数组过滤

    array_filter();过滤数组 语法: array_filter(array,callbackfunction); array 必写,规定要过滤的数组 callbackfunction 必写, ...

  8. php——get与post方法(转)

    file_get_contents版本: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 <?php /**  * 发送p ...

  9. C++调用约定和名字约定 thiscall

    调用约定: __cdecl __fastcall与 __stdcall,三者都是调用约定(Calling convention),它决定以下内容:1)函数参数的压栈顺序,2)由调用者还是被调用者把参数 ...

  10. iOS开发——循环遍历的比较

    常用的有for in.for循环.EnumerateObjectsUsingBlock 1.小规模的数据无所谓,但是对大量数据,for in 的遍历速度非常之快,不是for循环能比的: 2.对于数组, ...