前言
最近本人在学习如何用python写爬虫,看了B站大学里的视频以后,自己模仿着写了一个,并且加入了多线程。这个爬虫适用于m3u8链接需要获取两次的视频网站,使用正则表达式提取链接。先来整理一下思路: 1.拿到视频播放页面的源代码,检查视频播放区的元素 2.找到第一个m3u8链接(一般会用反斜杠转义,所以写爬虫时要去掉反斜杠) 3.下载第一个m3u8链接后,提取其中的路径部分,并与链接的公共部分拼接,获得第二个m3u8链接 4.ffmpeg配合多线程,下载视频 废话不多说,上代码!
正文
安装环境
1.Windows下载ffmpeg程序 先准备好ffmpeg:ffmpeg官网 选择对应版本下载并解压(我下载的是ffmpeg-n5.0-latest-win64-lgpl-5.0
版本),并加入Windows系统变量(此电脑-属性-高级系统设置-环境变量): 2.Python安装ffmpy3库:
pip3 install ffmpy3 -i https://mirrors.aliyun.com/pypi/simple/
编写代码
#!/usr/bin/python3.9
# -*- coding: utf-8 -*-
#
# Copyright (C) 2022 HackerTerry, Inc. All Rights Reserved
#
# @Time : 2022/2/3 14:07
# @Author : Terry Zhang
# @Email : goudan1974@163.com
# @Blog : https://terry906.top
# @File : 线程池爬云播TV视频.py
# @Software: PyCharm
import requests
import re
from concurrent.futures import ThreadPoolExecutor
from ffmpy3 import FFmpeg
def get_first_m3u8(url,headers): # 获取第一个m3u8链接
resp = requests.get(url,headers)
obj = re.compile(r'"link_pre":"","url":"(?P<first_m3u8>.*?)","url_next"',re.S) # 正则表达式可按需要修改
m3u8_url = obj.finditer(resp.text)
for it in m3u8_url:
first_m3u8 = it.group("first_m3u8").replace("\\","")
print(first_m3u8)
return first_m3u8
def download_first_m3u8(url,name,headers): # 读取第一个m3u8文件的内容
resp = requests.get(url,headers)
with open(name, "w", encoding="utf-8") as f1:
f1.write(resp.text)
with open(name,"r") as f2:
for line in f2:
if line.startswith("#"):
continue
else:
line.strip()
print(line)
return line
def get_second_m3u8(url,headers): # 获取第二个m3u8链接
first_m3u8 = get_first_m3u8(url,headers)
line = download_first_m3u8(first_m3u8,"爬到的视频/first_m3u8.txt",headers)
second_m3u8 = first_m3u8.split("/20220112")[0] + line
print(second_m3u8)
return second_m3u8
def ffmpeg_path(inputs_path, outputs_path): # ffmpeg下载函数
'''
:param inputs_path: 输入的文件传入字典格式{文件:操作}
:param outputs_path: 输出的文件传入字典格式{文件:操作}
:return:
'''
a = FFmpeg(
inputs={inputs_path: None},
outputs={outputs_path: '-c copy',
}
)
print(a.cmd)
a.run()
if __name__ == '__main__':
url = "https://www.yunbtv.net/vodplay/ITgou-1-1.html" # 使用时只需更改这里的URL即可
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36",
"Referer": "https://www.yunbtv.net/"
}
second_m3u8 = get_second_m3u8(url,headers)
with ThreadPoolExecutor(50) as t:
t.submit(ffmpeg_path,second_m3u8,"爬到的视频/IT狗第一集.mp4")
这里由于第二个m3u8文件中自带AES解密密钥的链接地址,所以无需单独考虑解密的问题,交给ffmpeg解决即可。