日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

如何采集抖音的數(shù)據(jù),視頻數(shù)據(jù)采集教程

 路人甲Java 2022-02-17

抖音App和服務(wù)端交互使用的是HTTPS協(xié)議,使用Fiddler很容易可以捕獲到數(shù)據(jù),如下圖所示。



不過想要自己模擬一個(gè)有效的請(qǐng)求可不是那么容易了,因?yàn)樗褂昧撕灻麢C(jī)制,在所有請(qǐng)求中都有as和cp兩個(gè)簽名參數(shù),除非得知簽名算法否則我們無法構(gòu)造出有效的請(qǐng)求。
這里我們使用模擬操作抖音App的方式,讓App幫我們發(fā)出有效的請(qǐng)求,然后我們攔截服務(wù)器的HTTP應(yīng)答數(shù)據(jù),再從中提取我們感興趣的信息。
下面結(jié)合一個(gè)實(shí)際的案例介紹下整個(gè)過程,根據(jù)客戶的需求,要采集一些指定用戶加關(guān)后的系統(tǒng)推薦“你可能感興趣”的數(shù)據(jù)(如下圖所示)用于商品營銷。



點(diǎn)擊“查看更多”可以看到更多的系統(tǒng)推薦用戶列表數(shù)據(jù),如下圖所示。

我們按如下步驟模擬操作App:
1.啟動(dòng)抖音。
2.點(diǎn)擊搜索按鈕。
3.輸入搜索關(guān)鍵詞(抖音用戶ID),點(diǎn)擊搜索。
4.找到匹配的用戶,點(diǎn)擊關(guān)注。
5.點(diǎn)擊系統(tǒng)推薦“查看更多”,模擬多次向上滑動(dòng)屏幕,直至數(shù)據(jù)加載完畢(屏幕出現(xiàn)“暫時(shí)沒有更多了”)。
于此同時(shí),我們使用抓包腳本(可以使用Fiddler的Customize Rules,也可以使用Mitmproxy),捕獲并過濾URL中含有/user/recommend/的HTTP應(yīng)答數(shù)據(jù),從JSON數(shù)據(jù)中提取系統(tǒng)推薦的用戶信息(如下圖所示)。

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

抖音App和服務(wù)端交互使用的是HTTPS協(xié)議,使用Fiddler很容易可以捕獲到數(shù)據(jù),如下圖所示。



不過想要自己模擬一個(gè)有效的請(qǐng)求可不是那么容易了,因?yàn)樗褂昧撕灻麢C(jī)制,在所有請(qǐng)求中都有as和cp兩個(gè)簽名參數(shù),除非得知簽名算法否則我們無法構(gòu)造出有效的請(qǐng)求。

這里我們使用模擬操作抖音App的方式,讓App幫我們發(fā)出有效的請(qǐng)求,然后我們攔截服務(wù)器的HTTP應(yīng)答數(shù)據(jù),再從中提取我們感興趣的信息。

下面結(jié)合一個(gè)實(shí)際的案例介紹下整個(gè)過程,根據(jù)客戶的需求,要采集一些指定用戶加關(guān)后的系統(tǒng)推薦“你可能感興趣”的數(shù)據(jù)(如下圖所示)用于商品營銷。



點(diǎn)擊“查看更多”可以看到更多的系統(tǒng)推薦用戶列表數(shù)據(jù),如下圖所示。



我們按如下步驟模擬操作App:

1.啟動(dòng)抖音。

2.點(diǎn)擊搜索按鈕。

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

4.找到匹配的用戶,點(diǎn)擊關(guān)注。

5.點(diǎn)擊系統(tǒng)推薦“查看更多”,模擬多次向上滑動(dòng)屏幕,直至數(shù)據(jù)加載完畢(屏幕出現(xiàn)“暫時(shí)沒有更多了”)。

于此同時(shí),我們使用抓包腳本(可以使用Fiddler的Customize Rules,也可以使用Mitmproxy),捕獲并過濾URL中含有/user/recommend/的HTTP應(yīng)答數(shù)據(jù),從JSON數(shù)據(jù)中提取系統(tǒng)推薦的用戶信息(如下圖所示)。



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

view plaincopy to clipboardprint?
from com.dtmilano.android.viewclient import ViewClient  
  
