最近发现一些网站,可以解析各大视频网站的vip。仔细想了想,这也算是爬虫呀,爬的是视频数据。

首先选取一个视频网站,我选的是 影视大全 ,然后选择上映不久的电影 “一出好戏” 。

分析页面

我用的是chrome浏览器,F12进入查看。选择NetWork的Doc,发现主体部分的数据是从这个网站获取的。

在地址栏输入这个链接,跳转到了视频来源的播放页面。

当然,在这个页面就可以直接观看视频了,但是我们要把视频下载下来。

寻找视频文件

仍然是之前那个页面,在Other中,我们发现了一些奇怪的东西。

查一下,m3u8是个啥东西。

m3u8是苹果公司推出一种视频播放标准,是m3u的一种,不过 编码方式是utf-8,是一种文件检索格式,将视频切割成一小段一小段的ts格式的视频文件,然后存在服务器中(现在为了减少I/o访问次数,一般存在服务器的内存中),通过m3u8解析出来路径,然后去请求。

这下就清楚了,这就是我们要找的东西。

点击Response,查看这个.m3u8的文件。观察发现,.ts后缀的文件地址是有规律的。我们只需要下载所有的.ts后缀文件,然后把它们整合成一个文件即可。

合并.ts文件

命令行:“copy /b  F:\f\*.ts  E:\f\new.ts”。

执行该命令后,F:\f目录下的全部TS文件就被合并成一个new.ts文件了(你原来的那堆文件仍然存在)。

这里使用copy命令的文件合并功能进行ts文件的合并,copy后面的 /b  参数表示把文件按二进制格式来合并,如果不加这个参数,则会把目标当成文本文件来合并,并在文件内添加不必要的标记,这会导致播放出错,所以必须加 /b 参数。

编写脚本,下载.ts文件

from urllib import request
import urllib
from time import sleep
import socket class CatchVideo(object):
def __init__(self):
self.headers = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36"
self.url = "" def set_url(self, i):
if i < 1000:
self.url = "https://cdn.letv-cdn.com/20180811/YLDUgCD6/1000kb/hls/DtrOg2412%03d.ts" % i
else:
self.url = "https://cdn.letv-cdn.com/20180811/YLDUgCD6/1000kb/hls/DtrOg2412%04d.ts" % i # 获取并下载ts文件
def dl_ts(self, i):
rq = request.Request(self.url)
rq.add_header('User-Agent', self.headers)
response = request.urlopen(rq)
resread = response.read()
with open(str(i)+".ts", "wb") as f:
f.write(resread)
response.close()# 关闭urlopen方法,防止被ban def start_work(self):
for i in range(0, 1563+1):
self.set_url(i)
try:
self.dl_ts(i)
print(str(i) + ".ts success")
sleep(1)
except urllib.error.URLError as e:
print(e.reason)
break
except socket.timeout as e2:
print(e2.reason)
self.dl_ts(i) if __name__ == '__main__':
catch_video = CatchVideo()
socket.setdefaulttimeout(20)
catch_video.start_work()

运行过程中,出现了两次报错,分别是:

  • urllib.error.URLError :[WinError 10054]  远程主机强迫关闭了一个现有的连接
  • socket.timeout     read读取超时

解决办法:

  1.增加response.close,关闭urlopen方法。

  2.增加time.sleep,有一秒缓冲时间

  3.设置socket.setdefaulttimeout,给socket预留缓冲时间

还存在问题

实际运行过程中,脚本执行效率略低。之后会加入多线程,继续改进,增加运行效率。

参考博客:

https://blog.csdn.net/a33445621/article/details/80377424

https://blog.csdn.net/illegalname/article/details/77164521

更新代码,加入多进程

修改了start_work方法和主进程:

    def start_work(self, i):
self.set_url(i)
try:
self.dl_ts(i)
print(str(i) + ".ts success")
sleep(1)
except urllib.error.URLError as e:
print(e.reason)
self.dl_ts(i)
except socket.timeout as e2:
print(e2.reason)
self.dl_ts(i) if __name__ == '__main__':
catch_video = CatchVideo()
socket.setdefaulttimeout(20)# 设置socket层超时时间20秒
I = 0
while I < 1563+1:
# 5个进程并发运行
p_l = [Process(target=catch_video.start_work, args=(i,)) for i in range(I, I+5)]
for p in p_l:
p.start()
for p in p_l:
p.join()
I = I + 5

这里设置了5个进程同时运行,太多远程主机会拒绝请求。

OK,这样就能很快下载了。隔了几天终于想起来还有个电影没看,哈哈 ^_^

