Python+Requests+异步线程池爬取视频到本地
1、本次项目为获取梨视频中的视频,再使用异步线程池下载视频到本地
2、获取视频时,其地址中的Url是会动态变化,不播放时src值为图片的地址,播放时src值为mp4格式


3、查看视频链接是否存在ajax,果然是存在的,但是返回的Url与真实的MP4地址存在部分不一致,此时需要使用字符串替换

4、获取到真实的mp4视频地址后,再使用二进制流的方式进行下载到本地
5、使用Pool(4),四个线程池进行异步下载,互不干扰
6、源码如下:
import os
import requests
from lxml import etree
import random
import re
#安装fake-useragent库:pip install fake-useragent
from fake_useragent import UserAgent
#导入线程池模块
from multiprocessing.dummy import Pool
# 新建文件存储视频
if not os.path.exists('./threadFile'):
os.makedirs('./threadFile')
session = requests.Session()
# 存储所有视频的Url及标题
video_urls = []
# 梨视频Url
url = 'https://www.pearvideo.com/'
UA = UserAgent().random
headers = {
'User-Agent':UA
}
# 获取首页页面数据
page_text = session.get(url=url,headers=headers).text
#对获取的首页页面数据中的相关视频详情链接进行解析
tree = etree.HTML(page_text)
li_list = tree.xpath('//*[@id="vervideoTlist"]/div/ul/li')
for li in li_list:
# 视频详情页的Url
detail_url = 'https://www.pearvideo.com/'+li.xpath('./div/a/@href')[0]
# 视频详情页的Title
detail_title = li.xpath('./div/a/div[2]/div[2]/text()')[0]+'.mp4'
page_text = session.get(url=detail_url,headers=headers).text
# 字符串切割为value值
value = str("".join(li.xpath('./div/a/@href')[0]).split('_')[-1])
# 由于存在ajax则使用新的请求地址
headers_new = {
'User-Agent': UA,
'Referer': 'https://www.pearvideo.com/video_{}'.format(value)
}
detail_url_new = "https://www.pearvideo.com/videoStatus.jsp?contId={}&mrd={}".format(value,float(random.random()))
detail_text = session.get(url=detail_url_new,headers=headers_new)
url = detail_text.json()['videoInfo']['videos']['srcUrl']
ER = '//(.*?)-'
list_url= re.findall(ER,url)
for url1 in list_url:
if url1.split('/')[-1] in url:
url = url.replace(url1.split('/')[-1],'cont-{}'.format(value))
else:
print('替换失败')
dic = {
"url":url,
"title":detail_title
}
video_urls.append(dic)
# 对视频链接发起请求获取视频的二进制数据,然后将视频数据返回
def get_video(dic):
print(dic['title'],'正在下载....')
page_content = session.get(url=dic['url'],headers=headers).content
fileName = './threadFile/'+dic['title']
# 持久化存储数据
with open(fileName,'wb') as fp:
fp.write(page_content)
print(dic['title'], '下载完成!!!')
#实例化线程池对象
# 使用线程池对视频数据进行请求(较为耗时阻塞的操作)
pool = Pool(4)
pool.map(get_video,video_urls)
# 关闭线程池
pool.close()
pool.join()
7、下载本地

