Python爬取人人视频

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 requestsimport jsonimport reimport osheaders = {Referer:,#全局设置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)#请求urlep= re.compile(rsid:"(.*?)",)#提取ep链接ep_list = re.findall(ep,response.text)vod= re.compile(rdata:\[{id:(.*?),title:")#提取vod链接vod_list = re.findall(vod,response.text)vod= re.compile(r,title:"(.*?)",desc:")#提取视频标题vod_name = re.findall(vod,response.text)ep = 1os.mkdir(./+vod_name[0])#创建视频保存目录for i in ep_list:print("开始下载"+vod_name[0]+"第"+str(ep)+"集")url ="?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+1if __name__ == __main__:url=detail/xxxxxx?snum=1&episode=1#目标视频链接get_vod(url)

多线程:

import requestsimport jsonimport reimport osfrom concurrent.futures import ThreadPoolExecutorheaders = {Referer:,#全局设置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)#请求urlvod_list.append(re.findall(re.compile(rdata:\[{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 ="?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]))#拿下载直链进listdef 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=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)+1f.submit(down_begin,url = url,i=i)

把案例里面的链接改成你想要下载的链接,然后右击运行代码,即可成功的下载你想要的视频了。代码获取后台回复:”人人视频“。

在文章的最后给大家来一波福利,因为前一段时间小编在爬取百度相关关键词以及文章采集时,经常触发百度的验证机制,这种情况很明显要使用到代理IP,后来群里一个小伙伴推荐了品赞代理IP,小编测试了下,完美解决了爬取中存在的问题。

如果大家后续有需要使用到代理方面的业务的话,可以扫码添加下方的二维码。国内外的IP都有,新用户可以免费测试。

            号:pinzankeji

以上就是今天给大家分享的内容,更多精品教程请关注SpiderBy,回复“Python教程”,即可获取*智基础+就业班课程。