小工具知识网

当前位置: 首页 > 行业知识 > Python爬虫实战第三例【三】(下)

行业知识

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