Python+Requests+异步线程池爬取视频到本地的更多相关文章
- 基于requests模块的cookie,session和线程池爬取
目录 基于requests模块的cookie,session和线程池爬取 基于requests模块的cookie操作 基于requests模块的代理操作 基于multiprocessing.dummy ...
- 使用requests、BeautifulSoup、线程池爬取艺龙酒店信息并保存到Excel中
import requests import time, random, csv from fake_useragent import UserAgent from bs4 import Beauti ...
- 使用requests、re、BeautifulSoup、线程池爬取携程酒店信息并保存到Excel中
import requests import json import re import csv import threadpool import time, random from bs4 impo ...
- Python爬取视频指南
摘自:https://www.jianshu.com/p/9ca86becd86d 前言 前两天尔羽说让我爬一下菜鸟窝的教程视频,这次就跟大家来说说Python爬取视频的经验 正文 https://w ...
- py3+requests+re+urllib,爬取并下载不得姐视频
实现原理及思路请参考我的另外几篇爬虫实践博客 py3+urllib+bs4+反爬,20+行代码教你爬取豆瓣妹子图:http://www.cnblogs.com/UncleYong/p/6892688. ...
- python day 20: 线程池与协程,多进程TCP服务器
目录 python day 20: 线程池与协程 2. 线程 3. 进程 4. 协程:gevent模块,又叫微线程 5. 扩展 6. 自定义线程池 7. 实现多进程TCP服务器 8. 实现多线程TCP ...
- Python爬虫:为什么你爬取不到网页数据
前言: 之前小编写了一篇关于爬虫为什么爬取不到数据文章(文章链接为:Python爬虫经常爬不到数据,或许你可以看一下小编的这篇文章), 但是当时小编也是胡乱编写的,其实里面有很多问题的,现在小编重新发 ...
- Python网络爬虫与如何爬取段子的项目实例
一.网络爬虫 Python爬虫开发工程师,从网站某一个页面(通常是首页)开始,读取网页的内容,找到在网页中的其它链接地址,然后通过这些链接地址寻找下一个网页,这样一直循环下去,直到把这个网站所有的网页 ...
- 进程池爬取并存入mongodb
设置进程池爬取拉钩网: # coding = utf- import json import pymongo import pandas as pd import requests from lxml ...
随机推荐
- Anchor Boxes示例实战
Anchor Boxes示例实战 目标检测算法通常对输入图像中的大量区域进行采样,判断这些区域是否包含感兴趣的目标,并调整这些区域的边缘,以便更准确地预测目标的真实边界框.不同的模型可能使用不同的区域 ...
- 适用于Windows和Linux的Yolo-v3和Yolo-v2(下)
适用于Windows和Linux的Yolo-v3和Yolo-v2(下) 如何训练(检测自定义对象): (培养老YOLO V2 yolov2-voc.cfg,yolov2-tiny-voc.cfg,yo ...
- 菜鸟刷题路:剑指 Offer 09. 用两个栈实现队列
剑指 Offer 09. 用两个栈实现队列 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的 ...
- Atcoder rc122-c Calculator 斐波那契
传送门 题解 先说结论: 任意正整数可以拆分成若干个斐波那契数 斐波那契数列: 1 1 2 3 5 8 13 21 34 例 17 = 13 + 3 + 1 看上去是对的,怎么证明呢? 首先假如每一个 ...
- 「题解」300iq Contest 2 B Bitwise Xor
本文将同步发布于: 洛谷博客: csdn: 博客园: 简书. 题目 题目链接:gym102331B. 题意概述 给你一个长度为 \(n\) 的序列 \(a_i\),求一个最长的子序列满足所有子序列中的 ...
- Java8 中使用Stream 让List 转 Map使用总结
在使用 Java 的新特性 Collectors.toMap() 将 List 转换为 Map 时存在一些不容易发现的问题,这里总结一下备查. 空指针风险 java.lang.NullPointerE ...
- HTTP客户端连接,选择HttpClient还是OkHttp?
为什么会写这篇文章,起因于和朋友的聊天 这又触及到我的知识盲区了,首先来一波面向百度学习,直接根据关键字httpclient和okhttp的区别.性能比较进行搜索,没有找到想要的答案,于是就去over ...
- 从架构师角度谈谈mybatis-plus可能存在的问题
存在这么一个情况:对于缺营养的人来说,医生更倾向于建议他选择纯牛奶,而不是有机奶(因其有添加剂).然而,大部分人却更加倾向于选择有机奶, 因其口感不错,因此,对于选择纯牛奶还是有机奶,这是个博弈问题. ...
- UBoot的编译与烧写
每当我们学习任何编译语言之前,第一节课都是介绍我们要学习的是什么,以及编译语言和工具,最后写一个小程序编译并运行就算入门,也就是所谓的"Hello, world!".这里也不例外, ...
- linux 下安装 docker 环境
一分钟了解 Docker Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源.Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然 ...