共计 3673 个字符,预计需要花费 10 分钟才能阅读完成。
上一篇文章讲了如何对采集的数据进行抓包和解析,本次次要解说如何应用自动化工具,实现自动化数据采集。如果想理解抓包和解析局部的内容,能够查阅我的上一篇文章《数据平台初试(技术篇)——抖音数据采集(高级版)》,文末附有上篇文章的传送门。本次用到的工具:挪动端自动化工具 Appium,夜神模拟器(也能够用真机代替),adb 工具。
运行环境筹备工作
开始进入数据采集的筹备工作,在上一篇文章的根底上,搭建自动化环境,首先须要配置 android-sdk,装置教程可参考如下链接,最初须要验证 adb 命令是否可用,在命令行窗口运行 adb version,呈现版本号信息,阐明 adb 工具可用,android sdk 下载及装置教程请参阅如下链接:
https://www.cnblogs.com/woniu123/p/10755262.html
配置好 android-sdk 后,就能够装置 Appium 了,下载地址如下,此处咱们抉择 appium-desktop-setup-1.9.0.exe 版本:
https://github.com/appium/appium-desktop/releases/download/v1.9.0/appium-desktop-setup-1.9.0.exe
下载好后根本是下一步装置,装置实现后启动利用,呈现如下窗口证实装置胜利:
点击“Start Server V 1.9.0”启动服务,呈现如下页面则证实启动胜利,端口为 4723:
关上之前配置好的模拟器,此时在命令行窗口运行 adb devices,会呈现连贯的模拟器设施,证实运行环境筹备实现
接下来是运行环境配置,点击 appium 的 Start Inspector Session
须要配置如下启动参数:
{
"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 则证实环境配置无误。
业务场景阐明
有了运行环境,接下来介绍下本次的需要,关上模拟器中装置的抖音 app,首先下滑刷新视频,再进入用户主页,别离对主页数据,关注数据,粉丝数据,作品和喜爱页签进行采集。appium 须要做的对应操作如下:
1. 下滑刷新视频
2. 左滑进入用户主页
3. 点击关注按钮
4. 开始下滑关注列表,直到呈现“临时没有更多了”
5. 返回用户主页
6. 点击粉丝按钮
7. 开始下滑粉丝列表,直到呈现“临时没有更多了”
8. 返回用户主页
9. 点击作品页签
10. 下滑作品视频列表,直到呈现“临时没有更多了”
11. 点击喜爱页签
12. 下滑喜爱视频列表,直到呈现“临时没有更多了”
13. 返回视频页面,反复步骤 1
代码筹备
装置 python 的 Appium 客户端:
pip install Appium-Python-Client
筹备撸代码。
1. 启动 app
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,下滑刷新视频,此处调用本人封装的滑动办法:
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='关注']
再对这个按钮进行点击即可进入关注页面,开始循环下滑到底即可:
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()
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 台模拟器,所以就没有进行极限测试。
如下为两台模拟器滑动过程截图,以及每天采集数据量的一个统计图:
更多抖音,快手,小红书数据实时采集接口,请查看文档:TiToData