# 下载阿丽塔
# 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")