# 下载阿丽塔 # https://sohu.zuida-163sina.com/20190223/TnSFbZPj/800kb/hls/jQQWmUN39911775.ts 其中一个ts文件地址 # 第一步通过查看源代码可看到Referer地址如下,其中下载地址:https://sohu.zuida-163sina.com/20190223/TnSFbZPj/index.m3u8 # https://newplayers.pe62.com/mdparse/m3u8.php?id=https://sohu.zuida-163sina.com/20190223/TnSFbZPj/index.m3u8 # 第二步以上下载的文件中有个地址:/ppvod/FA7CC7B31F271DBD6F1A181E8429770D.m3u8 # 组合成地址:"https://sohu.zuida-163sina.com/ppvod/FA7CC7B31F271DBD6F1A181E8429770D.m3u8"就可以下载了 import requests import os,re import time import urllib.request # https://sohu.zuida-163sina.com/20190223/TnSFbZPj/800kb/hls/jQQWmUN39911775.ts 通过这个可以确定url开头部分 # 将来需要拼接的每一个ts视频文件地址的开头 begin_url = "https://sohu.zuida-163sina.com" length = len(begin_url) # m3u8地址,下载下来会看到很多个ts文件名字组成 url = "https://sohu.zuida-163sina.com/ppvod/FA7CC7B31F271DBD6F1A181E8429770D.m3u8" response = requests.get(url) all_content = response.text # 按照结尾的换行符进行切片操作 file_line = all_content.split("\n") # 存储将来拼接的所有ts链接地址 url_list = [] header = { 'User-Agent': 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0);' for index, line in enumerate(file_line): if "EXTINF" in line: pd_url = begin_url + file_line[index + 1] # 拼出ts片段的URL # print(pd_url) url_list.append(pd_url) # file_name = file_line[index+1][-10:-3] url_length = len(url_list) for i in range(url_length): add_url= url_list[i] # 正则取出数字文件名字 patt = re.compile(r'\d+') file_name = add_url.split("/")[-1] request = urllib.request.Request(add_url,headers=header) response = urllib.request.urlopen(request) html = response.read() # result_file_name= url_list[i][length:][-10:-3] result_file_name= patt.findall(file_name)[0] print("正在处理%s"%result_file_name+".ts","共%s/%s项"%(i+1,url_length)) time.sleep(1) path = "D:/video2/" if (not os.path.exists(path)): os.makedirs(path) with open(path+result_file_name+'.ts',"wb")as f: f.write(html)

最后在合并成mp4文件:

https://blog.csdn.net/z564359805/article/details/81055825

#!/usr/bin/env python# coding=utf-8# 爬取m3u8地址的所有ts文件并下载到"D:/video2/",一般会有几千个文件耐心等待# 下载阿丽塔# https://sohu.zuida-163sina.com/20190223/TnSFbZPj/800kb/hls/jQQWmUN39911775.ts 其中一个ts文件地址# 第一步通过查看源代码可看...
本例程使用urlib实现的,基于 python 2.7版本,采用beautifulsoup进行网页分析,没有第三方库的应该安装上之后才能运行,我用的IDE是pycharm,闲话少说,直接上代码! # -*- coding: utf-8 -* import re import os import urllib import urllib 2 from bs4 import BeautifulSoup def craw(url,page): html1= urllib 2.urlopen(url).read() html1=str(html1) soup=BeautifulSoup(html1,'l
这里面的 ts 文件 就是视频的碎片 文件 ,但是这个是相对路径,怎么获取到绝对路径呢?以一直播为例,我 下载 m3u8 文件 地址 为“http://alcdn.hls.xiaoka.tv/2018119/ff3/7c6/-uesBLqlm9rMc6Fw/index. m3u8 ” , ts 文件 的绝对 地址 就是... 最近《流浪地球》比较火,想 资源 下载 看看,无奈只 到了网址 http://m.tlyy.tv/ ,但是我的chrome插件也嗅探不到网页上的视频。。于是乎,右击页面,inspect走起… m3u8 文件 映入眼帘 /偷笑, m3u8 文件 是什么 文件 呢,copy address and wget下来看看: 文件 playlist. m3u8 内容如下,可见网页里的视频是根据这个play...
下面的这段代码为什么会报错?应该怎么解决?import reques ts import re import os session = reques ts .Session() # (1) 爬取 m3u8 文件 的链接 url = "https://www.9tata.cc/play/14999-1-0.html" headers = { 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36' } res = session.get(url, headers=headers, verify=False) m3u8 _link = re.search('now="(.*? m3u8 )"', res.text).group(1) print( m3u8 _link) # https://ikcdn01.ikzybf.com/20221015/ecMSO74h/index. m3u8 print(os.path.dirname( m3u8 _link)) # 顺便抓一个名字 # name = re.search(r'<td class="col2 hidden-xs">(?P<name>\w+)</td>', res.text).group("name") # print("name", name) # (2) 爬取 m3u8 文件 res = session.get( m3u8 _link) print(res.text.split("\n")[2]) # m3u8 _detail_link = os.path.join(os.path.dirname( m3u8 _link), res.text.split("\n")[2]) print( m3u8 _detail_link) # (3) 爬取 m3u8 具体 文件 res = reques ts .get( m3u8 _detail_link) print(res.text)
这段代码可能会报错因为: 1. 请求 `https://www.9tata.cc/play/14999-1-0.html` 返回的内容中可能没有符合正则表达式 `'now="(.*? m3u8 )"'` 的内容,导致 `re.search` 函数返回 `None`,再调用 `.group(1)` 方法就会抛出 AttributeError。 2. 在注释 (2) 中,由于 `res.text.split("\n")[2]` 可能不存在,因此会抛出 IndexError。 3. 如果在注释 (2) 中成功获取到 ` m3u8 _detail_link`,由于该链接是相对链接,需要使用 ` urllib .parse.urljoin` 函数将其与 `os.path.dirname( m3u8 _link)` 拼接起来才能得到完整链接。 4. 在注释 (3) 中,使用了 `reques ts .get` 函数而不是之前创建的 `session.get` 方法,这意味着没有传递之前设置的 headers 和 cookies,可能会导致请求失败。 要解决这些问题,可以按照下面的方式修改代码: ``` python import reques ts import re import os from urllib .parse import urljoin session = reques ts .Session() url = "https://www.9tata.cc/play/14999-1-0.html" headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36' # (1) 爬取 m3u8 文件 的链接 res = session.get(url, headers=headers, verify=False) m3u8 _match = re.search(r'now="(.*? m3u8 )"', res.text) if m3u8 _match: m3u8 _link = m3u8 _match.group(1) print( m3u8 _link) # (2) 爬取 m3u8 文件 res = session.get( m3u8 _link) if res.ok: m3u8 _detail_link = urljoin(os.path.dirname( m3u8 _link), res.text.split("\n")[2]) print( m3u8 _detail_link) # (3) 爬取 m3u8 具体 文件 res = session.get( m3u8 _detail_link) if res.ok: print(res.text) else: print("Failed to get m3u8 _detail_link") else: print("Failed to get m3u8 _link") else: print("Failed to find m3u8 _link")