一.看看张江的地图
张江地图呈现梯形,并且多出一块正方向
二.安装小鸣单车APP,后fiddler抓包
小鸣单车APP抓包可以看到每次定位是截取接口https://api.mingbikes.com/common/terminal/get_near_bike,可以看到POST参数是经纬度,返回的信息都是单车的型号,SN编码,还有经纬度
{u'status': u'1', u'msg': u'\u6210\u529f', u'data': {u'bikes': [{u'latitude': u'31.181001', u'longitude': u'121.58025', u'bike_sn': u'1000017899', u'bike_id': u'4356'}, {u'latitude': u'31.180607', u'longitude': u'121.582111', u'bike_sn': u'2101200620', u'bike_id': u'316873'}, {u'latitude': u'31.18311947611552', u'longitude': u'121.5814279784648', u'bike_sn': u'2103102333', u'bike_id': u'395654'}, {u'latitude': u'31.18129', u'longitude': u'121.57381', u'bike_sn': u'2100847510', u'bike_id': u'302410'}, {u'latitude': u'31.181763', u'longitude': u'121.572805', u'bike_sn': u'2100848768', u'bike_id': u'298921'}, {u'latitude': u'31.181298', u'longitude': u'121.572423', u'bike_sn': u'2000109691', u'bike_id': u'15008'}, {u'latitude': u'31.183074', u'longitude': u'121.573072', u'bike_sn': u'2102803146', u'bike_id': u'387096'}, {u'latitude': u'31.181262', u'longitude': u'121.572167', u'bike_sn': u'2101302440', u'bike_id': u'316990'}, {u'latitude': u'31.18092', u'longitude': u'121.571743', u'bike_sn': u'1000018622', u'bike_id': u'4543'}, {u'latitude': u'31.178679', u'longitude': u'121.571319', u'bike_sn': u'2000110073', u'bike_id': u'15442'}, {u'latitude': u'31.178668', u'longitude': u'121.571289', u'bike_sn': u'2000110042', u'bike_id': u'15443'}, {u'latitude': u'31.178771', u'longitude': u'121.571087', u'bike_sn': u'2100845764', u'bike_id': u'302012'}, {u'latitude': u'31.181516', u'longitude': u'121.588913', u'bike_sn': u'2101023631', u'bike_id': u'312436'}, {u'latitude': u'31.178679', u'longitude': u'121.57103', u'bike_sn': u'2103104452', u'bike_id': u'403499'}, {u'latitude': u'31.18739', u'longitude': u'121.577086', u'bike_sn': u'2100842181', u'bike_id': u'276222'}, {u'latitude': u'31.18580017558126', u'longitude': u'121.5861086522036', u'bike_sn': u'2100846928', u'bike_id': u'300669'}, {u'latitude': u'31.18750520815055', u'longitude': u'121.5825172378984', u'bike_sn': u'2101803230', u'bike_id': u'346825'}, {u'latitude': u'31.187837', u'longitude': u'121.579605', u'bike_sn': u'2100846788', u'bike_id': u'307137'}, {u'latitude': u'31.17906567085478', u'longitude': u'121.5708964258898', u'bike_sn': u'2103102811', u'bike_id':
三.分析
1.看定位区间
以固定经纬度(121.6391396448037,31.202418271030086)参数看分布图,maplib画散点图
获取每次定位的最大经纬度间距分别为0.0136566861456,0.010266
百度一下——中国区域地图纬度相差1度大概实际距离是111公里,经度相差1度大概是85.39公里
计算出的app定位间距是1km,0.85km,和实际APP定位区间相比是符合的,说明理论是正确的
此时策略,类型梯形图,x轴每隔0.01取点,y轴每隔0.085取点,目标能让点遍历张江地图
抓取数据自动去重存到数据库,
2.定位梯形的四角经纬度,初步实现简单的计算,(多出的小正方型)暂时忽略
mongodb默认_id为主键,把单车SN变成_id用于自动去重
#coding=utf-8 import requests,json import pymongo,re,time from numpy import arange #小鸣单车 def run(x,y,table): url='https://api.mingbikes.com/common/terminal/get_near_bike' headers={'Accept-Encoding': 'gzip', 'User-Agent': 'Android/4.4.2 (HUAWEI/hwPE), com.xiaoming.bike/1.4.0', 'Connection': 'Keep-Alive', 'Host': 'api.mingbikes.com', 'Device-UUID': 'ede5aa89-9a8b-4637-8b91-23359ebdab1e', 'Channel': '1007', 'Content-Type': 'application/x-www-form-urlencoded', 'Content-Length': '45'} data={'lat':x,'lng':y} rq=requests.post(url=url,headers=headers,data=data,timeout=10) js=json.loads(rq.text) if js['msg']==u'成功': print 'Ok' for i in js['data']['bikes']: i['_id']=i['bike_sn'] del i['bike_sn'] table.save(i) cn=pymongo.MongoClient('127.0.0.1',27017) db=cn.ofo table=db.ofotable for i in arange(121.58,121.64,0.01): for j in arange(31.18,31.23,0.0085): run(j,i,table) time.sleep(2)3.查看数据库
利用百度key的接口获取经纬度的对应地址位置
http://api.map.baidu.com/geocoder/v2/?output=json&ak=申请的百度key&location=纬度,经度
误差点:1.取点问题如何科学计数,2.百度的api定位是有偏差的,
4.结论
数据库大概得出结论,张江大概有1500辆小鸣单车
5.思考
1.已经得到了一堆附近的单车SN,可不可以通过接口直接post SN来占用附近的单车验证码,或者是所有单车的验证码。
2.利用这种方法同样可以获取上海的投放量
3.可不可以利用单车SN的经纬度数据是否变动,判断车的位置变动,来判断某一地区一天的收益情况。(张江1500量单车的数据,不到2min获取完)
4.接口太简单,没加密不安全。mobai,ofo都是有加密字段。