抓取手机 app 的数据(摩拜单车)

2,350 阅读6分钟
原文链接: zhuanlan.zhihu.com

前几天有人私信我,问能不能帮忙抓取摩拜单车的数据。。。

我想着授人以鱼不如授人以渔,所以本次我们就讲讲如何抓取手机app的内容吧

<img src="https://pic2.zhimg.com/v2-046c96ca72b7326517113b34d49b34e9_b.png" data-rawwidth="727" data-rawheight="124" class="origin_image zh-lightbox-thumb" width="727" data-original="https://pic2.zhimg.com/v2-046c96ca72b7326517113b34d49b34e9_r.png"><img src="https://pic3.zhimg.com/v2-a719bd45809bf82e9550778f6b451aee_b.png" data-rawwidth="1286" data-rawheight="153" class="origin_image zh-lightbox-thumb" width="1286" data-original="https://pic3.zhimg.com/v2-a719bd45809bf82e9550778f6b451aee_r.png">

fiddle的安装及配置

抓手机包我用的是fiddle。

安装

先在下载页面下载--->Download Fiddler Web Debugging Tool for Free by Telerik

选择你“准备用fiddle来干嘛”

你的邮箱

以及同意“最终用户许可协议”就可以下载了

<img src="https://pic2.zhimg.com/v2-d41ac8c351ab978f79bc6e4b7d86779d_b.png" data-rawwidth="783" data-rawheight="440" class="origin_image zh-lightbox-thumb" width="783" data-original="https://pic2.zhimg.com/v2-d41ac8c351ab978f79bc6e4b7d86779d_r.png">下载后按照提示安装就可以了。

下载后按照提示安装就可以了。

配置

  1. 点击tool->telerik fiddler options...

<img src="https://pic2.zhimg.com/v2-40817c6d1ea12b22eedafd60041a8b89_b.png" data-rawwidth="596" data-rawheight="310" class="origin_image zh-lightbox-thumb" width="596" data-original="https://pic2.zhimg.com/v2-40817c6d1ea12b22eedafd60041a8b89_r.png">

2. 点击connections,然后勾选 “allow remote computers to connect”

记住这边的端口号(8888)

<img src="https://pic4.zhimg.com/v2-242229432c64e0aceba37d454440116f_b.png" data-rawwidth="553" data-rawheight="370" class="origin_image zh-lightbox-thumb" width="553" data-original="https://pic4.zhimg.com/v2-242229432c64e0aceba37d454440116f_r.png">

