爬虫实战-某电影网站实战

前景导入

最近闲来无事,研究上了Python爬虫,先后做了几个小例子,最初的打算是看某些视屏的时候,需要会员看不了,很难受,就想着试试,实战难度可想而知,就我目前而言

  • 腾讯视屏
  • 爱奇艺
    还是不想了,找些电影资源站做一个练手小项目吧

实操

环境准备

  • vscode 编辑器
  • python 3.7
  • Edge
  • 一个电影资源站

这里我使用的资源站是星辰影院

第一步

打开网站,找到你想看的电影
图一
我选的康斯坦丁,点击播放他并打开浏览器的开发者工具按键盘上的 f12
点击网络,可以看到以下内容

图二

点击媒体

图三
请注意 这里我们看到 电影,在web上时大部分都会选择切割为 多个小的ts文件进行传输,使视屏能更快速的缓存以及边看边缓存,如果我们需要下载这个电影,就是说需要把这些不知道有多少个的ts文件下载下来

1
2
3
4
5
简单分析:随便点开几个切片会发现他们的 Filename 为 
https://p.jisuts.com:999/hls/232/20240219/2344954/plist0.ts
https://p.jisuts.com:999/hls/232/20240219/2344954/plist1.ts
https://p.jisuts.com:999/hls/232/20240219/2344954/plist2.ts
https://p.jisuts.com:999/hls/232/20240219/2344954/plist3.ts

那么相信大家都看到里面的规律了,在这里呢挨个点击下载到本地也是可以的,不过嘛,我们既然学会了爬虫就大可不必用这种笨方法了不是吗
所以我写了一个简单的小例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import requests
from bs4 import BeautifulSoup

num = 0
while True:
#将一个切片地址引用,在规律点进行参数传递
movie_url = f"https://p.jisuts.com:999/hls/232/20240219/2344954/plist{num}.ts"
print(movie_url)
#获取movie_url 的状态码 如果状态码为200就代表可以正常访问
movie_response = requests.get(movie_url)

if movie_response.status_code == 200:
print(f"当前是第{num}个切片")
#将每个切片文件保存下来并按照规范命名
with open(f"{num}.ts", "wb") as f:
f.write(movie_response.content)
print(f"第{num}个切片下载完成")
num += 1
else:
print(f"请求结束,状态码: {movie_response.status_code}")
break

这段代码在有些情况下可能不适用,或许有些电影站,只想服务于浏览器用户,那在这里的就没有办法使用这段代码 你需要添加一个请求头

图四

1
2
3
4
5
6
header = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:131.0) Gecko/20100101 Firefox/131.0"}


#在你发送请求的时候使用,把我们伪装成一个浏览器用户
movie_response = requests.get(movie_url,headers=header)

当他下载完成,可以在你的目录下看到很多ts后缀的文件
很多哈 看的我密集恐惧症要出来了

当然了,现在你把这些文件下载下来了,如果你很幸运,这个文件没有加密,那你可以挨个点开直接看了,就是几十秒换一个很麻烦,所以我们要用到工具

很不幸,这个视屏包加密的,但是有句话叫 三步之内必有解药,我们回到浏览器中,在开发者工具中找两个东西

  • m3u8
  • key
    以这两个为后缀的就是我们的解药

图五

图六
双击把他们下载到ts文件的目录去
右键用记事本或其他工具打开
index.m3u8的内容

图七
这里的链接就是我们刚才下载文件的链接,那么我们已经把文件下载下来了,所以链接地址也要改成本地的
因为有七百来个ts文件,一个个改要命,我写了个代码来自动去改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
####文件对于爬虫下来的视屏进行文件路径更换####
import os

# 定义文件路径
file_path = 'E:/ts/index.m3u8' # 请将此路径替换为你的文件路径
local_base_path = 'E://ts/' # 请将此路径替换为你本地的绝对路径

# 读取文件内容
with open(file_path, 'r', encoding='utf-8') as file:
lines = file.readlines()

# 初始化一个空列表来存储新的行
new_lines = []

# 遍历每一行并进行处理
for i, line in enumerate(lines):
# 如果这一行以 "https://" 开头,说明是URL链接
if line.startswith('https://'):

# 根据行号生成新的本地路径
new_path = os.path.join(local_base_path, f'{(i-6) // 2}.ts')
# 将新的本地路径添加到新行列表中
new_lines.append(new_path + '\n')
else:
# 如果不是URL链接,直接添加到新行列表中
new_lines.append(line)

# 写回文件
with open(file_path, 'w', encoding='utf-8') as file:
file.writelines(new_lines)

print("URL替换完成")

记得把路径改成自己的哦
改好之后呢,我们来把他作为参数文件,在你的ts文件目录中打开cmd
使用ffmpeg 工具

1
ffmpeg -allowed_extensions ALL -i index.m3u8 -c copy new.mp4