zoukankan      html  css  js  c++  java
  • python爬虫抖某音爬取视频 Airtest+fiddler

    另一种解决方案firda-hook破解加密:https://www.cnblogs.com/HugJun/p/13603142.html

    所用到的模块和库 :  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:" + "
    " + oSession.oRequest.headers);
    			//file.writeLine("Request-body:" + oSession.GetRequestBodyAsString());
    			//file.writeLine("
    ");
    			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_btdouyin.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()) #去掉
     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_btdouyin_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_btdouyin_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_btdouyin.txt', 'w') as f:
            f.write('')
            f.close()
        time.sleep(700)

      

      如果有优化,以及更好的方案可以随时联系我,   以上均为原创所写,转载请标明出处!

  • 相关阅读:
    S MVC 转发与重定向
    S MVC Controller方法返回值
    S MVC 表单提交
    numpy数据平滑
    Python入门
    Django
    python机器学习基础教程-监督学习
    drf-CBV
    numpy数组符号化与函数向量化
    numpy中多项式拟合与复数
  • 原文地址:https://www.cnblogs.com/HugJun/p/11125745.html
Copyright © 2011-2022 走看看