抖音數據採集教程,高級版

上一篇文章講了如何對採集的數據進行抓包和解析,本次主要講解如何使用自動化工具,實現自動化數據採集。若是想了解抓包和解析部分的內容,能夠查閱個人上一篇文章《數據平臺初試(技術篇)——抖音數據採集(初級版)》,文末附有上篇文章的傳送門。本次用到的工具:移動端自動化工具Appium,夜神模擬器(也能夠用真機代替),adb工具。html

運行環境準備工做

開始進入數據採集的準備工做,在上一篇文章的基礎上,搭建自動化環境,首先須要配置android-sdk,安裝教程可參考以下連接,最後須要驗證adb命令是否可用,在命令行窗口運行adb version,出現版本號信息,說明adb工具可用,android sdk下載及安裝教程請參閱以下連接:python

https://www.cnblogs.com/woniu123/p/10755262.html

配置好android-sdk後,就能夠安裝Appium了,下載地址以下,此處咱們選擇appium-desktop-setup-1.9.0.exe版本:android

https://github.com/appium/appium-desktop/releases/download/v1.9.0/appium-desktop-setup-1.9.0.exe

下載好後基本是下一步安裝,安裝完成後啓動應用,出現以下窗口證實安裝成功:
image.png
點擊 「Start Server V 1.9.0」啓動服務,出現以下頁面則證實啓動成功,端口爲4723:

打開以前配置好的模擬器,此時在命令行窗口運行adb devices,會出現鏈接的模擬器設備,證實運行環境準備完成

接下來是運行環境配置,點擊appium的 Start Inspector Session

須要配置以下啓動參數:
image.pnggit

{
    "platformName": "Android",
    "platformVersion": "5.1.1",
    "deviceName": "127.0.0.1:62001",
    "appPackage": "com.ss.android.ugc.aweme",
    "appActivity": "com.ss.android.ugc.aweme.main.MainActivity",
    "noReset": true
}

platformName:模擬器運行的平臺,填入Android
platformVersion:查看模擬器的安卓版本,填入便可
deviceName:此處爲運行adb devices命令獲得的設備,當前模擬器爲127.0.0.1:62001
appPackage和appActivity:抖音app的包名和啓動方法名,可經過android-sdk\build-tools\29.0.2下面的aapt.exe工具得到
配置好後,點擊Star Session,看到模擬器啓動抖音app則證實環境配置無誤。
image.pnggithub

業務場景說明

有了運行環境,接下來介紹下本次的需求,打開模擬器中安裝的抖音app,首先下滑刷新視頻,再進入用戶主頁,分別對主頁數據,關注數據,粉絲數據,做品和喜歡頁籤進行採集。appium須要作的對應操做以下:
1.下滑刷新視頻
2.左滑進入用戶主頁
3.點擊關注按鈕
4.開始下滑關注列表,直到出現「暫時沒有更多了」
5.返回用戶主頁
6.點擊粉絲按鈕
7.開始下滑粉絲列表,直到出現「暫時沒有更多了」
8.返回用戶主頁
9.點擊做品頁籤
10.下滑做品視頻列表,直到出現「暫時沒有更多了」
11.點擊喜歡頁籤
12.下滑喜歡視頻列表,直到出現「暫時沒有更多了」
13.返回視頻頁面,重複步驟1web

代碼準備

安裝python的Appium客戶端:數據庫

pip install Appium-Python-Client

準備擼代碼。
1.啓動appjson

device_name = '127.0.0.1:62001'
device_port = '4723'
desired_caps = {
    "platformName": "Android",
    "platformVersion": "5.1.1",
    "deviceName": device_name,
    "appPackage": "com.ss.android.ugc.aweme",
    "appActivity": "com.ss.android.ugc.aweme.main.MainActivity",
    "noReset": True,
    "unicodeKeyboard": True,
    "resetKeyboard": True
}
device_driver = webdriver.Remote('http://127.0.0.1:' + str(device_port) + '/wd/hub', desired_caps)

