抓取摩拜單車(chē)車(chē)輛位置數(shù)據(jù)
作者: 鄭曉 分類(lèi): Python 發(fā)布于: 2017-07-25 12:10 瀏覽:48,430 評(píng)論(15)
每天從下車(chē)站到公司還有好幾米的路要走,這對(duì)于現(xiàn)在能免費(fèi)騎車(chē)的懶癌患者怎么能忍?車(chē)站人流量大,能找到輛車(chē)實(shí)屬不易,所以就得在下公交車(chē)前不停的刷新app查看下車(chē)點(diǎn)是否有車(chē),有車(chē)就馬上預(yù)訂。
一路上不停的拿著手機(jī)刷新太麻煩了,身為碼農(nóng)怎么能忍?我這里要實(shí)現(xiàn)的就是把刷新查看目的地是否有車(chē)的這個(gè)過(guò)程實(shí)現(xiàn)了自動(dòng)化。
實(shí)現(xiàn)思路是首先找到摩拜單車(chē)在地圖上標(biāo)記車(chē)輛位置的這個(gè)接口,然后想辦法使用程序模擬這個(gè)請(qǐng)求,從獲得的車(chē)輛數(shù)據(jù)中檢查是否有符合的車(chē)輛,如果有則發(fā)送提示消息。
使用的抓包工具是charles,它可以很輕松的獲取到移動(dòng)設(shè)備的數(shù)據(jù)請(qǐng)求,具體使用方法不做介紹,請(qǐng)百度。
開(kāi)始時(shí)是使用charles開(kāi)啟ssl代理,抓取手機(jī)上摩拜單車(chē)app的請(qǐng)求,摩拜的每個(gè)https請(qǐng)求都是unknow(http method是connect),看錯(cuò)誤提示應(yīng)該是證書(shū)的問(wèn)題,但手機(jī)上其它的https請(qǐng)求是正常的(比如京東),網(wǎng)上的說(shuō)法是使用了http隧道通信,代理工具無(wú)法抓取。
app無(wú)法抓包,轉(zhuǎn)戰(zhàn)微信小程序,在摩拜的微信小程序中查看附近車(chē)輛時(shí),charles成功抓取到車(chē)輛位置的api(nearbyBikeInfo.do)
知道了api后就可以很輕松的模擬出請(qǐng)求,這里使用了python+requests進(jìn)行post請(qǐng)求。多次測(cè)試發(fā)現(xiàn)header中有些看似很關(guān)鍵的參數(shù)其實(shí)不必要的,所以這里已經(jīng)移除。
#coding=utf8
#m.yjfs.org.cn
import requests
headers = {
"Host": "mwx.mobike.com",
"time": "1500887680",
"eption": "bb15c",
"open_src": "list",
"platform": "3",
"citycode": "0532",
"User-Agent": "Mozilla/5.0 (iPhone;m.yjfs.org.cn; 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')
注意,代碼有改動(dòng):)
成功返回json數(shù)據(jù)。
格式化后,數(shù)據(jù)很清晰明白,接口返回查詢的坐標(biāo)周?chē)袔纵v車(chē),并包含有每輛車(chē)的編號(hào)、坐標(biāo)和與目標(biāo)坐標(biāo)的相對(duì)距離等信息。
接下來(lái)要做的就是從數(shù)據(jù)里過(guò)濾出比較近的車(chē)輛(distance的單位是米,值可按自己的需求定),并給出提示消息。提示消息推送可以使用pushbullet這類(lèi)工具,實(shí)現(xiàn)也很方便。更復(fù)雜點(diǎn)兒可以距離坐標(biāo)計(jì)算一下每個(gè)車(chē)輛在目標(biāo)位置的哪個(gè)方向。這里就不實(shí)現(xiàn)了~
完。
本文采用知識(shí)共享署名-非商業(yè)性使用 3.0 中國(guó)大陸許可協(xié)議進(jìn)行許可,轉(zhuǎn)載時(shí)請(qǐng)注明出處及相應(yīng)鏈接。
本文永久鏈接: http://m.yjfs.org.cn/crawl-mobike-location.html
厲害了