首页 > 编程语言 >Python 爬取人人视频

Python 爬取人人视频

时间:2022-12-28 17:31:51浏览次数:40  
标签:vod 视频 get Python chunk 爬取 url re response

hello,小伙伴们,又见面了,距离上一次发布文章的时间,也算是久别重逢了。期间也发生了很多的事情,导致博文断更,也是笔者不愿意的,但是确实是比较忙,不再过多赘述,希望大家能够体谅。


平时不断的在后台收到小伙伴的私信,问是不是不更了,答案当然是否定的,有着这么多人的支持,小编还是要继续努力下去的,再次谢谢大家的支持。


是分享一些爬取数据,图片,音乐,还没怎么分享过爬取过视频的,那么想要爬取视频的话该怎么爬取呢?


其实不管是图片,还是音乐,或者是其他的文档,大部分都是一个文件读写的过程,当然视频也不例外,只是文件的格式不同而已。所以我们也可以试着以常规的手段去尝试下爬取视频,没错还是熟悉的套路与配方,即python常用函数 open() 和 write()。


不过这次略微不同的是我们会使用到 iter_content 来获取请求的原始响应数据,普通情况可以用 r.raw,在初始请求中设置 stream=True ,来获取服务器的原始套接字响应,在这里我们使用 iter_content 更加方便一些,因为requests.get(url) 默认是下载在内存中的,下载完成才存到硬盘上,但Response.iter_content 可以边下载边存硬盘中,所以在这视频下载方面更具有优势。


当然说到 iter_content 的话,不得不提下 chunk_size,因为流式请求就是像流水一样,不是一次过来而是一点一点“流”过来。处理流式数据也是一点一点处理。


而chunk_size会直接返回从当前位置往后读取 chunk_size 大小的文件内容,且迭代响应数据。这避免了立即将内容读入内存以获得较大的响应。chunk_size是它应该读入内存的字节数。chunk_size的类型必须是int或None。None的值将根据流的值发挥不同的作用。


做了引荐与讲解后,那么就开始上我们的主菜了,即目标网站:

https://m.rr.tv/


介于代码偏基础化,且主要知识点做过分析就直接上代码了,具体请看代码:


单线程:

import requests
import json
import re
import os
headers = {
'Referer':'https://m.rr.tv/',#全局设置
'User-Agent':'Mozilla/5.0 (Linux; Android 11; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.91 Mobile Safari/537.36'
}
ep_list =[]
vod_list = []
def get_vod(url):
response = requests.get(url = url,headers = headers)#请求url
ep= re.compile(r'sid:"(.*?)",')#提取ep链接
ep_list = re.findall(ep,response.text)
vod= re.compile(r'data:\[{id:(.*?),title:"')#提取vod链接
vod_list = re.findall(vod,response.text)
vod= re.compile(r',title:"(.*?)",desc:"')#提取视频标题
vod_name = re.findall(vod,response.text)
ep = 1
os.mkdir('./'+vod_name[0])#创建视频保存目录
for i in ep_list:
print("开始下载"+vod_name[0]+"第"+str(ep)+"集")
url ="https://web-api.rr.tv/web/drama/play?webChannel=M_STATION&dramaId="+vod_list[0]+"&episodeId="+i+"&2-7-17xx"#拼接地址
response = requests.get(url = url,headers = headers)#下载请求
r = requests.get(str(json.loads(response.text)['data']['url']), stream=True)#解析出下载链接并发起下载请求
f = open("./"+vod_name[0]+"/第"+str(ep)+"集.MP4", "wb")#保存视频
for chunk in r.iter_content(chunk_size=512):
if chunk:
f.write(chunk)
ep = ep+1
if __name__ == '__main__':
url='https://m.rr.tv/detail/xxxxxx?snum=1&episode=1'#目标视频链接
get_vod(url)


多线程:

