摩拜单车爬虫解析——找到API

作者: 我是思聪 | 来源:发表于2017-02-12 18:58 被阅读19024次

    2017-7-19:想查看当前单车实时位置?请看 http://www.jianshu.com/p/058d847ba297
    警告:此篇文章仅作为学习研究参考用途,请不要用于非法目的。

    在上一篇文章《摩拜单车非官方大数据分析》中提到了我在春节期间对摩拜单车的数据分析,在后面的系列文章中我将进一步的阐述我的爬虫是如何高效的爬到这些数据的。

    为什么爬摩拜的数据

    摩拜是最早进入成都的共享单车,每天我从地铁站下来的时候,在APP中能看到很多单车,但走到那里的时候,才发现车并不在那里。有些车不知道藏到了哪里;有些车或许是在高楼的后面,由于有GPS的误差而找不到了;有些车被放到了小区里面,一墙之隔让骑车人无法获得到车。

    那么有没有一个办法通过获得这些单车的数据,来分析这些车是否变成了僵尸车?是否有人故意放到小区里面让人无法获取呢?

    带着这些问题,我开始了研究如何获取这些数据。

    从哪里获得数据

    如果你能够看到数据,那么我们总有办法自动化的获取到这些数据。只不过获取数据的方式方法决定了获取数据的效率,对于摩拜单车的数据分析这个任务而言,这个爬虫要能够在短时间内(通常是10分钟左右)获取到更多的数据,对于数据分析才有用处。那么数据来源于哪里?

    最直接的来源是摩拜单车的APP。现代的软件设计都讲究前后端分离,而且服务端会同时服务于APP、网页等。在这种趋势下我们只需要搞清楚软件的HTTP请求就好了。一般而言有以下一些工具可以帮忙:

    直接抓包:

    • Wireshark (在路由器或者电脑)
    • Shark for Root (Android)

    用代理进行HTTP请求抓包及调试:

    • Fiddler 4
    • Charles
    • Packet Capture (Android)

    由于我的手机没有root,在路由器上抓包又太多的干扰,对于https也不好弄。所以只能首先采用Fiddler或者Charles的方式试试。挂上Fiddler的代理,然后在手机端不停的移动位置,看有没有新的请求。但遗憾的是似乎请求都是去拿高德地图的,并没有和摩拜车相关的数据。

    那怎么一回事?试试手机端的。换成Packet Capture后果然就有流量了,在请求中找到了我最关心的那个:

    4372317-de272f8395d2106f.png

    这个API请求一看就很显然了,在postman中试了一下能够正确的返回信息,看来就是你了!

    高兴得太早

    连续爬了几天的数据,将数据进行一分析,发现摩拜单车的GPS似乎一直在跳动,有时候跳动会超过几公里的距离,显然不是一个正常的值。

    难道是他们的接口做了手脚返回的是假数据?我观察到即便在APP中,单车返回的数据也有跳动。有某一天凌晨到第二天早上,我隔段时间刷新一下我家附近的车,看看是否真的如此。

    图片我找不到了,但是观察后得出的结论是,APP中返回的位置确实有问题。有一台车放在一个很偏僻的位置,一会儿就不见了,待会儿又回来了,和我抓下来的数据吻合。而且这个跳动和手机、手机号、甚至移动运营商没有关系,说明这个跳动是摩拜接口的问题,也可以从另一方面解释为什么有时候看到车但其实那里没有车。

    这是之前发的一个朋友圈的视频截图,可以看到在营门口附近有一个尖,在那里其实车是停住的,但是GPS轨迹显示短时间内在附近攒动,甚至攒动到很远,又回到那个位置。

    这样的数据对于数据分析来讲根本没法用,我差点就放弃了。

    转机

    随着微信小程序的火爆,摩拜单车也在第一时间出了小程序。我一看就笑了,不错,又给我来了一个数据源,试试。用Packet Capture抓了一次数据后很容易确定API,具体过程就不在阐述。抓取后爬取了两三天的数据,发现出现了转机,数据符合正常的单车的轨迹。

    剩下事情,就是提高爬虫的效率了。

    其他尝试

    有时候直接分析APP的源代码会很方便的找到API入口,将摩拜的Android端的APP进行反编译,但发现里面除了一些资源文件有用外,其他的文件都是用奇虎360的混淆器加壳的。网上有文章分析如何进行脱壳,但我没有太多时间去钻研,也就算了。

    也谈API的设计

    摩拜单车的API之所以很容易抓取和分析,很大程度上来讲是由于API设计的太简陋:

    • 仅使用http请求,使得很容易进行抓包分析
    • 在这些API中都没有对request进行一些加密,使得自己的服务很容易被人利用。
    • 另外微信小程序也是泄露API的一个重要来源,毕竟在APP中request请求可以通过native代码进行加密然后在发出,但在小程序中似乎还没有这样的功能。

    如果大家有兴趣,可以试着看一下小蓝单车APP的request,他们使用https请求,对数据的request进行了加密,要抓取到他们的数据难度会增加非常多。

    当然了,如果摩拜单车官方并不care数据的事情的话,这样的API设计也是ok的。

    下一篇文章将开源爬虫的源代码,敬请期待!如果您觉得文章有用,请打赏一杯咖啡,谢谢:)

    相关文章

      网友评论

      • Evtion:你好,那个抓包抓出来摩拜单车的API之后,只给出了大概500米内的单车数据。怎么样才能过去一个城市的数据呢??小白不太熟悉:smiley::smiley:,谢谢
        Evtion:@博诚数据 谢谢:smile:
        我是思聪: @芒果DB 请见www.dancheditu.com
      • 神秘的尹先生:会写代码不稀奇,能写代码还有如此文档能力的真的不容易,加油,共勉!
      • 青衣梦舞:你好,看了你的文章,非常感谢你的分享。有一个问题请教下,从爬虫获取的数据应该发现某个单车的历史数据接口了吗?现在这种方式的数据无法体现动态特性,对于分析来说价值比较小
        青衣梦舞: @博诚数据 采集的是当前闲置的。历史轨迹的出不来
        我是思聪: @青衣梦舞 没有历史数据接口,采集到的是当前的。只要你频率够高,就会有动态特征了。
      • 0ea3bd3cb660:这篇文章对我受益匪浅,但还是有些不懂的,请问是如何获得移动中的摩拜的gps定位的?手机app上能显示某个位置附近的能使用的车辆数,这个范围大概是多少米呢?
        我是思聪: @蘑菇点点_08f2大 移动中的无法获取。大概是500米
      • 咸咸的炸带鱼:现在需要手机验证码登录的话,请问您有没有进一步的爬取思路指导一下呀?谢谢啦~
      • kkyon:不错.小伙子在成都吗? 有没有兴趣做数据相关工作.
        我是思聪: @kuokyong 在啊,你们做什么的
      • 8d62498d2272:您好,我是大二的学生,在做校赛建模,要求求出摩拜单车在北京师范大学或者积水潭地铁站的使用频率和分布规律,我看您的文章,前面几个方法试了一下,但是用packet capture抓取的数据很接近,好像是假数据一样,您的网站登进去也不能使用,您能开放一下服务器,让我们抓取一下数据吗?或者您能告诉我那个爬虫的源码是数据库类型的工程吗?我们还没学到那么深的知识。谢谢你啦!
      • tiantianhai:packet capture抓取包时,如何设置关心的数据
      • 墨洒:现在需要登录才能获取,还能获取真实数据吗?程序需要怎么改啊
        我是思聪: @墨洒 登录后可以
      • 别笑我呆:最近也在做膜拜爬虫的事情,但目前好像代码中的API请求有些问题了,返回的数据distance字段都是“55”,而且当我绘制整个上海一轮爬取的数据的时候,数据分布非常均匀,最诡异的是黄浦江里面都是车,:joy:
        pythonsys:@别笑我呆 那怎么处理啊,我也发现这个问题啦,但是现在登陆是手机,然后接受验证码登录的,如何是好啊
        别笑我呆:@我是思聪 是的,现在很有意思的是,你登陆账号和不登陆账号看到的车辆分布是不同的,也就是说新版本下不登陆情况下看到的就已经是假数据了:joy::joy:
        我是思聪: @别笑我呆 应该是API给返回了假数据
      • ae318a575cf6:请问获取的数据同一辆车的坐标都是一样的,是怎么回事
        我是思聪: @浮生ft若梦 应该是车没动吧
      • ae17d0264ad4:您好 请问这个数据是有单车轨迹的嘛
        我是思聪: @Huimble 可以啊,我就是这么做的
        ae17d0264ad4:啊 那做图 可以通过起止点画出轨迹来吧
        我是思聪: @Huimble 没有
      • eternalshallow:必须赞赏一个,创作不易
        eternalshallow:@我是思聪 不客气,互勉
        我是思聪: @eternalshallow 谢谢
      • edba585be706:高兴得太早,请求头eption内容怎么生成,不正确会返回【非法链接】啊
        我是思聪: @我系庆贤 哈哈,这个简单,请加微信
        d41699c52743:@博诚数据 请问你的 eption 怎么生成的呢?
        我是思聪: @遇见_1fb6 不会吧😄可能被封了
      • 摸鱼哥:iOS下面怎么弄?另外,对于https不需要特殊处理吗?不需要证书?
        摸鱼哥:@爱笑的小pp 弄好了,原来是证书安装的有问题 = =
        摸鱼哥:@贺思聪_思特沃克 嗯嗯,我再试试
        我是思聪: @爱笑的小pp 我没有ios设备不知道如何搞。应该是过个代理就可以,https需要证书
      • 大浴室:大神能不能给点数据,我们想做一个大数据+gis的分析
      • HOHOOO:期待下一篇文章:smiley: :smiley: :smiley:
      • 变成这样怪我咯:公司因为有的环境不能使用https,只好自己加了套算法在api上,安全这块现在越来越被重视了
        我是思聪: @变成这样怪我咯 服务的安全,数据的安全。
      • 浮云匿晨晖:感谢作者的分享,上次就默默想着,如果作者更新,一定要去打赏。现在就去。。。
        我是思聪: @Dawnli 哈哈,还有的
      • kaeronlyyou:牛逼了,有耐心啊
        我是思聪: @kaeronlyyou 是需要有耐心
      • leeyis:厉害👍
      • 杂家大兵:学习了,谢谢
      • 向右奔跑:厉害👍,学习了

      本文标题:摩拜单车爬虫解析——找到API

      本文链接:https://www.haomeiwen.com/subject/jcbaittx.html