抖音爬蟲教程,從0到1,獲取抖音用戶數據

抖音爬蟲教程,從0到1,獲取抖音用戶數據

前言

由於最終目的是要抓取抖音視頻數據,而經過抓包發現請求抖音的視頻數據都須要對應用戶的sec_id,這個加密的id的生成過程咱們是不知道的,可是咱們能夠從抖音用戶的數據包中看到對應的sec_id,並且這個加密的id不會變的,因此我能夠先爬取用戶的數據,但經過用戶的關注列表以及粉絲列表獲取其餘用戶的sec_id,知道了用戶的數據,咱們就能夠爬取用戶的視頻數據了。這一篇文章我將介紹抖音用戶數據爬取。python


1、分析用戶請求包

若是你已經配置好環境(手機上安裝好了抖音app而且抓包軟件等也都配置好了),就能夠開心食用下文,不然請查看環境配置而後再繼續本文。
android

1. 分析用戶數據

打開抖音,進入抖音發佈者我的頁面:(點擊右方發佈者頭像進入發佈者我的頁面)
image.png
這個時候咱們查看fiddle抓到的包,咱們發現對應的數據的請求地址都是包含「aweme」樣式的url,fiddle右上角就是咱們的請求數據,右下角就是對應的響應數據:
image.png
由於個人爬取思路是根據用戶的關注列表爬取關注列表的關注列表,因此我不太關注用戶自己的數據,我更感興趣的是用戶的關注列表數據以及粉絲數據,那怎麼看用戶的關注列表呢?
image.png
這樣咱們就能夠看到用戶的關注列表了,那麼對應的抓包軟件抓到的包是什麼呢:
image.png
從圖中咱們能夠看到follower就是用戶的粉絲數據,following就是用戶關注的用戶。對應的請求頭和響應數據以下圖所示:
image.png
json

1.1. 請求頭分析

咱們首先分析請求數據:
image.png
請求數據包括對應的url(也就是api),對應的header數據,其中headers裏面有Host、Connection、CookieAccept-EncodingX-SS-QUERIESX-SS-REQ-TICKETX-Tt-Token、sdk-version、User-AgentX-KhronosX-Gorgon、X-Podsapi

  • 咱們首先介紹對應的url
api = "https://api.amemv.com/aweme/v1/user/follower/list/?" \ # url
          "user_id={}" \   # user_id 能夠在用戶關注列表中搞到
          "&max_time={}" \ # 當前時間戳
          "&count=20&offset=0&source_type=1&address_book_access=2&gps_access=2" \ # 不重要
          "&ts={}" \ # 當前時間戳
          "&js_sdk_version=1.16.3.5&app_type=normal&manifest_version_code=630" \ # 不重要
          "&_rticket={}" \ # 當前時間戳
          "&ac=wifi&device_id=47012747444&iid=1846815477740845" \ # 不重要
          "&os_version=8.0.0&channel=wandoujia_aweme1&version_code=630" \ # 不重要
          "&device_type=HUAWEI%20NXT-AL10&language=zh&resolution=1080*1812&openudid=b202a24eb8c1538a" \ # 不重要
          "&update_version_code=6302&app_name=aweme&version_name=6.3.0&os_api=26&device_brand=HUAWEI&ssmix=a" \ # 不重要
          "&device_platform=android&dpi=480&aid=1128" \ # 不重要
          "&sec_user_id={}"\  # 加密的uid 能夠在用戶關注列表中搞到
          ".format(user_id, max_time, ts, _rticket, sec_user_id)

根據上面的api,咱們發現大部分的數據咱們是能夠構造的,只有user_id以及加密的sec_user_id咱們沒法本身構造,可是咱們能夠經過用戶的關注列表中獲取到它關注的全部的用戶的user_id和sec_user_id,因此咱們只須要知道一個用戶的user_id和sec_user_id,咱們就能夠獲取和他關聯的用戶以及和他關聯的用戶的用戶的user_id和sec_user_id。cookie

  • 下面咱們分析對應的請求頭:
Host: api.amemv.com # 對應的host 不變
Connection: keep-alive # 不變,不重要
Cookie: "cookies"  # 重要,不變,你本身的cookie,能夠在fiddle中看到
Accept-Encoding: gzip # 不變
X-SS-REQ-TICKET: 1606999477776 # 當前的時間戳,咱們能夠本身構造
X-Tt-Token:  003ea17385e4...23bbe199e41467-1.0.0 # 你本身的token,重要,不變,能夠在fiddle中看到
sdk-version: 1 # 不變
User-Agent: com.ss.a....0.2991.0) # 重要,你本身的ua,能夠在fiddle中看到
X-Khronos: 1606999477 # 當前時間戳
X-Gorgon: 03006cc00000d7464322a76ab998c12eef987b81af552788dabd # 重要,我後面會講怎麼獲取
X-Pods: # 不重要,能夠不要它

經過分析請求頭,咱們發現大部分數據是不變的,並且咱們均可以經過Fiddle得到,惟一不能得到的或者說會發生改變的是:X-Gorgon,經過反編譯抖音APK,咱們發現它是根據請求的url和cookies和token等生成的。
這裏貼一下對應的請求X-Gorgon的代碼:
假設咱們已經知道了咱們本身的cookies和token以及咱們請求的url那麼咱們能夠獲取到對應的X-Gorgon:app

