乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

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

       路人甲Java 2022-02-17

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



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



      點(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í)沒(méi)有更多了”)。
      于此同時(shí),我們使用抓包腳本(可以使用Fiddler的Customize Rules,也可以使用Mitmproxy),捕獲并過(guò)濾URL中含有/user/recommend/的HTTP應(yīng)答數(shù)據(jù),從JSON數(shù)據(jù)中提取系統(tǒng)推薦的用戶信息(如下圖所示)。

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

      抖音App和服務(wù)端交互使用的是HTTPS協(xié)議,使用Fiddler很容易可以捕獲到數(shù)據(jù),如下圖所示。
      
      
      
      不過(guò)想要自己模擬一個(gè)有效的請(qǐng)求可不是那么容易了,因?yàn)樗褂昧撕灻麢C(jī)制,在所有請(qǐng)求中都有as和cp兩個(gè)簽名參數(shù),除非得知簽名算法否則我們無(wú)法構(gòu)造出有效的請(qǐng)求。
      
      這里我們使用模擬操作抖音App的方式,讓App幫我們發(fā)出有效的請(qǐng)求,然后我們攔截服務(wù)器的HTTP應(yīng)答數(shù)據(jù),再?gòu)闹刑崛∥覀兏信d趣的信息。
      
      下面結(jié)合一個(gè)實(shí)際的案例介紹下整個(gè)過(guò)程,根據(jù)客戶的需求,要采集一些指定用戶加關(guān)后的系統(tǒng)推薦“你可能感興趣”的數(shù)據(jù)(如下圖所示)用于商品營(yíng)銷。
      
      
      
      點(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í)沒(méi)有更多了”)。
      
      于此同時(shí),我們使用抓包腳本(可以使用Fiddler的Customize Rules,也可以使用Mitmproxy),捕獲并過(guò)濾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)到搜索頁(yè)面.')  
                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:  
                               # 有沒(méi)有已關(guān)注按鈕  
                               btn = vc.findViewWithText(u'已關(guān)注')  
                               if btn:  
                                    # 先取消關(guān)注  
                                    log(u'之前關(guān)注過(guò),先取消關(guān)注.')  
                                    btn.touch()  
                                    time.sleep(1)  
                               user_matched = matches[0]  
                               log(u'點(diǎn)擊進(jìn)入個(gè)人主頁(yè).')  
                               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í)沒(méi)有更多了'):  
                                                        log(u'暫時(shí)沒(méi)有更多了, "{}"的關(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:  
                                         # 沒(méi)有找到查看更多按鈕  
                                         log(u'沒(méi)有找到查看更多按鈕')  
                               else:  
                                    # 沒(méi)有找到加關(guān)注按鈕  
                                    log(u'沒(méi)有找到加關(guān)注按鈕')  
                          else:  
                               # 沒(méi)有找到匹配的用戶  
                               log(u'沒(méi)有找到匹配的用戶')  
                     else:  
                         # 沒(méi)有找到搜索提交按鈕  
                          log(u'沒(méi)有找到搜索提交按鈕.')  
                else:  
                     # 沒(méi)有找到搜索輸入框  
                     log(u'沒(méi)有找到搜索輸入框.')  
           else:  
                # 沒(méi)有找到搜索按鈕  
                log(u'沒(méi)有找到搜索按鈕.')

      上述腳本的運(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)購(gòu)買等信息,謹(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)論公約

        類似文章 更多