python爬虫案例:爬取电影以及MP4文件合并
目录
一、前言
一日心血来潮想看个电影,但很无奈,都是要VIP的,所以我选择去盗版网站看,但是……为什么这么卡啊!!!所以呢,先爬下来,下载之后再来看就不卡了。
二、爬取ts文件
废话少说,直入主题。进入这个盗版电影网站,鼠标右击,选择检查(快捷键:Ctrl+Shift+I)
在Network选项栏里可以看到有许多个ts文件,每个ts文件就是电影的一部分,思路就有了:通过循环请求,下载所有的ts文件然后合并即可。
点进其中一个ts观察请求头(Request URL),发现不同的ts只有最后几位数字是不同的,https://vip.ffzy-online2.com/20230629/40222_a6b8ae3d/2000k/hls/这部分是相同的,不同的是后面的数字的最后四位,0000.ts、0001.ts、0002.ts。
移动进度条到电影最后,发现Network里加载出的ts一直到httpxxxxxx1830.ts还要多一些,这样请求的范围就确定了。
接下来就是代码部分了:
import requests
import os
from fake_useragent import UserAgent
def download(i):
i = str(i).rjust(4, '0')
if os.path.exists(f'{i}.mp4'):
return
headers = {'user-agent': UserAgent().random}#注意random后不要加()
url = "https://vip.ffzy-online2.com/20230629/40222_a6"\
f"b8ae3d/2000k/hls/106d7d7527400{i}.ts"
response = requests.get(url, headers=headers)
if response.status_code != 404:
with open(f'{i}.ts', 'wb') as f:
f.write(response.content)
else:
print(f'第{i}次404报错')
def main():
for i in range(1831):
download(i)
if __name__ == '__main__':
main()
首先是四位数的格式,这里用了操作字符串的rjust()函数,右对齐,长度4位,以0填充。也可以选择%04d的格式化方法。
然后是heards,这里用了第三方库fake_useragent(安装方法:按下键盘的win+R键并输入cmd(或右击电脑开始菜单,选择运行再输入cmd),在cmd中输入pip install fake_useragent,然后等待下载安装),UserAgent()函数可以生成一些user-agent,调用random随机选取一个。
懒得安装第三方库的可以在Network里往下滑,找到user-agent项,复制过来即可
现在可以把range里的数字改小一点,试着下载几个ts试一试,看一下能否成功下载播放。
然后因为一个一个下载太慢,用Pool进程池进行优化:
from multiprocessing import Pool
def main():
po = Pool(30) # 进程池,每次30个
for i in range(1831):
po.apply_async(download, args=(i,))
po.close()
po.join()
导入multiprocessing库的Pool类,在main()函数中创建Pool对象,子进程数量可以自己根据电脑CPU性能进行取值。
然后循环apply_async()添加所有任务,第一个参数是函数名,第二个参数是该函数的参数,需要是元组类型,所以是args=(i,)。
添加任务后close(),最后调用join()依次添加子进程。
注意:在使用这个Pool的时候,必须写if __name__='__main__':否则会报错
三、mp4文件合并
下载完之后就可以来合并文件了,打开cmd(win+R键,输入cmd),进入文件所在目录,然后输入代码copy /b *.ts movie.mp4
进入文件目录的方法:如果是在其他盘下比如E盘,输入E:即可切换到E盘,注意是英文的冒号

然后到文件资源管理器处复制文件路径,输入 cd 文件路径,即可进入该目录

输入copy /b *.ts movie.mp4拼接文件,其中*.ts表示匹配所有.ts文件(如果代码中with open的是mp4类型,这里就改成*.mp4),movie.mp4表示最后生成的文件,文件名可改。
四、总结
通过.ts文件(电影的片段)的url发出请求,进程池优化下载,最后通过cmd的copy /b *.ts movie.mp4合并。
之后还可以根据自己的喜好或者面向其他使用者进行优化,比如加个进度条等。