目的: 爬取抖音小视频
工具: mitmproxy、Appium
思路:
1. 通过 mitmproxy 截取请求, 找出 response 为 video 的请求.
2. 通过 mitmdump 对接 python 对上述请求进行处理.
3. 配合 Appium 实现自动抓取视频.
方法:
1. 设置 mitmprxoy 为手机的代理, 并且启动 mitmproxy.
2. 打开抖音, 并滑动页面.
3. 观察 mitmproxy 的页面. 通过不停的滑动, 返回类型为 video 都是如下类型的请求.
所以猜测储存视频的服务器都是如下类型(不一定全正确, 但是至少有正确的).
web_list = ['v3-dy.ixigua.com', 'v3-dy-x.ixigua.com', 'v3-dy-y.ixigua.com', 'v3-dy-z.ixigua.com',
'v6-dy.ixigua.com', 'v6-dy-x.ixigua.com', 'v6-dy-y.ixigua.com', 'v6-dy-z.ixigua.com',
'v9-dy.ixigua.com', 'v9-dy-x.ixigua.com', 'v9-dy-y.ixigua.com', 'v9-dy-z.ixigua.com']
4. 编写处理截获数据的处理脚本, 如下:
1 from urllib.request import urlretrieve
2 # 视频编号
3 num = 1
4 # 用于视频去重
5 duplicate = set()
6
7
8 def request(flow):
9 # 本次请求的url
10 video_url = flow.request.url
11 global num
12 url_list = ['v3-dy.ixigua.com', 'v3-dy-x.ixigua.com', 'v3-dy-y.ixigua.com', 'v3-dy-z.ixigua.com',
13 'v6-dy.ixigua.com', 'v6-dy-x.ixigua.com', 'v6-dy-y.ixigua.com', 'v6-dy-z.ixigua.com',
14 'v9-dy.ixigua.com', 'v9-dy-x.ixigua.com', 'v9-dy-y.ixigua.com', 'v9-dy-z.ixigua.com']
15 # 视频保存路径
16 path = '/home/ysl/视频/'
17 # 判断是否重复, 不重复才继续执行
18 if video_url not in duplicate:
19 duplicate.add(video_url)
20 for url in url_list:
21 if url in flow.request.url:
22 filename = path + str(num) + '.mp4'
23 # 下载视频, 保存到本地
24 urlretrieve(flow.request.url, filename)
25 print(filename + '下载完成')
26 num += 1
27 # 这里是猜测不同服务器里可能存有相同的视频, 所以一旦下载到视频就退出循环.
28 return
现在手动滑动视频的话就已经会逐个下载了, 但是手动的毕竟麻烦, 所以搭配 Appium 实现自动化.
5. 将手机通过数据线和运行 Appium 的电脑相连, 打开手机的 USB 调试功能. 首先需要确定启动抖音的 Desired Capabilities 参数, platformName、deviceName、appPackage、appActivity, 具体的获取方法可以百度一下, 对于我手机上的抖音而言, 参数如下:
这里我还设置了一下 noReset 为 true, 不然的话, 好像每一次手机都会重新安装抖音. 下面是 Appium 驱动手机的代码:
1 from appium import webdriver
2 from appium.webdriver.common.touch_action import TouchAction
3 import time
4
5
6 # Appium服务器
7 server = 'http://localhost:4723/wd/hub'
8 # 参数
9 desired_caps = {
10 "appActivity": ".main.MainActivity",
11 "appPackage": "com.ss.android.ugc.aweme",
12 "deviceName": "SM_G9500",
13 "platformName": "Android",
14 "noReset": True
15 }
16 # 类似于selenium
17 driver = webdriver.Remote(server, desired_caps)
18 # 等待app启动
19 time.sleep(10)
20 # 设置时限, 如果想一直爬可以使用while True.
21 for i in range(20):
22 # TouchAction(driver).press(x=607, y=1976).move_to(x=613, y=982).release().perform()
23 time.sleep(2)
24 driver.swipe(607, 1976, 613, 800, 500)
确保 Appium 服务已经启动.
6. 命令行中执行 mitmdump -s 脚本名, 然后运行 Appium 代码.
结果: Appium 驱动手机滑动页面, 抖音小视频被下载至指定路径.