「平常研究」之 respage02:採集共享單車數據

初衷

距離 respage01 已經有一個月左右沒有作平常研究了,期間也有了些迷茫,迷茫平常研究的價值到底在哪裏,以及業餘時間的捉襟見肘。可是迷茫歸迷茫,或者越是迷茫更是要去設法瞭解世界。respage02 的目標是爲了研究小區域人流情況。 小區域的人流情況是我一直想獲取的一個信息,這裏的「情況」是咱們所能獲取的最大信息,因爲人們出行方式愈來愈多樣化,除了政府在路口安裝監控之外,我以爲已經很難完整表示人流量了。咱們能夠作的只能是經過某種或某些出行途徑來片面地反映這種「情況」。python

腦洞

本身關於片面掌握人流情況的腦洞有這麼幾個:git

  • 採集共享單車分佈數據,反映小區域內的人流轉移狀況。
  • 採集網約車的實時分佈數據,反映城市內的人流和交通情況。
  • 經過高清攝像頭採集某街道特定角度的視頻,經過識別運動數據,反映單點人流狀況。
  • 經過 wifi 嗅探器主動採集移動設備數據。

腦洞的意義就是讓你們有時間能夠去研究一下,我只是選擇了最方便的共享單車數據,緣由在於共享單車移動速度慢,在對爬取速度沒追求的狀況下,也能夠有但願得到研究結果。github

獲取數據的接口

關於獲取共享單車(摩拜)數據的文章已經有不少,主要思路仍是經過研究單車微信小程序的 api,只要簡單抓包就能夠找到規律,以下接口就能夠獲取某一位置周邊的單車信息,這個和獲取百度地圖 POI 數據相似,儘可能增長採集點,能夠獲取儘可能完整的數據,由於根據觀察,附近單車接口獲取到數量是作了限制的:小程序

URL = "https://mwx.mobike.com/nearby/nearbyBikeInfo?biketype=0" + \
      "&latitude=" + lat + \
      "&longitude=" + lng + \
      "&userid=" + userId + \
      "&citycode=0579"
複製代碼

採集窗口

仍是採用與獲取 POI 數據同樣的矩形窗口掃描的方式,爲了稍微加快些速度,我簡單地增長了一個進程來同時採集,爲了下降封號風險,我也準備了兩個 userid,同時也準備了兩個掃描區域。(進階採集,多進程或者協程+代理的方式來更快更全的採集,可是我目前不須要)微信小程序

## 江南兩個矩形區域
BigRect1 = {
    'left': {
        'x': 119.634998,
        'y': 29.046372
    },
    'right': {
        'x': 119.6727628,
        'y': 29.077628
    }
}

BigRect2 = {
    'left': {
        'x': 119.628268,
        'y': 29.072232
    },
    'right': {
        'x': 119.67208,
        'y': 29.098397
    }
}

複製代碼

完成採集代碼

完整代碼仍是見 GitHub - roubo/roubospiker: 一些解決生活問題的小爬蟲 實現一個 work 方法,並開啓兩個採集進程:(注意日誌文件要分開建立,以避免併發寫花)api

def worker(bigrect, userId, FileKey):
    today = time.strftime("%Y_%m_%d_%H")
    for count in range(0, 10):
        logfile = open("./log/" + FileKey + "-" + str(count) + '_' + today + ".log", 'a+', encoding='utf-8')
        file = open("./result/" + FileKey + "-" + str(count) + '_' + today + ".txt", 'a+', encoding='utf-8')
        for index in range(int(WindowSize['xNum'] * WindowSize['yNum'])):
            lng, lat = getSmallRect(bigrect, WindowSize, index)
            requestMBikeApi(lat=lat, lng=lng, index=index, file=file, logfile=logfile, userId=userId)
        time.sleep(1200)

def main():
    userIds = tool.getMBikeUserID()
    p1 = multiprocessing.Process(target=worker, name='p1', args=(BigRect1, userIds[0], 'shareBike01'))
    p2 = multiprocessing.Process(target=worker, name='p2', args=(BigRect2, userIds[1], 'shareBike02'))
    p1.start()
    p2.start()
複製代碼

先結束了

實現採集 + 存儲 + 展現的過程放到下一稿咯。微信

相關文章
相關標籤/搜索