# 獲取當前時間戳:
ts = str(time.time()).split(".")[0]
_rticket = str(time.time() * 1000).split(".")[0]
max_time = ts
user_id = "96244072243"
sec_user_id = "MS4wLjABAAAAtk0pVzYt82o_R5jUjN4FEpRlautyPFGSgioxrH-jfvg"

# 下面填寫你本身的cookies和token
cookies = "你本身的cookies"
token = "你本身的token"

# 構造請求的url
url= "https://api.amemv.com/aweme/v1/user/follower/list/?" \
          "user_id={}" \
          "&max_time={}" \
          "&count=20&offset=0&source_type=1&address_book_access=2&gps_access=2" \
          "&ts={}" \
          "&js_sdk_version=1.16.3.5&app_type=normal&manifest_version_code=630" \
          "&_rticket={}" \
          "&ac=wifi&device_id=47012747444&iid=1846815477740845" \
          "&os_version=8.0.0&channel=wandoujia_aweme1&version_code=630" \
          "&device_type=HUAWEI%20NXT-AL10&language=zh&resolution=1080*1812&openudid=b202a24eb8c1538a" \
          "&update_version_code=6302&app_name=aweme&version_name=6.3.0&os_api=26&device_brand=HUAWEI&ssmix=a" \
          "&device_platform=android&dpi=480&aid=1128" \
          "&sec_user_id={}".format(user_id, max_time, ts, _rticket, sec_user_id)
# 發起請求獲取X-Gorgon
headers = {
        "dou-url": url,  # 填寫對應的請求的api
        "dou-cookies": cookies,  # 填寫你的cookies
        "dou-token": token,  # 填寫你的token
        "dou-queries": ""  # 填寫你的請求的queries(沒有的話,就填空置:「」)
    }
    res = requests.get("http://8.131.59.252:8080", headers=headers)
    if res.status_code==200:
        res_gorgon = json.loads(res.text)
        if res_gorgon.get("status") == 0:
            gorgon = res_gorgon.get("X-gorgon")
        else:
            print("param error when get gorgon")
            return
    else:
        print("request error when get gorgon")
        return
    print("gorgon: " + gorgon)  # 這就是你的gorgon了
  • 經過獲取的X-Gorgon發起請求獲取響應數據,即用戶的關注列表:
# 從新構造請求頭:
headers = {
        "Host": "api.amemv.com",
        "Connection": "keep-alive",
        "Cookie": cookies, # 你本身的Cookies
        "Accept-Encoding": "gzip",
        "X-SS-REQ-TICKET": _rticket, # 當前時間戳,上面的代碼片已經生成了
        "X-Tt-Token": "0095a45e5cc.....c42c97e37d7350",  # 你本身的token
        "sdk-version": "1",
        "User-Agent": "你本身的user-agent", 
        "X-Khronos": ts, # 當前時間戳,上面的代碼片已經生成了
        "X-Gorgon": gorgon # X-gorgon,上面的代碼片已經生成了
    }

# 發起請求
result = doGetGzip(url, headers) # 這是我本身寫的函數,在下面的代碼片中
print(result)
  • doGetGzip 函數
def doGetGzip(url, headers):

    req = request.Request(url)

    for key in headers:
        req.add_header(key, headers[key])
    with request.urlopen(req) as f:
        data = f.read()
        return gzip.decompress(data).decode()

2. 分析響應數據獲取用戶數據

2.1. 響應數據格式:

響應的數據的格式是json的,因此通常咱們都將響應的數據轉換成json進行處理,經過fiddle抓包咱們能夠看到響應數據主要包括下面幾個部分,而關注的用戶的信息都在「followers」裏面。其餘的字段主要用於翻頁,由於一次請求只返回20條數據,響應數據的其餘字段:has_more 表示的是是否是有更的數據,max_time就是下一頁數據的遊標,咱們主要關注follower裏的數據。
image.png
下面咱們能夠看到followers裏面有20條數據,每一條數據裏面就是一個用戶的信息
image.png
下面就是具體的每個用戶的字段:
image.png
用戶字段有不少,大多數對我來講都沒有用,我只關注user_id 和 對應的 sec_uid,固然若是能夠看本身的需求獲取更多的數據,從上圖咱們發現咱們能夠獲取到,所以個人目的就達到了,這樣我就能夠把它們存下來,下面再經過它倆請求這個用戶關注的用戶的這兩個信息,下一篇文章我將主要介紹一下如何爬取視頻信息。
image.png
以上就是獲取抖音用戶的所有內容了,後面我會具體講解怎麼抓取視頻數據等,碼字不易,還請點贊關注,有任何問題請留言。
函數

——————————————————————————————————————————ui

TiToData:專業的短視頻、直播數據接口服務平臺。
更多信息請聯繫: TiToData

覆蓋主流平臺:抖音,快手,小紅書,TikTok,YouTube加密

相關文章
相關標籤/搜索