所用到的模塊和庫 : python3+reqeuests+Airtest+fiddler
Airtest : (app自動化軟,類似Appium,網易家的本人很喜歡)
1.首先環境的配置 Fiddler 和Airtest
fiddler可以設定抓取包的鏈接,並自動保存到設定的txt文件中
#在配置好手機證書,以及可以抓到手機包的情況下,再看下面步驟----配置fiddler環境:https://jingyan.baidu.com/article/1876c8524581d9890b1376a5.html
手機抓包證書教程:https://www.jianshu.com/p/724097741bdf
弄好之后,打開抖音,可以看到一堆抖音的包的話,就說明可以了,
接着來下面操作,設置抓包規則並自動保存 由於截圖不好截,就手機拍了= =圖片不好勿打
打開后按ctrl+f 搜素 OnBeforeRequest 找到這個方法
將下面代碼插入fiddler OnBeforeRequest 方法中
//保存到本地添加開始 //這是抖音的地址 設定視頻包的鏈接名 if ( oSession.fullUrl.Contains("v1-dy.bytecdn.cn")|| oSession.fullUrl.Contains("v3-dy-y.bytecdn.cn")|| oSession.fullUrl.Contains("v3-dy.z.bytecdn.cn")|| oSession.fullUrl.Contains("v5-dy.bytecdn.cn")|| oSession.fullUrl.Contains("v6-dy.bytecdn.cn") || oSession.fullUrl.Contains("v9-dy-z.bytecdn.cn") || oSession.fullUrl.Contains("v9-dy.bytecdn.cn") ){ var fso; var file; fso = new ActiveXObject("Scripting.FileSystemObject"); //文件保存路徑,可自定義 自動保存的txt文檔地址 file = fso.OpenTextFile("E:\\url_bt\\douyin.txt",8,true); //file.writeLine("Request-url:" + oSession.url); file.writeLine("http://"+oSession.url) //file.writeLine("Request-host:" + oSession.host); //file.writeLine("Request-header:" + "\n" + oSession.oRequest.headers); //file.writeLine("Request-body:" + oSession.GetRequestBodyAsString()); //file.writeLine("\n"); file.close(); } //保存到本地添加結束
將上面的代碼插入后打開抖音刷一刷,然后去自動保存的地址查詢是否有相應的txt文檔,如果沒有,查看fiddler對應視頻包名是否有修改
效果---這些鏈接可以在瀏覽器打開,但是可能看不到視頻,那是瀏覽器不支持,這個無影響,
!!!這些地址是有有效期的。。目測是大概1-2小時吧
那么問題來了。。如何自動模擬人的滑動來獲取到這些鏈接----華麗麗的Airtest登場(沒有接觸過手機自動化軟件的可以先去入門了,入門后再回來查看,有appium的童鞋可以接着看)
Airetest 基本操作教程:https://segmentfault.com/a/1190000017982620?utm_source=tag-newest
Airtest是支持python代碼操作的, 需要對應的庫 :pocoui pip install pocoui
安裝好之后,寫入自動滑動抖音的視頻來截取鏈接-----當然可以截取 推薦,同城,搜索,榜單的一些視頻包,只需要打開相應的視頻界面滑動
以下是我寫的自動上滑,拉動視頻的代碼--如果不適用,建議在Airtest上自己寫好copy到python代碼中就歐克
__author__ = "xiaojun" from airtest.core.api import * auto_setup(__file__) from poco.drivers.android.uiautomation import AndroidUiautomationPoco poco = AndroidUiautomationPoco(use_airtest_input=True, screenshot_each_action=False) #模擬滑動 def douyin_spwipe(): #無限循環向上滑動 while True: #坐標,以及速度 poco.swipe([0.5,0.8],[0.5,0.3],duration=0.2) sleep(3)
那么有了視頻的鏈接。。。剩下的就是寫一個python代碼獲取這些鏈接並請求寫入mp4視頻文件中了
!!!注意視頻鏈接是有 有效期的 大概1-2小時吧,所以建議是,一邊滑動獲取鏈接,一邊寫入生成鏈接
下面是python獲取鏈接,和寫入mp4的代碼。。。如有不合適,請自行修改調試代碼
獲取和生成兩個方法可以 同時進行, 多線程,多個文件,多個進程隨意 生成視頻后清空txt文件,休眠十幾分鍾讓滑動程序,繼續截圖視頻包鏈接
import os import requests import sys import time from fake_useragent import UserAgent headers = { 'User-Agent':UserAgent().chrome } #去重 def distinct_data(): datalist_blank = [] with open(r'E:\url_bt\douyin.txt','r') as f: #讀取所有行,生成列表 f_data_list = f.readlines() print(f_data_list) for url in f_data_list: if len(url)>40: datalist_blank.append(url.strip()) #去掉\n strip去掉頭尾默認空格或換行符 # print(url.strip()) f.close() # print(len(datalist_blank), datalist_blank) # print(len(set(datalist_blank)), set(datalist_blank)) #去重后的列表url datalist_blank= list(set(datalist_blank)) return datalist_blank #寫入文件夾 def responsedouyin(): #獲得種子鏈接 data_url=distinct_data() #統計文件夾中視頻數量 DIR = r'E:\url_bt\douyin_mp4' # 要統計的文件夾 num = len([name for name in os.listdir(DIR) if os.path.isfile(os.path.join(DIR, name))])+1 print(num)#文件夾現文件數量 for url in data_url: # stream=True作用是推遲下載響應體直到訪問Response.content屬性 # res = requests.get(url,stream=True,headers=headers) res = requests.get(url=url, stream=True, headers=headers) # #定義視頻存放的路徑 pathinfo = r'E:\url_bt\douyin_mp4\%d.mp4'%num #%d 用於整數輸出 %s用於字符串輸出 # 實現下載進度條顯示,這一步需要得到總視頻大小 total_size = int(res.headers['Content-Length']) print('這是視頻的總大小:',total_size) #設置流的起始值為0 temp_size = 0 if res.status_code == 200: # 將視頻寫入文件夾 with open(pathinfo, 'wb') as file: file.write(res.content) print(pathinfo + '下載完成啦啦啦啦啦') num += 1 with open(r'E:\url_bt\douyin.txt', 'w') as f: f.write('') f.close() time.sleep(700)
如果有優化,以及更好的方案可以隨時聯系我, 以上均為原創所寫,轉載請標明出處!