Python爬虫实战第三例【三】(下)

零.前情提要:

没有看上一章的小伙伴,建议先去看上一章,避免有些知识点不连贯

地址: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 <= index <=9:index = "000" + str(index)elif 10 <= index <= 99:index = "00" + str(index)elif 100 <= index <= 999:index = "0" + str(index)else:index = str(index)#爬取视频URLURL = "https://s8.fsvod1.com/20230703/J6BHjLy3/1500kb/hls/"#请求头headers = {"authority":"s8.fsvod1.com","method":"GET","path":f"/20221207/10692_4308abda/2000k/hls/{ts}","scheme":"https","Accept":r"*/*","Accept-Encoding":"gzip,deflate,br,zstd","Accept-Language":"zh-CN,zh;q=0.9","Origin":"https://test3.gqyy8.com:4438","Sec-Ch-Ua":'"Chromium";v="122","Not(A:Brand";v="24","Google Chrome";v="122"',"Sec-Ch-Ua-Mobile":"?0","Sec-Ch-Ua-Platform":"Windows","Sec-Fetch-Dest":"empty","Sec-Fetch-Mode":"cors","Sec-Fetch-Site":"cross-site","User-Agent":"Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/122.0.0.0Safari/537.36"}#拼接视频urlURL = URL + "/" + tstry:r = requests.get(url=URL,headers=headers,timeout=10)with open(f"{os.getcwd()}/爬取数据/" + index + ".ts", "wb") as file:file.write(r.content)except Exception as e:if not file_flag:fil_list.append([int(index),ts])print(index,"写入失败,原因",e,sep="->")returnif file_flag:fil_list.remove(item)print(index,"写入成功.",sep="->")def check():print("开始检查")global file_flagfile_flag = Truewhile fil_list:pool = ThreadPool(100)results = pool.map(down_video, fil_list)pool.close()pool.join()print("检查完毕")if __name__ == "__main__":ts_list = get_ts_txt()create_filedir()#创建线程池pool = ThreadPool(100)#利用map函数给线程分配工作pool.map(down_video,enumerate(ts_list))#检查函数check()

 效果图:

也是成功全部爬取啦!!

我累个逗啊!居然有2426.ts文件!!

三.合成.ts文件

其实将所有.ts文件拼凑在一起,有很多方法,在这里作者给出一种相对简单的方法

1.首先进入cmd切换到我们的“爬取数据”路径下,如下图所示:

 2.接下来输入指令:

copy /b *.ts my_video.ts

结果如下图所示:

最后,去我们的文件夹里面找“my_video.ts”即可播放啦!!

 

芜湖,可以看玲芽啦~~ 

四.全部代码

import requests
import os
import re
from multiprocessing.pool import ThreadPool#漏下的.ts文件列表
fil_list = []
#检查标志
file_flag = Falsedef get_ts_txt():#4请求URLurl = "https://s8.fsvod1.com/20230703/J6BHjLy3/1500kb/hls/index.m3u8"#请求头headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36"}reponse = requests.get(url=url,headers=headers)get_txt = reponse.text#正则匹配出.ts后缀数据ts_files = re.findall(r"\b\w+\.ts\b",get_txt)#将.ts数据写入到文件中中with open("get_ts.txt","w") as file:for i in ts_files:i = i + "\n"file.write(i)print("获取ts文件成功.")return ts_filesdef create_filedir():path = os.getcwd() + "/爬取数据"if os.path.exists(path):print("\\爬取视频文件夹已存在,本次不创建.")else:os.mkdir(path)print("创建\\爬取文件夹成功.")def down_video(item):#全局变量标志,用来表示是第一次爬取.ts文件,还是爬取漏下的.ts文件!global file_flag#对item进行解包,提取出ts文件和ts文件索引index,ts = item[0],item[1]#拼接文件序号if 0 <= index <=9:index = "000" + str(index)elif 10 <= index <= 99:index = "00" + str(index)elif 100 <= index <= 999:index = "0" + str(index)else:index = str(index)#爬取视频URLURL = "https://s8.fsvod1.com/20230703/J6BHjLy3/1500kb/hls/"#请求头headers = {"authority":"s8.fsvod1.com","method":"GET","path":f"/20221207/10692_4308abda/2000k/hls/{ts}","scheme":"https","Accept":r"*/*","Accept-Encoding":"gzip,deflate,br,zstd","Accept-Language":"zh-CN,zh;q=0.9","Origin":"https://test3.gqyy8.com:4438","Sec-Ch-Ua":'"Chromium";v="122","Not(A:Brand";v="24","Google Chrome";v="122"',"Sec-Ch-Ua-Mobile":"?0","Sec-Ch-Ua-Platform":"Windows","Sec-Fetch-Dest":"empty","Sec-Fetch-Mode":"cors","Sec-Fetch-Site":"cross-site","User-Agent":"Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/122.0.0.0Safari/537.36"}#拼接视频urlURL = URL + "/" + tstry:r = requests.get(url=URL,headers=headers,timeout=10)with open(f"{os.getcwd()}/爬取数据/" + index + ".ts", "wb") as file:file.write(r.content)except Exception as e:if not file_flag:fil_list.append([int(index),ts])print(index,"写入失败,原因",e,sep="->")returnif file_flag:fil_list.remove(item)print(index,"写入成功.",sep="->")def check():print("开始检查")global file_flagfile_flag = Truewhile fil_list:pool = ThreadPool(100)results = pool.map(down_video, fil_list)pool.close()pool.join()print("检查完毕")if __name__ == "__main__":ts_list = get_ts_txt()create_filedir()#创建线程池pool = ThreadPool(100)#利用map函数给线程分配工作pool.map(down_video,enumerate(ts_list))#检查函数check()

