前段时间看到不少微信公众号在转发一篇爬取mobike单车的信息,也不知道什么缘由,在网上搜索了下不多有人在爬取ofo共享单车的数据,因此决定看看能够爬取ofo共享单车的那些数据。git
抓取数据开始的时候,分析了下能够经过几个渠道看到ofo共享单车的数据,主要是经过ofo公众号,ofo APP、ofo微信小程序 三个渠道能够获取数据,通常状况下手机配置代理之后,APP会出现没法联网的状况,致使没法获取数据;因为以前微信公众号能够在浏览器打开,抓取过程比较的容易,因此我比较倾向经过微信公众号进入获取共享单车数据;json
在整个爬取的过程当中使用到比较关键的工具fiddler,辅助咱们来抓取一些接口地址,这里我共享下ofo网页登录的入口地址,你们能够经过这个地址登录ofo来抓取附近单车信息,登录地址:https://common.ofo.so/newdist/?Login&~next=%22%22。从登录到开始到获取附近的单车,分析了一下对咱们比较有用的几个接口:小程序
1.登录接口,获取token信息微信小程序
https://san.ofo.so/ofo/Api/loginapi
2.获取图片验证码接口浏览器
https://base.api.ofo.com/ofo/Api/v4/getCaptchaCode微信
3.获取短信验证码接口app
https://base.api.ofo.com/ofo/Api/v4/getVerifyCode工具
4.获取附近单车的接口post
https://san.ofo.so/ofo/Api/nearbyofoCar
1、探索单车接口,获取单车数据
1.首先咱们来模拟下实际的操做过程,主要三大步:获取图片验证码,获取短信验证码,获取附近单车。
2.根据上诉步骤咱们逆向的来看下获取附近单车数据须要那些那些请求数据,主要的请求参数主要须要token、经度、纬度
3.经度和纬度属于位子信息,token 属于认证信息,因此咱们须要看看如何获取token;
4.登陆成功之后须要返回token,可是登陆须要手机号、图片验证码、手机短信验证码来登陆获取token,整个过程分析清楚,分析的时候咱们是逆向分析,可是咱们实现的时候须要正向一步一步,咱们下面来写一下代码实现整个过程。
# -*- coding: utf-8 -*- # @Time : 2017/10/20 16:33 # @Author : Hunk # @Email : qiang.liu@ikooo.cn # @File : getToken.py.py # @Software: import json import requests def get_captcha_code(): """ 获取图片验证码base64位加密数据 :return : captcha,verifyId """ url = 'http://base.api.ofo.com/ofo/Api/v4/getCaptchaCode' # 图片验证码获取地址 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'} CaptchaCode = requests.post(url, headers=headers, verify=False).text return json.loads(CaptchaCode)['values'] def code_picture_convert_string(appCode, query, base64Picture): # appCode 接口的认证key,query 验证码类型 """经过第三方结果获取验证码 :param appCode: 认证ID :param query: 验证码类型 :param base64Picture: base64 加密的地址 """ header = { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', # 根据API的要求,定义相对应的Content-Type "Authorization": "APPCODE " + appCode } url = 'http://jisuyzmsb.market.alicloudapi.com/captcha/recognize' # 调用地址 bodys = {'type': query, 'pic': base64Picture} # 请求参数 resultCode = json.loads(requests.post(url, headers=header, data=bodys).text) return resultCode['result']['code'] def get_verify_code(tel, captcha, verifyId): """ 获取短信验证码 :param tel: 手机号 :param captcha 图片验证码 :param verifyId: 校验ID :return: 返回短信验证码 """ url = 'http://base.api.ofo.com/ofo/Api/v4/getVerifyCode' # 获取短信验证码获取地址 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'} parameter = { "tel": tel, "captcha": captcha, "verifyId": verifyId } VerifyCode = requests.post(url, headers=headers, data=parameter, verify=False).text return json.loads(VerifyCode)['msg'] def get_token(tel, code): """ 获取登陆时返回的token :param tel: 手机号 :param code: 短信验证码 :return: token """ url = 'http://san.ofo.so/ofo/Api/login' # 获取token地址 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'} parameter = {"tel": tel, "code": code} token = requests.post(url, headers=headers, data=parameter, verify=False).text return json.loads(token)["values"]["token"]
根据上述的代码获取到了token(da37bc80-02ed-11e7-a5c5-d3660a2fde97),这里获取验证码的时候须要经过手动的读取验证码,下面咱们来获取下附近单车
# -*- coding: utf-8 -*- # @Time : 2017/10/19 16:09 # @Author : Hunk # @Email : qiang.liu@ikooo.cn # @File : ofoCrawler.py # @Software: PyCharm import json import requests def get_ofo_info(longitude, latitude): url = 'https://san.ofo.so/ofo/Api/nearbyofoCar' 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' } data = { 'token': 'DA37BC80-02ED-11E7-A5C5-D3660A2FDE97', 'lng': str(longitude), # 经度 'lat': str(latitude) # 纬度 } result = requests.post(url, data=data, headers=headers, verify=False).text return json.loads(result)['values']['info']['cars'] if __name__ == '__main__': data = get_ofo_info(116.4360666275, 39.9310311788) print(data)
看看咱们获取到的数据,拿到的数据咱们能够看到每辆单车的编号,目前的位子。
拿到这么多的数据,咱们更但愿利用数据作一些事情,因此下节介绍下对数据的思考,利用数据咱们来分析下单车的运行轨迹。
本教程只提供学习