import requests
import json
import re
import os
from concurrent.futures import ThreadPoolExecutor
headers = {
'Referer':'https://m.rr.tv/',#全局设置
'User-Agent':'Mozilla/5.0 (Linux; Android 11; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.91 Mobile Safari/537.36'
}
vod_list = []#存储视频链接
vod_name = []#存储视频标题
get_down_url =[]#存储下载直链
def get_vod(url):
response = requests.get(url = url,headers = headers)#请求url
vod_list.append(re.findall(re.compile(r'data:\[{id:(.*?),title:"'),response.text)[0])#找找视频链接
vod_name.append(re.findall(re.compile(r',title:"(.*?)",desc:"'),response.text)[0])#找找视频标题
for i in re.findall(re.compile(r'{sid:"(.*?)",key:'),response.text):
url ="https://web-api.rr.tv/web/drama/play?webChannel=M_STATION&dramaId="+vod_list[0]+"&episodeId="+i+"&2-7-17xx"#拼接地址
response = requests.get(url = url,headers = headers)
get_down_url.append(str(json.loads(response.text)['data']['url']))#拿下载直链进list
def down_begin(url,i):
print("开始多线程下载"+vod_name[0]+"第"+str(i)+"集")
r = requests.get(url = url,headers = headers)#下载请求
f = open("./"+vod_name[0]+"/第"+str(i)+"集.MP4", "wb")#保存视频
for chunk in r.iter_content(chunk_size=512):
if chunk:
f.write(chunk)
if __name__ == '__main__':
url='https://m.rr.tv/detail/xxxxx?snum=1&episode=1'#进入rr.tv自行获取
get_vod(url)
os.mkdir('./'+vod_name[0])#创建视频保存目录
with ThreadPoolExecutor(10) as f:#这里写多线程参数,适合几十集的电视剧使用
for i,url in enumerate(get_down_url):
i=int(i)+1
f.submit(down_begin,url = url,i=i)



标签:vod,视频,get,Python,chunk,爬取,url,re,response
From: https://blog.51cto.com/u_15924937/5975845

相关文章

  • Python爬取快手博主所有视频
    随着互联网经济的快速发展和自媒体行业的普及,越来越多的视频创作者加入了短视频平台,不仅快速的推动了短视频平台行业的发展,也给大众带来了更多新鲜有趣的知识和内容。据最新......
  • sublime安装REPL无法执行python3.7版本
    一、下载sublime最新版本地址:SublimeText-TextEditing,DoneRight单击DOWNLOADFORWINDOWS需要等一会儿自己就下载了。  安装就是下一步就可以了。二、安装......
  • python 使用thread多线程执行耗时代码
    python使用thread多线程执行耗时代码1、引入所需要的包importqueueimportthreadingimporttraceback2、定义线程类:classThreadService(threading.Thread):  de......
  • Python对象的比较和拷贝
    Python对象的比较和拷贝本文内容存在主观理解,详细请查阅官网文档比较(==VSis)==操作符是比较对象的值是否相等,而is比较的事对象的身份标识是否相等,即它们是否是同一......
  • tensorflow_probability.python.bijectors的一些使用
      网上见到一个TensorFlow的代码,没见过这个形式的,是概率编程的代码:#coding=utf-8#Copyright2020TheTF-AgentsAuthors.##LicensedundertheApacheLicens......
  • python中global 和 nonlocal 的作用域
    python引用变量的顺序: 当前作用域局部变量->外层作用域变量->当前模块中的全局变量->python内置变量。一globalglobal关键字用来在函数或其他局部作用域中使用全局变量。......
  • 【leetcode】3: 无重复字串的最长子串(python)
    给定一个字符串s,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1:输入:s="abcabcbb"输出:3解释:因为无重复字符的最长子串是"abc",所以其长度为3......
  • [oeasy]python0033_回车_carriage_return_figlet_字体变大
    回到开头回忆上次内容进程前后台切换<kbd>ctrl</kbd>+<kbd>z</kbd>把当前进程切换到后台并暂停​​jobs​​查看所有作业用​​fg​​可以把后台进程再切回前台​​......
  • python logging配置
    python中,logging由logger,handler,filter,formater四个部分组成。logger是提供我们记录日志的方法;handler是让我们选择日志的输出地方,如:控制台,文件,邮件发送等,一个logger添加......
  • python中的mysql操作教程及实例
    一.数据库在自动化测试中的应用存测试数据有的时候大批量的数据,我们需要存到数据库中,在测试的时候才能用到,测试的时候就从数据库中读取出来。这点是非常重要的!存测试结......