ps:复制上直接就可以爬取哦~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/722392.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

冒泡经典题

&#x1f4d1;前言 本文主要是【】——简单使用的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304;每日一句&#xff1a;狠…

RN开发搬砖经验之-Android平台下处理后退按钮事件

基本接口 利用RN 针对Android平台提供的接口 BackHandler BackHandler需要区分类组件跟函数组件的场景&#xff0c;主要是两个组件一个基于组件生命周期的&#xff0c;一个是基于hook的&#xff0c;即注册BackHandler的事件监听与移除时机写法不同。 类组件 示例代码 impor…

使用J-Link | OPENSDA 调试S32K144开发板

一、S32DS下载 使用的开发软件为S32DS&#xff0c;可以到NXP官网下载&#xff1a;链接&#xff0c;也可以通过网盘&#xff1a;链接 二、对S32K144开发板进行调试 调试方法一&#xff1a; S32K144开发板自带一个OPENSDA MCU&#xff0c;我们可以通过一根Mircro USB线连接到电…

计算机网络-第3章 数据链路层

主要内容&#xff1a;两个信道及对应的协议&#xff1a;点对点信道和广播信道&#xff0c;扩展以太网和高速以太网 本章的分组转发为局域网内的转发&#xff0c;不经过路由&#xff0c;网络层分组转为为网络与网络之间的转发&#xff0c;经过路由。局域网属于网络链路层的范围…

springboot3.x 以上,官方不建议使用spring.factories

springboot2.7.x 以上,官方不建议使用spring.factories 最近公司项目升级.需要将springcloud/springboot版本升级到2.7.x以上,再升级的过程中遇到了太多的问题.总结在了如下文章中: springboot艰难版本升级之路!! springboot 2.3.x版本升级到2.7.x版本 这篇文章就重点是梳理一…

LeetCode 热题 100 (尽量ACM模式刷) 持续更新!!!

