Python爬取所有人位置資訊——騰訊位置大資料!

爬遍天下無敵手發表於2020-11-13

騰訊位置大資料

網站

https://heat.qq.com/

網站功能介紹

    騰訊位置大資料會將提供所有使用者使用騰訊位置的資料資訊,但沒有使用者資訊(只有位置資訊)。從這個網站我們可以獲取所有使用騰訊位置服務的產品(微信、QQ、騰訊地圖、京東和美團)的人再全球任何地方產生的定位次數,方便大家人口估測、商業分析和科學研究等。

資料分析

PS:如有需要Python學習資料的小夥伴可以加點選下方連結自行獲取

python免費學習資料以及群交流解答點選即可加入

POST請求

    開啟開發者工具,找到POST請求。這裡需要注意的是,網站會每五分鐘POST一次getxingyunPost請求,所以需要等五分鐘才能看到這個post請求。

請求解析

    等到post請求出現時,我們點開詳細資訊,每一次getxingyunPost請求,都是四個。請求資訊種,我們需要關注的是locs這個內容,它是由大量的資料組成中間由英文“,”隔開;
    每連續的三個資料為一組資料,這一組資料包含經度、緯度、人數,按照地理標準規範,經緯度小數點後面保持兩位也就是說,表現形式為xxx.xx的格式,但是如下所示:

3220,11895,2,3075,11535,2,......
1

解析為:
緯度32.20,經度118.95,人數為2
緯度30.75,經度115.35,人數為2

python程式碼

"""
@author: 菜C++雞Java  Jiangzl
@Description: 用來爬取騰訊位置大資料資訊,再次宣告,騰訊位置大資料從沒人說是準確資料,也沒說是完整資料,發paper的話建議三思
"""
import requests
import json
import pandas as pd
import time


def get_TecentData(count=4, rank=0, increNum=0):  # 先預設為從rank從0開始(tecent一次post會post四次)
    url = 'https://xingyun.map.qq.com/api/getXingyunPoints'
    content = ''
    paload = {'count': count, 'rank': rank}
    response = requests.post(url, data=json.dumps(paload))
    datas = response.text
    dictdatas = json.loads(datas)  # dumps是將dict轉化成str格式,loads是將str轉化成dict格式
    locs = dictdatas["locs"]  # 再提取content(這個需要進一步分析提取出經緯度和定位次數)
    locss = locs.split(",")
    temp = []  # 搞一個臨時容器
    for i in range(int(len(locss) / 3)):
        lat = locss[0 + 3 * i]  # 得到緯度
        lon = locss[1 + 3 * i]  # 得到經度
        count = locss[2 + 3 * i]
        #獲得陝西的資料---獲取每個地方的資料,改這裡就行
        #舉個例子--請求的後設資料是整數,北緯10到20度之間
        #就是1000<int(lat)<2000
        if(3142<int(lat)<3935 and 10529<int(lon)<11115):
            temp.append([int(lat) / 100, int(lon) / 100, count])  # 在容器中存放資料:緯度,經度和定位次數
    #資料整理
    result = pd.DataFrame(temp)
    result.dropna()
    result.columns = ['lat', 'lon', 'count']
    result.to_csv('TecentData'+str(increNum)+'.txt', mode='a', index=False)  # model="a",a的意思就是append,可以把得到的資料一直往TecentData.txt中追加

if __name__ == '__main__':
    #如果你想每隔多長時間生成一個檔案,就把下面的註釋釋放掉,就去掉那個#井號,0改成k
    #sleep(number)   number:間隔時間,每隔一分鐘獲取一次資料就是  sleep(60)

    #while (1):
    #for k in range(1000000):
        for i in range(4):
            get_TecentData(4, i, 0)
        #time.sleep(60)

補充

    在解析資料的時候注意執行的時間以及資料的篩選,如果不加篩選,每次請求為10M流量,按一秒一次,一小時一般的磁碟可能就滿了。

 

相關文章