网页音频抓取软件(1.视频抓包地址的分析以及获取2.界面逻辑代码的编写)

优采云 发布时间: 2022-04-08 04:05

  网页音频抓取软件(1.视频抓包地址的分析以及获取2.界面逻辑代码的编写)

  前言:最近在家经常用抖音消遣娱乐,也经常通过抖音软件直接和朋友分享视频。我太无聊了,花了一上午的时间为 PC 制作了一个 抖音 视频下载器。

  郑重声明,本文章介绍的技术仅供学习使用,不能被恶意攻击抖音网站。抖音 服务器的任何损失将由您自担风险。

  具体视频在以下链接:

  抖音.mp4

  所需工具:

  **1、Chrome浏览器(如Chrome、安装httpwatch的IE浏览器等)+charles(个人最喜欢的抓包工具)

  2. Pycharm(任何你熟悉的编译器)

  其实在编写软件的过程中,我个人认为是分为两个部分。

  1.视频采集地址解析获取

  2.接口逻辑代码的编写

  一、视频地址解析和抓包

  1.我们先在手机的抖音软件上选择一个下载好的视频,通过连接分享给别人

  

  2.我们在 Chrome 上键入上面的链接并右键单击 - 设置 - 网络。然后单独打开charles软件。按 Enter 开始获取内容

  

  我们会发现我们最初在浏览器中输入的地址变成了下面的地址。实际上,一个涉及爬虫的重定向问题(Redirect)就是通过各种方法将各种网络请求重定向到其他位置(比如网页重定向、域名重定向,路由变化也是一个数据报通过路径的重定向)。

  这里的流程其实是:首先跳转到我填写的URL——根据当前URL的重定向信息获取定向位置(即location中的位置)

  

  我们现在可以打开视频进行播放,但是我们怎么知道视频的实际地址在哪里呢?我们如何下载它?

  

  其实上图就是我们对charles的两步捕获的对应信息。但是当我们点击播放按钮时,我们可以在 charles 身上发现一些不同的东西。下图是点击播放按钮后捕获的信息

  

  细心的朋友可能会看到,当我们点击视频时,他会自动跳转到一个地址并缓存。但是在哪里可以找到这个地址?这是最关键的一步。

  通过仔细分析,发现视频的播放地址隐藏在这个地址的响应体中(这是一个随时变化的地址,我们这里可以通过正则表达式很好的得到)

  

  我们得到这个地址后,继续发送请求,发现这个地址也是一个重定向地址。其实视频的最终地址如下图所示(即图4中视频缓存的地址):

  

  向该地址发送请求后,你会发现它的响应体是字节流(我们可以通过将二进制流直接写入文件来保存)

  

  二、接口逻辑代码

  其实对于界面搭建所需要的组件和布局,每个人都有自己的理解和审美,所以这里只展示地址的截图和视频下载。

  import requests

import re

import random

import time

from PyQt5.Qt import *

class api(QObject):

downSignal = pyqtSignal(list)

def __init__(self,url,saveFilename):

"""

:param url: 视频地址

:param saveFilename: 保存的文件名

"""

super(api, self).__init__()

self.session = requests.session()

self.url = url

self.savename = saveFilename

userAgent = [

"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1",

"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0",

"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50",

"Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.9.168 Version/11.50"]

key = random.randint(0, 3)

self.headers = {'content-type': 'application/json', 'User-Agent': userAgent[key]}

def getdoumload(self):

"""

作用:获取最终的视频的下载地址

:return:

"""

try:

url =self.url

rep = self.session.get(url, headers=self.headers, verify=False) # 获取跳转的链接

self.downLoadUrl = re.findall("playAddr:(.*)", rep.text)[0].split('"')[1] # 获取视频的下载地址,会进行重定向

except:

self.downLoadUrl = "parse error"

return self.downLoadUrl

def downLoadVideo(self):

"""

作用:对视频文件进行保存,并发送信号给主界面

:return:

"""

try:

r = self.session.get(self.downLoadUrl, headers = self.headers,verify = False)

length = float(r.headers['content-length'])

except:

return False

count = 0

time1 = time.clock()

with open(self.savename, 'wb') as f:

for chunk in r.iter_content(chunk_size=512):

if chunk:

f.write(chunk)

count += len(chunk)

p = count / length * 100

intervals = time.clock() - time1

speed = count / 1024 / 1024 / intervals

self.downSignal.emit([p, speed])

if __name__ == '__main__':

url = " https://v.douyin.com/J1cGcN5/"

apt = api(url,"./xx.mp4")

if apt.getdoumload() != "parse error":

apt.downLoadVideo()

  自己做的一个小玩具。欢迎大家指出我的不足和错误,共同进步。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线