抖音数据采集教程,高级版

上一篇文章讲了如何对采集的数据进行抓包和解析,本次主要讲解如何使用自动化工具,实现自动化数据采集。若是想了解抓包和解析部分的内容,能够查阅个人上一篇文章《数据平台初试(技术篇)——抖音数据采集(初级版)》,文末附有上篇文章的传送门。本次用到的工具:移动端自动化工具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

相关文章
相关标签/搜索