开始抓吧

  1. 首先确保电脑和手机连在同一个WiFi下面
  2. 打开fiddle
  3. 获取电脑ip
    1. 打开cmd命令行
    2. 输入ipconfig,如图所示,192.168.31.146就是我的ip地址
    3. <img src="https://pic1.zhimg.com/v2-fa225216d7d337b2de0c94b466fcb8e8_b.png" data-rawwidth="987" data-rawheight="512" class="origin_image zh-lightbox-thumb" width="987" data-original="https://pic1.zhimg.com/v2-fa225216d7d337b2de0c94b466fcb8e8_r.png">
  4. 打开手机WiFi设置,找到你当前链接的WiFi
    1. 我当前链接的是Xiaomi_E172_5G
    2. <img src="https://pic4.zhimg.com/v2-7db1a9dffdad8ef60103782dd0e474bb_b.png" data-rawwidth="1242" data-rawheight="2208" class="origin_image zh-lightbox-thumb" width="1242" data-original="https://pic4.zhimg.com/v2-7db1a9dffdad8ef60103782dd0e474bb_r.png">
  5. 设置代理服务器为你电脑的ip,端口号为上面设置的端口号(默认为8888)
  6. <img src="https://pic2.zhimg.com/v2-1117f8d205a4104d60a26dae29ee3621_b.png" data-rawwidth="1242" data-rawheight="2208" class="origin_image zh-lightbox-thumb" width="1242" data-original="https://pic2.zhimg.com/v2-1117f8d205a4104d60a26dae29ee3621_r.png">
  7. 安装https证书
    1. 在手机浏览器上打开 你电脑ip:你设置的端口号
    2. 我的是192.168.31.146:8888
    3. 点击框框处安装证书
    4. <img src="https://pic3.zhimg.com/v2-dcbf628ae6d5e3e5da5734f657a0930e_b.png" data-rawwidth="640" data-rawheight="486" class="origin_image zh-lightbox-thumb" width="640" data-original="https://pic3.zhimg.com/v2-dcbf628ae6d5e3e5da5734f657a0930e_r.png">
  8. 设置fiddle监听所有请求
    1. 选择all process
    2. <img src="https://pic2.zhimg.com/v2-df0615d8fdd1ab00da1d22a95f7da475_b.png" data-rawwidth="1000" data-rawheight="473" class="origin_image zh-lightbox-thumb" width="1000" data-original="https://pic2.zhimg.com/v2-df0615d8fdd1ab00da1d22a95f7da475_r.png">
  9. 打开摩拜单车app
    1. 然后你会看到定位的时候一辆车也没有。。。
    2. <img src="https://pic1.zhimg.com/v2-3bd9fd13aaf3e31f9390a3dc93c7018c_b.png" data-rawwidth="720" data-rawheight="1280" class="origin_image zh-lightbox-thumb" width="720" data-original="https://pic1.zhimg.com/v2-3bd9fd13aaf3e31f9390a3dc93c7018c_r.png">
    3. 打开个人详情页还提示“抱歉,服务暂不可用。。。”
    4. <img src="https://pic2.zhimg.com/v2-df0ea9ab939c7370a5efe7c1ac604415_b.png" data-rawwidth="720" data-rawheight="1280" class="origin_image zh-lightbox-thumb" width="720" data-original="https://pic2.zhimg.com/v2-df0ea9ab939c7370a5efe7c1ac604415_r.png">
    5. 这是因为摩拜有防抓取限制(我猜是检测,如果有使用代理的话,直接让你用不了。。。)
    6. 那这样的话我们就没办法抓到么???
    7. 因为我之前还用过摩拜的小程序,所以我们抓抓微信小程序试试看
    8. 打开摩拜单车的小程序
    9. 我们看到已经定位了。。,并且把附件的单车都显示出来了
    10. <img src="https://pic4.zhimg.com/v2-79256a940d361e2200bf0bf354f09f77_b.png" data-rawwidth="720" data-rawheight="1280" class="origin_image zh-lightbox-thumb" width="720" data-original="https://pic4.zhimg.com/v2-79256a940d361e2200bf0bf354f09f77_r.png">
    11. 我们可以多移动我们的位置,然后等有把附近的车显示出来
    12. 可以看到fiddle上面已经有好多请求了
      1. <img src="https://pic1.zhimg.com/v2-49b06118288c72eb21f6e2a8a06a7554_b.png" data-rawwidth="850" data-rawheight="350" class="origin_image zh-lightbox-thumb" width="850" data-original="https://pic1.zhimg.com/v2-49b06118288c72eb21f6e2a8a06a7554_r.png">
      2. 那么如何找到摩拜的那一条呢。。。
      3. 很简单,看单词就好。。。
      4. <img src="https://pic1.zhimg.com/v2-e5a15d29112f19bdf637668580a0c10c_b.png" data-rawwidth="1743" data-rawheight="905" class="origin_image zh-lightbox-thumb" width="1743" data-original="https://pic1.zhimg.com/v2-e5a15d29112f19bdf637668580a0c10c_r.png">
      5. mobike-api。。。这很明显就是我们要找的请求
      6. 请求头如下图所示,方法是post
      7. <img src="https://pic1.zhimg.com/v2-f0e0cba838ef79df7cf6e33e43180078_b.png" data-rawwidth="643" data-rawheight="423" class="origin_image zh-lightbox-thumb" width="643" data-original="https://pic1.zhimg.com/v2-f0e0cba838ef79df7cf6e33e43180078_r.png">
      8. 参数如下图
      9. <img src="https://pic1.zhimg.com/v2-01de8a708eb934956998f44dae675360_b.png" data-rawwidth="853" data-rawheight="288" class="origin_image zh-lightbox-thumb" width="853" data-original="https://pic1.zhimg.com/v2-01de8a708eb934956998f44dae675360_r.png">
      10. 返回值因为我看到是json的格式了,所以直接以json的格式看。
      11. <img src="https://pic3.zhimg.com/v2-32a23c057bcc591049c202da606a09b6_b.png" data-rawwidth="879" data-rawheight="360" class="origin_image zh-lightbox-thumb" width="879" data-original="https://pic3.zhimg.com/v2-32a23c057bcc591049c202da606a09b6_r.png">
      12. 那么直接模拟发送吧
    13. 直接看代码吧。。。
    14. import requests
      # 如果headers里面没有referer则会访问异常
      # referer表示上一个页面是什么。
      headers = {
          'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Mobile/14E304 MicroMessenger/6.5.7 NetType/WIFI Language/zh_CN',
          'Content-Type': 'application/x-www-form-urlencoded',
          'Referer': 'https://servicewechat.com/wx80f809371ae33eda/23/page-frame.html',
      }
      url = 'https://mwx.mobike.com/mobike-api/rent/nearbyBikesInfo.do'
      data = {
          'longitude':'121.1883',# 经度
          'latitude':'31.05147', # 纬度
          'citycode':'021',
          'errMsg':'getMapCenterLocation:ok'
      
      }
      # 下面必须加上verify=False,表示不验证ssl,要不然一直报错。。。
      z = requests.post(url,data=data,headers=headers,verify=False)
      
      <img src="https://pic2.zhimg.com/v2-242e5fe0d25c6bc74b3c896b73758f3d_b.png" data-rawwidth="1128" data-rawheight="193" class="origin_image zh-lightbox-thumb" width="1128" data-original="https://pic2.zhimg.com/v2-242e5fe0d25c6bc74b3c896b73758f3d_r.png">

可以看到我们已经抓取了需要的数据,那么怎么抓取整个上海的摩拜单车情况呢??

只要获取上海的所有经纬度,然后替换上面data中的经度及纬度就可以了。。。

那么怎么获取上海的所有经纬度。。。

我发现挺难的。。。(有人拿到了请告诉我一声,谢谢)

然后我用了高德地图api的搜索功能,搜索了上海的所有小区的经纬度。一共898个,

然后查了这898个小区附件的摩拜单车情况....

总结

看完本编文章,你应该学会“如何抓取手机app的包”

其实挺简单的(就是你手机通过电脑上网,然后这台电脑上所有的请求都被抓下来了,那么你手机的请求自然也被抓下来了)

大家还可以试着抓抓知乎客户端的包。。。

更多fiddle的使用技巧,请善用百度、Google

最后所有代码在github.com/kimg1234/pa…

大家有空的话帮忙关注下公众微信号。。。搜索“python爬虫”第一个就是

或者长按下图识别二维码,谢谢~


aHR0cHM6Ly9tcC53ZWl4aW4ucXEuY29tL21wL3Byb2ZpbGVfZXh0P2FjdGlvbj1ob21lJl9fYml6PU16VTJPVEF4TlRjd013PT0mc2NlbmU9NCN3ZWNoYXRfcmVkaXJlY3Q= (二维码自动识别)