LeetCode 热题 100 哈希hash 1 两数之和 /** 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出和为目标值target的那两个整数&#xff0c;并返回它们的数组下标。* 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案…

AWS MSK的连接

kafka客户端需要Java依赖&#xff0c;所以先安装Java11&#xff0c; sudo yum install java-11https://docs.aws.amazon.com/zh_cn/msk/latest/developerguide/port-info.html 匿名连接 # 匿名使用9092端口 BootstrapServerStringb-2.xxxx.kafka.cn-north-1.amazonaws.com.c…

品优购首页制作

一&#xff0c;常用模块类名命名 二&#xff0c;快捷导航shortcut制作 三&#xff0c;header制作 3.1LOGO SEO优化 3.2 搜索模块定位 四&#xff0c; nav导航制作 五&#xff0c;footer底部制作 六&#xff0c;main主体模块制作 以前书写是模块化中的公共部分 main主体模块是…

MyBatis介绍

MyBatis是一个优秀的持久层框架&#xff08;就是将某些数据持久化到硬盘或其他存储器中的框架&#xff09;&#xff0c;它把jdbc对数据库的操作进行了封装&#xff0c;使用户只需关注sql本身&#xff0c;不需要去执行jdbc的那一套复杂的操作。 MyBatis通过配置xml文件或注解的方…

Linux安全加固功能

提示:工具下载链接在文章最后 目录 一.加固功能介绍二.配置加固功能1.配置安全加固功能1.1 开放目前设备监听的所有端口1.2 只开放80、443、20、21、22端口1.3 防火墙配置工具1.3.1 开放允许访问的端口1.3.2 删除允许访问的端口1.3.3 添加IP地址允许访问规则1.3.4 添加IP地址禁…

漫画手绘视频教程分享

下载地址&#xff1a; 漫画手绘教程: https://url83.ctfile.com/d/45573183-60305653-039aed?p7526 (访问密码: 7526)

JavaScript基础3之面向对象关于面向过程、函数式编程、对比、构造函数、原型

JavaScript基础 面向对象面向过程函数式编程命令式编程函数式编程特性副作用透明引用不可变变量函数是一等公民 常见的函数式编程模型 面向对象为什么要使用面向对象封装继承多态 对比面向过程函数式编程面向对象 构造函数原型constructor使用场景 对象原型 面向对象 面向过程…

chrome自动更新后,手动恢复书签和历史记录

本文是针对google没有登录账号信息&#xff0c;浏览器更新后&#xff0c;如何恢复本地书签可历史记录。 为了解决“已被CORS策略阻止&#xff1a;请求的资源上没有’Access-Control-Allow-Origin’标头&#xff08;跨域请求失败”这个问题&#xff0c;修改了Google属性&#x…

【C语言】算术运算符

C语言算术运算符&#xff0c;加、减、乘、比较简单&#xff0c;主要需要注意有除法和取余两个&#xff0c;以及前自增和前自增&#xff0c;减法类似。 运算符 术语 示例 结果 加 10 5 15 - 减 10 - 5 5 * 乘 10 * 5 50 / 除 10 / 5 2 % 取模(取余) 10 …

数据结构试题

一、选择题 01.可以用( D )定义一个完整的数据结构。 A.数据元素 B&#xff0e;数据对象 C&#xff0e;数据关系 D.抽象数据类型 02.以下数据结构中&#xff0c;( A )是非线性数据结构。 A.树 B.字符串 …

android开发教程视频,android组件化和插件化

第一阶段&#xff1a;Android 基础知识回顾&#xff1a; 回顾Android 开发编程&#xff0c;深入理解Android系统原理和层次结构&#xff0c;深入分析Handler源码和原理&#xff1b;回顾Java&#xff0c;C/C&#xff0c;Kotlin、dart 在Android开发中必用的语言&#xff0c;熟悉…

Python中的collections模块

Python中的collections模块 文章目录 Python中的collections模块1.Counter对象2.deque对象3.defaultdict对象4.namedtuple5.OrderedDictReference Python中的 collections提供许多容器数据类型&#xff0c;这个模块实现了一些专门化的容器&#xff0c;提供了对Python的通用内建…

算法学习03:前缀和与差分(互逆)

算法学习03&#xff1a;前缀和与差分&#xff08;互逆&#xff09; 文章目录 算法学习03&#xff1a;前缀和与差分&#xff08;互逆&#xff09;前言一、前缀和1.一维2.二维 二、差分1.一维在这里插入图片描述2.二维在这里插入图片描述 ![在这里插入图片描述](https://img-blog…

YoloV7改进策略:主干网络改进|MogaNet——高效的多阶门控聚合网络

文章目录 摘要论文:《MogaNet——高效的多阶门控聚合网络》1、简介2、相关工作2.1、视觉Transformers2.2、ViT时代的卷积网络3、从多阶博弈论交互的角度看表示瓶颈4、方法论4.1、MogaNet概述4.2、多阶门控聚合4.3、通过通道聚合进行多阶特征重新分配4.4、实现细节5、实验5.1、…

LeetCode 2368.受限条件下可到达节点的数目:搜索 + 哈希表

【LetMeFly】2368.受限条件下可到达节点的数目&#xff1a;搜索 哈希表 力扣题目链接&#xff1a;https://leetcode.cn/problems/reachable-nodes-with-restrictions/ 现有一棵由 n 个节点组成的无向树&#xff0c;节点编号从 0 到 n - 1 &#xff0c;共有 n - 1 条边。 给…