当前位置:博客首页>>Python >> 阅读正文

抓取摩拜单车车辆位置数据

作者: 郑晓 分类: Python 发布于: 2017-07-25 12:10 浏览(8,810) 评论(12)


每天从下车站到公司还有好几米的路要走,这对于现在能免费骑车的懒癌患者怎么能忍?车站人流量大,能找到辆车实属不易,所以就得在下公交车前不停的刷新app查看下车点是否有车,有车就马上预订。

一路上不停的拿着手机刷新太麻烦了,身为码农怎么能忍?我这里要实现的就是把刷新查看目的地是否有车的这个过程实现了自动化。

实现思路是首先找到摩拜单车在地图上标记车辆位置的这个接口,然后想办法使用程序模拟这个请求,从获得的车辆数据中检查是否有符合的车辆,如果有则发送提示消息。

使用的抓包工具是charles,它可以很轻松的获取到移动设备的数据请求,具体使用方法不做介绍,请百度。

开始时是使用charles开启ssl代理,抓取手机上摩拜单车app的请求,摩拜的每个https请求都是unknow(http method是connect),看错误提示应该是证书的问题,但手机上其它的https请求是正常的(比如京东),网上的说法是使用了http隧道通信,代理工具无法抓取。

app无法抓包,转战微信小程序,在摩拜的微信小程序中查看附近车辆时,charles成功抓取到车辆位置的api(nearbyBikeInfo.do)

知道了api后就可以很轻松的模拟出请求,这里使用了python+requests进行post请求。多次测试发现header中有些看似很关键的参数其实不必要的,所以这里已经移除。

#coding=utf8
#www.zh30.com
import requests
headers = {
    "Host": "mwx.mobike.com",
    "time": "1500887680",
    "eption": "bb15c",
    "open_src": "list",
    "platform": "3",
    "citycode": "0532",
    "User-Agent": "Mozilla/5.0 (iPhone;www.zh30.com; CPU iPhone OS 10_3_2 like Mac OS X) AppleWebKit/603.2.4 (KHTML, like Gecko) Mobile/14F89 MicroMessenger/6.5.12 NetType/WIFI Language/zh_CN",
    "lang": "zh",
    "Referer": "https://servicewechat.com/wxxxxxxxx/70/page-frame.html"
}
body = {
    "longitude":"120.413333",
    "latitude":"36.087741",
    "citycode":"0532",
}

r = requests.post("https://mwx.mobike.com/mobike-api/rent/nearbyBikesInfo.do",data=body, headers=headers, verify=False);
print r.text.encode('utf-8')

注意,代码有改动:)

成功返回json数据。

格式化后,数据很清晰明白,接口返回查询的坐标周围有几辆车,并包含有每辆车的编号、坐标和与目标坐标的相对距离等信息。

接下来要做的就是从数据里过滤出比较近的车辆(distance的单位是米,值可按自己的需求定),并给出提示消息。提示消息推送可以使用pushbullet这类工具,实现也很方便。更复杂点儿可以距离坐标计算一下每个车辆在目标位置的哪个方向。这里就不实现了~

完。

       

本文采用知识共享署名-非商业性使用 3.0 中国大陆许可协议进行许可,转载时请注明出处及相应链接。

本文永久链接: https://www.zh30.com/crawl-mobike-location.html

抓取摩拜单车车辆位置数据:目前有12 条留言

用户评论头像 穆鸟发表于 2019年05月08日 18:23[回复]

楼主,我想规定搜索的范围是改哪一个地方,还有headers里面的platform和eption是什么信息呀~~

    用户评论头像 郑晓发表于 2019年05月09日 10:52[回复]

    不知道,这是摩拜自己的参数,我没研究过。。

      用户评论头像 穆鸟发表于 2019年05月09日 16:11[回复]

      好的,谢谢

用户评论头像 赵晨阳发表于 2019年01月13日 22:33[回复]

博主你好,是这样的,因为我最近是在写共享单车的论文,但是我是个爬虫小白,在用charles抓包的时候就出现了问题,不管是app还是微信小程序都不行,都是unknown,我想问一下有没有解决办法,另外我想问下您现在手里有多余的共享单车数据吗,可以发一份到我的邮箱吗?(有偿)

    用户评论头像 郑晓发表于 2019年01月14日 10:01[回复]

    数据我这里没有,接口抓包我刚才又试了一下,是可以抓到的(微信小程序摩拜单车),你的charles中有设置启用ssl代理吗?

      用户评论头像 赵晨阳发表于 2019年01月14日 15:48[回复]

      你好,启用ssl代理是SSL Proxying Settings
      在这里Add一个Location,填入
      Host: *
      Port: *
      吗?我之前是能抓到摩拜小程序,但是里面车辆一直显示在加载中,然后抓到的小程序里面的内容显示的是unknown,另外我想问一下您有没有微信或者qq,我想跟您私聊一下,感觉这样沟通不是很方便。

        用户评论头像 郭增辉发表于 2019年04月26日 15:58[回复]

        你好,我想请问下,我用Charles,原来可以抓包,后来设置手机代理后不贪粗那个确认连接的菜单该怎么解决

          用户评论头像 郑晓发表于 2019年04月26日 16:05[回复]

          关了软件重新开会重新弹吧? 如果没弹,你可以手动添加,顶部菜单Proxy->Access Control Settings。。。手动把你手机的IP添加进去。

            用户评论头像 郭增辉发表于 2019年04月26日 16:12[回复]

            你好,我手动添加了手机IP,可还是抓取不到东西,原来可以连接,也可以抓包,然后我手机系统不小心升级了,就可以连接但是抓取不到,我查了一下,是手机系统版本高于安卓7了,我又弄了个手机,刷机到安卓6,然后现在就连接不到charles,设置好代理不弹框,重启电脑和手机也不行,我们可以私下联系吗,有偿的,麻烦您帮下忙

    用户评论头像 张晓涵发表于 2019年03月04日 20:36[回复]

    你好,我最近也是在写关于共享单车的毕业论文,能否交流交流~

用户评论头像 小猪呼噜噜发表于 2018年12月12日 14:07[回复]

楼主转载你的文章到我的博客,不介意吧。可能转好多~~

    用户评论头像 郑晓发表于 2018年12月12日 14:08[回复]

    尽量保留个出处吧。。。