前段時間看到不少微信公衆號在轉發一篇爬取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)
看看咱們獲取到的數據,拿到的數據咱們能夠看到每輛單車的編號,目前的位子。
拿到這麼多的數據,咱們更但願利用數據作一些事情,因此下節介紹下對數據的思考,利用數據咱們來分析下單車的運行軌跡。
本教程只提供學習