行业知识
Python爬虫实战第三例【三】(下)
2026-11-12 01:06:43
来源:互联网转载
零.前情提要:
���有看上一章的小伙伴,建议先去看上一章,避免有些知识点不连贯
地址:Python爬虫实战第三例【三】【上】-CSDN博客
在上一章,我们经过分析.m3u8文件和.ts文件后,成功爬取到了所有.ts文件的文件名,并且成功下载了.ts文件,但是在上一节中我们只是下载了一个.ts文件,并没有实现批次的.ts文件下载。
接下来,我们就要进行批次爬取.ts文件,并且将它们组合在一起!
准备好了吗?跟随作者一起,走进爬虫的海洋吧!
一.批次爬取.ts文件
由于我们现在爬取.ts文件的函数,一次只能爬去一个.ts文件,那我们是不是可以在函数外面放一个for循环来实现批次爬取.ts文件呢?当然可以了!!
代码如下:
#将ts_list转换为带有序号的列表,方便.ts文件的重命名,用来保持顺序一致! ts_list = list(enumerate(ts_list)) for ts in ts_list: down_video(ts)
效果图:
但是这样是有一个问题的,那就是爬取完第一个.ts文件后,程序重新构造一大串.get请求并发送,这中间消耗了大量资源,并且可以发现效率很慢!!!如果共有1000个.ts文件,我们需要爬取三十分钟!!这显然不是我们想要看到的!!
学过线程的小伙伴可能想到了,这不是单线程造成的吗?对的,所以改进的话我们只需要改成多线程就可以啦!!
为此,我们先要导入线程池:
from multiprocessing.pool import ThreadPool
代码如下:
#创建线程池 pool = ThreadPool(100) #利用map函数给线程分配工作 pool.map(down_video,enumerate(ts_list))
效果图:
可以看到效率飞起!!效率大概提升了1000%!!!
(与个人CPU有关,CPU线程数越多效率越高)
二.重新爬取失败的文件
不过在爬取过程中,难免会有一些.ts文件因为网络波动的问题,导致超时,从而报错,这显然不是我们想看到的,为此我们该怎么办呢?
作者的想法是,创建一个检查函数,在执行完爬取.ts文件后,检查是否有文件没有被爬取!
代码如下:
#漏下的.ts文件列表fil_list = []#检查标志file_flag = Falsedef down_video(item): #全局变量标志,用来表示是第一次爬取.ts文件,还是爬取漏下的.ts文件! global file_flag #对item进行解包,提取出ts文件和ts文件索引 index,ts = item[0],item[1] #拼接文件序号 if 0
上一篇:抗战ol怎么转服务器?
下一篇:程序人生-Hello’s P2P