1. 程式人生 > >爬取ofo共享單車信息

爬取ofo共享單車信息

tco tty -s 返回 es2017 ram mac os x common market

  前段時間看到很多微信公眾號在轉發一篇爬取mobike單車的信息,也不知道什麽原因,在網上搜索了下很少有人在爬取ofo共享單車的數據,所以決定看看可以爬取ofo共享單車的那些數據。

  抓取數據開始的時候,分析了下可以通過幾個渠道看到ofo共享單車的數據,主要是通過ofo公眾號,ofo APP、ofo微信小程序 三個渠道可以獲取數據,一般情況下手機配置代理以後,APP會出現無法聯網的情況,導致無法獲取數據;由於之前微信公眾號可以在瀏覽器打開,抓取過程比較的容易,所以我比較傾向通過微信公眾號進入獲取共享單車數據;

 在整個爬取的過程中使用到比較關鍵的工具fiddler,輔助我們來抓取一些接口地址,這裏我共享下ofo網頁登陸的入口地址,大家可以通過這個地址登陸ofo來抓取附近單車信息,登陸地址:https://common.ofo.so/newdist/?Login&~next=%22%22。從登陸到開始到獲取附近的單車,分析了一下對我們比較有用的幾個接口:

  1.登陸接口,獲取token信息

    https://san.ofo.so/ofo/Api/login

  2.獲取圖片驗證碼接口

    https://base.api.ofo.com/ofo/Api/v4/getCaptchaCode

  3.獲取短信驗證碼接口

    https://base.api.ofo.com/ofo/Api/v4/getVerifyCode

  4.獲取附近單車的接口

    https://san.ofo.so/ofo/Api/nearbyofoCar

一、探索單車接口,獲取單車數據

  1.首先我們來模擬下實際的操作過程,主要三大步:獲取圖片驗證碼,獲取短信驗證碼,獲取附近單車。

  技術分享技術分享技術分享

  2.根據上訴步驟我們逆向的來看下獲取附近單車數據需要那些那些請求數據,主要的請求參數主要需要token、經度、緯度

技術分享

  3.經度和緯度屬於位子信息,token 屬於認證信息,所以我們需要看看如何獲取token;

  4.登錄成功以後需要返回token,但是登錄需要手機號、圖片驗證碼、手機短信驗證碼來登錄獲取token,整個過程分析清楚,分析的時候我們是逆向分析,但是我們實現的時候需要正向一步一步,我們下面來寫一下代碼實現整個過程。

  

# -*- coding: utf-8 -*-
# @Time    : 2017/10/20 16:33
# @Author  : Hunk
# @Email : [email protected] # @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   : [email protected]
# @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)

看看我們獲取到的數據,拿到的數據我們可以看到每輛單車的編號,目前的位子。

技術分享

拿到這麽多的數據,我們更希望利用數據做一些事情,所以下節介紹下對數據的思考,利用數據我們來分析下單車的運行軌跡。

爬取ofo共享單車信息