def search_douyin_for_recommend_user(douyin_id):  
     """采集指定抖音賬號(hào)的關(guān)注推薦數(shù)據(jù) 
     """  
     log(u'準(zhǔn)備采集"{}"對(duì)應(yīng)的關(guān)注推薦數(shù)據(jù)'.format(douyin_id))  
     # 連設(shè)備  
     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)  
       
     # 強(qiáng)制關(guān)閉抖音  
     log(u'強(qiáng)制關(guān)閉抖音.')  
     device.shell('am force-stop com.ss.android.ugc.aweme')  
     time.sleep(2)  
       
     # 啟動(dòng)抖音  
     log(u'啟動(dòng)抖音.')  
     device.shell('am start -n com.ss.android.ugc.aweme/.main.MainActivity')  
     time.sleep(5)  
     # 暫停視頻播放  
     log(u'點(diǎn)擊屏幕,暫停視頻播放.')  
     device.touch(514, 1048)  
       
     # 點(diǎn)擊搜索按鈕  
     vc.dump()  
     search_btn = vc.findViewById('com.ss.android.ugc.aweme:id/amj')  
     if search_btn:  
          log(u'點(diǎn)擊搜索按鈕,跳轉(zhuǎn)到搜索頁面.')  
          search_btn.touch()  
       
          vc.dump()  
          # 點(diǎn)擊搜索輸入框  
          search_input = vc.findViewById('com.ss.android.ugc.aweme:id/ad_')  
          if search_input:  
               log(u'點(diǎn)擊搜索框,準(zhǔn)備輸入關(guān)鍵詞.')  
               search_input.touch()  
                 
               # 輸入抖音ID  
               log(u'輸入搜索關(guān)鍵詞: {}.'.format(douyin_id))  
               device.type(douyin_id.encode('UTF-8'))  
                 
               # 點(diǎn)擊搜索按鈕  
               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:  
                         # 有沒有已關(guān)注按鈕  
                         btn = vc.findViewWithText(u'已關(guān)注')  
                         if btn:  
                              # 先取消關(guān)注  
                              log(u'之前關(guān)注過,先取消關(guān)注.')  
                              btn.touch()  
                              time.sleep(1)  
                         user_matched = matches[0]  
                         log(u'點(diǎn)擊進(jìn)入個(gè)人主頁.')  
                         user_matched.touch()  
                         time.sleep(1)  
                           
                         # 點(diǎn)關(guān)注  
                         vc.dump()  
                         follow_btn = vc.findViewById('com.ss.android.ugc.aweme:id/aei')  
                         if follow_btn:  
                              # 點(diǎn)擊關(guān)注  
                              log(u'點(diǎn)擊關(guān)注')  
                              follow_btn.touch()  
                              time.sleep(1)  
                              # 點(diǎn)擊查看更多  
                              vc.dump()  
                              viewmore_btn = vc.findViewById('com.ss.android.ugc.aweme:id/bqn')  
                              if viewmore_btn:  
                                   # 點(diǎn)擊查看更多  
                                   log(u'點(diǎn)擊查看更多系統(tǒng)推薦')  
                                   viewmore_btn.touch()  
                                   time.sleep(1)  
                                   i = 0  
                                   while True:  
                                        # 上滑動(dòng)  
                                        device.drag((345, 1762), (345, 550), duration=100)  
                                        log(u'上滑以加載更多')  
                                        i += 1  
                                        if i % 5 == 0:  
                                             # 拖動(dòng)10次判斷一下是否還有更多  
                                             vc.dump()  
                                             if vc.findViewWithText(u'暫時(shí)沒有更多了'):  
                                                  log(u'暫時(shí)沒有更多了, "{}"的關(guān)注推薦數(shù)據(jù)采集完畢.'.format(douyin_id))  
                                                  # 采集成功了  
                                                  return True  
                                             failed_tip = vc.findViewWithText(u'加載失敗,點(diǎn)擊重試')  
                                             if failed_tip:  
                                                  log(u'加載失敗,點(diǎn)擊重試.')  
                                                  failed_tip.touch()  
                              else:  
                                   # 沒有找到查看更多按鈕  
                                   log(u'沒有找到查看更多按鈕')  
                         else:  
                              # 沒有找到加關(guān)注按鈕  
                              log(u'沒有找到加關(guān)注按鈕')  
                    else:  
                         # 沒有找到匹配的用戶  
                         log(u'沒有找到匹配的用戶')  
               else:  
                   # 沒有找到搜索提交按鈕  
                    log(u'沒有找到搜索提交按鈕.')  
          else:  
               # 沒有找到搜索輸入框  
               log(u'沒有找到搜索輸入框.')  
     else:  
          # 沒有找到搜索按鈕  
          log(u'沒有找到搜索按鈕.')

上述腳本的運(yùn)行截圖如下所示:

最后附上抓取到的部分示例數(shù)據(jù):



更多抖音,快手,小紅書數(shù)據(jù)實(shí)時(shí)采集接口,請(qǐng)查看文檔: TiToData


免責(zé)聲明:本文檔僅供學(xué)習(xí)與參考,請(qǐng)勿用于非法用途!否則一切后果自負(fù)。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多