Python爬虫-抖音小视频-mitmproxy与Appium

目的:  爬取抖音小视频

工具:  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 驱动手机滑动页面, 抖音小视频被下载至指定路径.

原文地址:https://www.cnblogs.com/yangshaolun/p/10896366.html