python爬取视频网站m3u8视频,下载.ts后缀文件,合并成整视频的更多相关文章

  1. python 爬取网络小说 清洗 并下载至txt文件

    什么是爬虫 网络爬虫,也叫网络蜘蛛(spider),是一种用来自动浏览万维网的网络机器人.其目的一般为编纂网络索引. 网络搜索引擎等站点通过爬虫软件更新自身的网站内容或其对其他网站的索引.网络爬虫可以 ...

  2. python爬取某个网站的图片并保存到本地

    python爬取某个网站的图片并保存到本地 #coding:utf- import urllib import re import sys reload(sys) sys.setdefaultenco ...

  3. 用Python爬取斗鱼网站的一个小案例

    思路解析: 1.我们需要明确爬取数据的目的:为了按热度查看主播的在线观看人数 2.浏览网页源代码,查看我们需要的数据的定位标签 3.在代码中发送一个http请求,获取到网页返回的html(需要注意的是 ...

  4. Python爬取B站耗子尾汁、不讲武德出处的视频弹幕

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 前言 耗子喂汁是什么意思什么梗呢?可能很多人不知道,这个梗是出自马保国,经常上网的人可能听说过这个 ...

  5. Python爬取某网站文档数据完整教程(附源码)

    基本开发环境 (https://jq.qq.com/?_wv=1027&k=NofUEYzs) Python 3.6 Pycharm 相关模块的使用 (https://jq.qq.com/?_ ...

  6. 利用Python爬取电影网站

    #!/usr/bin/env python #coding = utf-8 ''' 本爬虫是用来爬取6V电影网站上的电影资源的一个小脚本程序,爬取到的电影链接会通过网页的形式显示出来 ''' impo ...

  7. python爬取电影网站信息

    一.爬取前提1)本地安装了mysql数据库 5.6版本2)安装了Python 2.7 二.爬取内容 电影名称.电影简介.电影图片.电影下载链接 三.爬取逻辑1)进入电影网列表页, 针对列表的html内 ...

  8. Python爬取mn52网站美女图片以及图片防盗链的解决方法

    防盗链原理 http标准协议中有专门的字段记录referer 一来可以追溯上一个入站地址是什么 二来对于资源文件,可以跟踪到包含显示他的网页地址是什么 因此所有防盗链方法都是基于这个Referer字段 ...

  9. Python爬取招聘网站数据,给学习、求职一点参考

    1.项目背景 随着科技的飞速发展,数据呈现爆发式的增长,任何人都摆脱不了与数据打交道,社会对于“数据”方面的人才需求也在不断增大.因此了解当下企业究竟需要招聘什么样的人才?需要什么样的技能?不管是对于 ...

随机推荐

  1. php 处理微信账单

    最近要做支付对账,即检查第三方支付与数据库中账单是否一一对应,涉及到微信对账单的处理,微信账单接口返回为一个字符串类似如下结果: 交易时间,公众账号ID,商户号,子商户号,设备号,微信订单号,商户订单 ...

  2. 转:git 的常用命令

    转自:阮一峰 常用git命令清单 一般来说,日常使用只要记住下图6个命令,就可以了.但是熟练使用,恐怕要记住60-100个命令. 下面是我整理的常用 Git 命令清单.几个专用名词的译名如下. Wor ...

  3. 命令行参数技巧:__argc,__argv

    几个可以使用的全局变量: _CRTIMP extern int __argc; /* count of cmd line args */ _CRTIMP extern char ** __argv; ...

  4. Linux 进程与信号的概念和操作 linux process and signals

    进程 主要参考: http://www.bogotobogo.com/Linux/linux_process_and_signals.php 译者:李秋豪 信号与进程几乎控制了操作系统的每个任务. 在 ...

  5. springboot之静态资源路径配置

    静态资源路径是指系统可以直接访问的路径,且路径下的所有文件均可被用户直接读取. 在Springboot中默认的静态资源路径有:classpath:/META-INF/resources/,classp ...

  6. 使用ITextSharper小结

    用到了生成PDF版的合同,上网研究了一圈,发现不需要服务器端安装插件的,比较好用的就是这个ITextSharper了,于是便开始了研究. 1.解决汉字不显示的问题,指定一下字体,默认的字体好像不支持中 ...

  7. uiwebview与objective-c

    利用oc调用js很简单, 系统直接提供了方法stringByEvaluatingJavaScriptFromString [webView stringByEvaluatingJavaScriptFr ...

  8. 6.可见性关键字(volidate)

    可见性关键字(volidate): 如果对java内存模型了解较清楚的话,我们知道每个线程都会被分配一个线程栈. 线程栈里存的是对象的引用,但当前cache缓存机制,可能会把数据拷贝. 就是,命中缓存 ...

  9. 轻量ORM-SqlRepoEx (九)与Dapper共舞

    Dapper就另一个轻量ORM,Dapper及其扩展解决了数据访问端的大部门问题,提供了如数据事务管理.缓存等支持.SqlRepoEx的重点解决了Lambda转换成SQL语句,使SQL使用强类型编写, ...

  10. #leetcode刷题之路15-三数之和

    给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中不可以包含重复的三元组. ...