现在网上电影在线观看基本都是m3u8格式,或者经过js加密后的m3u8格式,一般来说爬m3u8文件,先刷新电影找到以m3u8结尾的文件,然后双击就将该文件下载下来,然后用记事本打开m3u8文件找到以ts文件结尾的路径并和该网站域名进行拼接,将拼接后的地址放到浏览器中会提示下载该ts文件。这时候恭喜你成功一大半了,之后就想办法把m3u8文件里的ts文件循环下载下来然后合成一个mp4文件就可以了
插入代码
import threading
import requests
from queue import Queue
import time
import os
def get_url(m3u8,wangzhangurl):
if not os.path.exists("download"):#创建要下载文件的文件夹
os.mkdir("download")
with open(m3u8, 'r', encoding='utf-8') as pf:
content = pf.readlines()#读取m3u8文件
for i in content:
url_half = i.strip()
if url_half.endswith("ts"):#对该文件进行处理并拼接完成的url,该url文件可以获得ts文件,每个m3u8文件和电影网站域名的拼接方式都不一样,需要自己尝试拼接
url_evey = wangzhangurl + url_half
#将文件放入队列
response_q.put(url_evey)
class Consumer(threading.Thread):
def __init__(self, j):
#1.继承父类init:
super().__init__()
self.j= j
def run(self):
##线程不能只干一个任务就退出,需要不断取任务:
while True:
##停止条件:消费者任务队列为空
if response_q.empty():
break
try:#运用多线程爬ts文件
url_full = response_q.get(block=False)
name=str(url_full)[-20::]
print(f'======{self.j}执行任务===')
self.get_movie(url_full,name)
print(f'======{self.j}任务完成===')
except:
pass
# 二、解析函数:
def get_movie(self,urlfull, name):#爬取ts文件并保存
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36"}
response = requests.get(url=urlfull, headers=headers).content
with open("download\%s" % name, "wb") as pf:
pf.write(response)
def merge_ts():#定义ts合成转换MP4函数
#获取当前文件夹地址并合并下载文件夹地址
file_path=os.getcwd()+"\download"
file_list = os.listdir(file_path)
file_list.sort()¥#对下载的ts文件进行排序
#编写合并转化命令
shell_strs = 'copy /b ' + file_path + "\*.ts " + file_path + "\我的老婆是大佬.mp4"
#运行该命令
os.system(shell_strs)
response_q = Queue()##消费者队列
#m3u8文件的路径
m3u8=r"C:\Users\Administrator\Desktop\新建文件夹\index.m3u8"
#和m3u8文件里拼接成整个ts文件的网站的地址
wangzhangurl=r"https://56.com-ok-bilibili.com/20190926/31754_e5277946/1000k/hls/"
if __name__ == '__main__':
get_url(m3u8, wangzhangurl)
start_time = time.time()
consumer_name = ['c1', 'c2', 'c3','c4','c5','c6','c7']
c_tread = []
##多线程
for j in consumer_name:
c_crawl = Consumer(j)
c_crawl.start()
c_tread.append(c_crawl)
##多线程阻塞主线程
for treadi in c_tread:
treadi.join()
end_time = time.time()
merge_ts()
print(f'===========任务耗时{end_time-start_time}==========')