等待啓動好了app以後,咱們開始處理業務1,下滑刷新視頻,此處調用本身封裝的滑動方法:app

swipe_page(device_driver, 0.5, 0.25, 0.5, 0.75)
def swipe_page(driver, x1, y1, x2, y2):
    screen = AppiumOprationPage.get_size(driver)
    screen_x1 = int(screen[0] * x1)
    screen_y1 = int(screen[1] * y1)
    screen_x2 = int(screen[0] * x2)
    screen_y2 = int(screen[1] * y2)
    driver.swipe(screen_x1, screen_y1, screen_x2, screen_y2)

等待視頻刷新出來後執行業務2,快速左滑進入用戶主頁:分佈式

flick_page(device_driver, 0.8, 0.5, 0.2, 0.5)

此處flick方法和swipe方法內部是同樣的,appium提供了兩個滑動方法,swipe爲普通滑動,經過給定座標進行滑動,flick爲快速滑動,經過給定座標滑動以後開始作均減速滑動直到中止,滑動速度較快。
進入用戶主頁以後,咱們須要判斷按鈕的id,標籤位置等參數來進行點擊,接下來主要介紹如何獲取【關注】的標籤位置:
使用appium啓動app後,手動滑動進入用戶主頁,此時刷新appium頁面中間的刷新按鈕,點擊左邊的【關注】,此時能夠看到中間列出的xml結構,以及右側的按鈕基本信息,經過這些信息,能夠獲得一個關注按鈕的Xpath:

//android.widget.TextView[@text='關注']

image.png
再對這個按鈕進行點擊便可進入關注頁面,開始循環下滑到底便可:

driver.find_element_by_xpath("//android.widget.TextView[@text='關注']").click()
flick_page(device_driver, 0.5, 0.75, 0.5, 0.25)

完成下滑後,須要用一樣的方法獲取到返回上一層按鈕的xpath:

//android.widget.ImageView[@resource-id='com.ss.android.ugc.aweme:id/nj']

而後點擊返回上一層回到用戶主頁:

driver.find_element_by_xpath("//android.widget.ImageView[@resource-id='com.ss.android.ugc.aweme:id/nj']").click()

image.png
tips:
1.獲取xpath不要使用絕對路徑,通過大量測試,絕對路徑在不一樣環境下是不同的,使用相對路徑則比較穩定
2.可使用一些頁面文字元素,id進行相對定位,再取到最終須要的元素
3.不要使用resource-id進行定位,通過大量測試,這個id不是惟一的,只能定位到第一個
4.也可使用android-sdk\tools下面的uiautomatorviewer工具進行xpath定位,不過須要升級uiautomatorviewer,通過大量測試,對於抖音app的一些高版本,uiautomatorviewer沒法獲取其xpath。
經過一樣的方法,分別點擊【關注】【粉絲】【做品】【喜歡】,便可進行一個完整的操做,在使用上一次講到的mitmproxy進行代理,將全部的數據進行解析入庫,即可將全部的數據採集到本身的數據庫中,或者將視頻下載到本地硬盤。

進階

以上方法,通過大量的測試,天天採集的數據很是有限,問題以下:
1.一臺模擬器,滑動速度有限
2.數據解析效率不高
針對以上兩點問題,後來又加入了新方案,支持了模擬器的橫向擴展(須要電腦硬件條件達標),以及數據的分佈式解析,批量入庫。
新方案完成後,兩天的測試,使用了兩臺模擬器滑動採集,第一天10小時,採集了53萬數據,而次日,作了性能測試,10小時數據量居然達到了111.6萬,在測試過程當中,感受數據解析一直沒有達到飽和,預測能夠拖4臺模擬器,只是個人電腦硬件配置沒那麼高,跑不了4臺模擬器,因此就沒有進行極限測試。
以下爲兩臺模擬器滑動過程截圖,以及天天採集數據量的一個統計圖:
image.png
image.png

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

相關文章
相關標籤/搜索