如何採集抖音的數據,視頻數據採集教程

如何採集抖音的數據,視頻數據採集教程

抖音App和服務端交互使用的是HTTPS協議,使用Fiddler很容易能夠捕獲到數據,以下圖所示。



不過想要本身模擬一個有效的請求可不是那麼容易了,由於它使用了簽名機制,在全部請求中都有as和cp兩個簽名參數,除非得知簽名算法不然咱們沒法構造出有效的請求。
這裏咱們使用模擬操做抖音App的方式,讓App幫咱們發出有效的請求,而後咱們攔截服務器的HTTP應答數據,再從中提取咱們感興趣的信息。
下面結合一個實際的案例介紹下整個過程,根據客戶的需求,要採集一些指定用戶加關後的系統推薦「你可能感興趣」的數據(以下圖所示)用於商品營銷。



點擊「查看更多」能夠看到更多的系統推薦用戶列表數據,以下圖所示。

咱們按以下步驟模擬操做App:
1.啓動抖音。
2.點擊搜索按鈕。
3.輸入搜索關鍵詞(抖音用戶ID),點擊搜索。
4.找到匹配的用戶,點擊關注。
5.點擊系統推薦「查看更多」,模擬屢次向上滑動屏幕,直至數據加載完畢(屏幕出現「暫時沒有更多了」)。
於此同時,咱們使用抓包腳本(能夠使用Fiddler的Customize Rules,也能夠使用Mitmproxy),捕獲並過濾URL中含有/user/recommend/的HTTP應答數據,從JSON數據中提取系統推薦的用戶信息(以下圖所示)。

模擬操做抖音App的腳本核心代碼以下所示:python

抖音App和服務端交互使用的是HTTPS協議,使用Fiddler很容易能夠捕獲到數據,以下圖所示。



不過想要本身模擬一個有效的請求可不是那麼容易了,由於它使用了簽名機制,在全部請求中都有as和cp兩個簽名參數,除非得知簽名算法不然咱們沒法構造出有效的請求。

這裏咱們使用模擬操做抖音App的方式,讓App幫咱們發出有效的請求,而後咱們攔截服務器的HTTP應答數據,再從中提取咱們感興趣的信息。

下面結合一個實際的案例介紹下整個過程,根據客戶的需求,要採集一些指定用戶加關後的系統推薦「你可能感興趣」的數據(以下圖所示)用於商品營銷。



點擊「查看更多」能夠看到更多的系統推薦用戶列表數據,以下圖所示。



咱們按以下步驟模擬操做App:

1.啓動抖音。

2.點擊搜索按鈕。

3.輸入搜索關鍵詞(抖音用戶ID),點擊搜索。

4.找到匹配的用戶,點擊關注。

5.點擊系統推薦「查看更多」,模擬屢次向上滑動屏幕,直至數據加載完畢(屏幕出現「暫時沒有更多了」)。

於此同時,咱們使用抓包腳本(能夠使用Fiddler的Customize Rules,也能夠使用Mitmproxy),捕獲並過濾URL中含有/user/recommend/的HTTP應答數據,從JSON數據中提取系統推薦的用戶信息(以下圖所示)。



模擬操做抖音App的腳本核心代碼以下所示:

view plaincopy to clipboardprint?
from com.dtmilano.android.viewclient import ViewClient  
  
