目的: 爬取抖音小視頻
工具: 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 驅動手機滑動頁面, 抖音小視頻被下載至指定路徑.