网页视频抓取脚本(爬虫测试样例序言)
优采云 发布时间: 2021-09-29 13:04网页视频抓取脚本(爬虫测试样例序言)
pip3安装请求
试样
此外,序言中还有16段视频。我们使用Python爬虫技术在本地批量下载它们
#/?vid=0
直链
首先,我们需要获得视频下载直链。右击选中,可以直接看到视频的直链
再看一下页面的源代码,发现缺少视频直链。视频直链的原创位置已成为JS脚本
如果我们直接使用请求库来请求URL,我们会得到源代码,但是源代码中没有视频直接链接,所以我们应该考虑改变我们的想法。为什么视频直链的位置被JS取代
当有更多的爬虫程序时,您将知道这是网页的动态加载。必须有一个JS文件来存储视频的直链。然后,每次加载网页时,通过JS脚本将视频的直链动态加载到HTML中
点击网络,过滤JS文件,找到三个JS文件。让我们看看第一个JS文件中是否有视频直链。搜索视频的标题,直接查找视频的直链,并找到视频的所有直链都保存到名为lesson_uuuList的文件中
第一课所有视频名称和视频直接链接信息都保存在列表中。为统一起见,序言改为第0节
#lesson_uuList.py
课程列表=[{
“名称”:“第0节vue.js简介”
“url”:“
“询问”:“77367”
},{
“名称”:“第1节安装和部署”
“url”:“
“询问”:“77369”
},{
“名称”:“第2节创建第一个Vue应用程序”
“url”:“
“询问”:“77370”
},{
“名称”:“第3节数据和方法”
“url”:“
“询问”:“77372”
},{
“名称”:“第4节生命周期”
“url”:“
“询问”:“77373”
},{
“名称”:“第5节模板语法-插值”
“url”:“
“询问”:“77375”
},{
“名称”:“第6节模板语法-说明”
“url”:“
“询问”:“77376”
},{
“名称”:“第7节装订类别和样式”
“url”:“
“询问”:“77377”
},{
“名称”:“第8节条件呈现”
“url”:“
“询问”:“77378”
},{
“名称”:“第9节列表呈现”
“url”:“
“询问”:“77380”
},{
“名称”:“第10节事件绑定”
“url”:“
“询问”:“77381”
},{
“名称”:“第11节表单输入绑定”
“url”:“
“询问”:“77382”
},{
“名称”:“第12节组件基础”
“url”:“
“询问”:“77383”
},{
“名称”:“第13节部件注册”
“url”:“
“询问”:“78520”
},{
“名称”:“第14节单文件组件”
“url”:“
“询问”:“78521”
},{
“名称”:“第15节无终端开发Vue应用程序”
“url”:“
“询问”:“81004”
}]
批量下载
在这里,使用for循环遍历每个下载链接,然后使用之前编写的多线程下载程序进行下载
从concurrent.futures导入ThreadPoolExecutor
从课程列表导入课程列表
从请求导入获取,头部
导入时间
类下载器:
定义初始化(self,url,num,name):
self.url=url
self.num=num
self.name=名称
self.getsize=0
r=头(self.url,allow_redirects=True)
self.size=int(r.headers['Content-Length'])
def下降(自身、开始、结束、块大小=10240):
headers={'range':f'bytes={start}-{end}
r=get(self.url,headers=headers,stream=True)
将open(self.name,“rb+”)作为f:
f、 搜索(开始)
对于r.iter\u内容中的块(块大小):
f、 写入(块)
self.getsize+=块大小
def主(自):
开始时间=time.time()
f=打开(self.name,“wb”)
f、 截断(自身大小)
f、 关闭()
tp=线程池执行器(最大工作线程数=self.num)
期货=[]
开始=0
对于范围内的i(self.num):
end=int((i+1)/self.num*self.size)
future=tp.submit(self.down、start、end)
futures.append(未来)
开始=结束+1
尽管如此:
进程=self.getsize/self.size*100
last=self.getsize
时间。睡眠(1)
curr=self.getsize
向下=(当前最后一次)/1024
如果下降>;1024:
速度=f'{down/1024:6.2f}MB/s'
其他:
速度=f'{down:6.2f}KB/s'
打印(f'process:{process:6.2f}%|速度:{speed}',end='r')
如果流程>;=100:
打印(进程:{100.00:6}%|速度:00.00KB/s',结束=“|”)
中断
结束时间=time.time()
总时间=结束时间-开始时间
平均速度=自身大小/总时间/1024/1024
打印(f'总时间:{总时间:{0f}s}平均速度:{平均速度:{2f}MB/s')
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
对于课程列表中的课程:
url=课程['url']
名称=课程['name']
down=downloader(url,8,name+'.mp4')
down.main()
结果打印
在56秒内下载了16个视频,总计339mb
进程:100.0%|速度:00.00KB/s |总时间:2s |平均速度:47MB/s
进程:100.0%|速度:00.00KB/s |总时间:3s |平均速度:6.62MB/s
进程:100.0%|速度:00.00KB/s |总时间:3s |平均速度:72MB/s
进程:100.0%|速度:00.00KB/s |总时间:4s |平均速度:72MB/s
进程:100.0%|速度:00.00KB/s |总时间:4s |平均速度:85MB/s
进程:100.0%|速度:00.00KB/s |总时间:7s |平均速度:7.01MB/s
进程:100.0%|速度:00.00KB/s |总时间:3s |平均速度:4.65MB/s
进程:100.0%|速度:00.00KB/s |总时间:4s |平均速度:69MB/s
进程:100.0%|速度:00.00KB/s |总时间:3s |平均速度:88MB/s
进程:100.0%|速度:00.00KB/s |总时间:4s |平均速度:5.01MB/s
进程:100.0%|速度:00.00KB/s |总时间:3s |平均速度:6.60MB/s
进程:100.0%|速度:00.00KB/s |总时间:4s |平均速度:6.20MB/s
进程:100.0%|速度:00.00KB/s |总时间:3s |平均速度:96MB/s
进程:100.0%|速度:00.00KB/s |总时间:2s |平均速度:64MB/s
进程:100.0%|速度:00.00KB/s |总时间:3s |平均速度:6.02MB/s
进程:100.0%|速度:00.00KB/s |总时间:4s |平均速度:80MB/s
总结与展望
有时候视频或图片的直接链接不一定需要爬网,可能在网页上加载的JS文件中就可以找到,既然可以直接找到,为什么要爬网呢?那么下载的时候一定要使用多线程,因为多线程可以占用宽带,全速下载