def search_douyin_for_recommend_user(douyin_id):  
     """採集指定抖音帳號的關注推薦數據 
     """  
     log(u'準備採集"{}"對應的關注推薦數據'.format(douyin_id))  
     # 連設備  
     serialno = None  
     if serialno:  
          os.system('adb connect {}'.format(serialno or ''))  
          time.sleep(3)  
                  
     device, serialno = ViewClient.connectToDeviceOrExit(serialno=serialno)  
     vc = ViewClient(device, serialno, autodump=False)  
       
     # 強制關閉抖音  
     log(u'強制關閉抖音.')  
     device.shell('am force-stop com.ss.android.ugc.aweme')  
     time.sleep(2)  
       
     # 啓動抖音  
     log(u'啓動抖音.')  
     device.shell('am start -n com.ss.android.ugc.aweme/.main.MainActivity')  
     time.sleep(5)  
     # 暫停視頻播放  
     log(u'點擊屏幕,暫停視頻播放.')  
     device.touch(514, 1048)  
       
     # 點擊搜索按鈕  
     vc.dump()  
     search_btn = vc.findViewById('com.ss.android.ugc.aweme:id/amj')  
     if search_btn:  
          log(u'點擊搜索按鈕,跳轉到搜索頁面.')  
          search_btn.touch()  
       
          vc.dump()  
          # 點擊搜索輸入框  
          search_input = vc.findViewById('com.ss.android.ugc.aweme:id/ad_')  
          if search_input:  
               log(u'點擊搜索框,準備輸入關鍵詞.')  
               search_input.touch()  
                 
               # 輸入抖音ID  
               log(u'輸入搜索關鍵詞: {}.'.format(douyin_id))  
               device.type(douyin_id.encode('UTF-8'))  
                 
               # 點擊搜索按鈕  
               search_btn = vc.findViewById('com.ss.android.ugc.aweme:id/cp8')  
               if search_btn:  
                    log(u'提交搜索.')  
                    search_btn.touch()  
                    time.sleep(2)  
                    vc.dump()  
                      
                    ## 切換到用戶  
                    #user_tab = vc.findViewWithText(u'用戶')  
                    #user_tab.touch()  
                      
                    # 找到匹配的  
                    matches = []  
                    def find_matches(view):  
                         if view.getClass() == 'android.widget.TextView':  
                              text = view.getText()  
                              if douyin_id.lower() in text.lower():  
                                   # 找到匹配的了  
                                   log(u'找到匹配的: {}'.format(text))  
                                   matches.append(view)  
                              else:  
                                   #print text  
                                   pass  
                    vc.traverse(transform=lambda view: find_matches(view))  
                    if matches:  
                         # 有沒有已關注按鈕  
                         btn = vc.findViewWithText(u'已關注')  
                         if btn:  
                              # 先取消關注  
                              log(u'以前關注過,先取消關注.')  
                              btn.touch()  
                              time.sleep(1)  
                         user_matched = matches[0]  
                         log(u'點擊進入我的主頁.')  
                         user_matched.touch()  
                         time.sleep(1)  
                           
                         # 點關注  
                         vc.dump()  
                         follow_btn = vc.findViewById('com.ss.android.ugc.aweme:id/aei')  
                         if follow_btn:  
                              # 點擊關注  
                              log(u'點擊關注')  
                              follow_btn.touch()  
                              time.sleep(1)  
                              # 點擊查看更多  
                              vc.dump()  
                              viewmore_btn = vc.findViewById('com.ss.android.ugc.aweme:id/bqn')  
                              if viewmore_btn:  
                                   # 點擊查看更多  
                                   log(u'點擊查看更多系統推薦')  
                                   viewmore_btn.touch()  
                                   time.sleep(1)  
                                   i = 0  
                                   while True:  
                                        # 上滑動  
                                        device.drag((345, 1762), (345, 550), duration=100)  
                                        log(u'上滑以加載更多')  
                                        i += 1  
                                        if i % 5 == 0:  
                                             # 拖動10次判斷一下是否還有更多  
                                             vc.dump()  
                                             if vc.findViewWithText(u'暫時沒有更多了'):  
                                                  log(u'暫時沒有更多了, "{}"的關注推薦數據採集完畢.'.format(douyin_id))  
                                                  # 採集成功了  
                                                  return True  
                                             failed_tip = vc.findViewWithText(u'加載失敗,點擊重試')  
                                             if failed_tip:  
                                                  log(u'加載失敗,點擊重試.')  
                                                  failed_tip.touch()  
                              else:  
                                   # 沒有找到查看更多按鈕  
                                   log(u'沒有找到查看更多按鈕')  
                         else:  
                              # 沒有找到加關注按鈕  
                              log(u'沒有找到加關注按鈕')  
                    else:  
                         # 沒有找到匹配的用戶  
                         log(u'沒有找到匹配的用戶')  
               else:  
                   # 沒有找到搜索提交按鈕  
                    log(u'沒有找到搜索提交按鈕.')  
          else:  
               # 沒有找到搜索輸入框  
               log(u'沒有找到搜索輸入框.')  
     else:  
          # 沒有找到搜索按鈕  
          log(u'沒有找到搜索按鈕.')

上述腳本的運行截圖以下所示:

最後附上抓取到的部分示例數據:



android

更多抖音,快手,小紅書數據實時採集接口,請查看文檔: TiToData算法


免責聲明:本文檔僅供學習與參考,請勿用於非法用途!不然一切後果自負。shell

相關文章
相關標籤/搜索