python爬蟲抖某音爬取視頻 Airtest+fiddler


所用到的模塊和庫 :  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)

  

  如果有優化,以及更好的方案可以隨時聯系我,   以上均為原創所寫,轉載請標明出處!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM