抖音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