Python爬取梨视频的示例


Posted in Python onJanuary 29, 2021

爬取流程(美食区最热标签下的三个视频)

  1. 在首页获取视频的编号和名字
  2. 拼接成正确的url
  3. 保存视频

思路

1.从网页中获取视频的url

Python爬取梨视频的示例

发现视频的url在id为“JprismPlayer”的div标签下的video标签src属性中,xpath解析网页

video_url = tree.xpath("//div[@id='JprismPlayer']/video/@src")

但得到的返回值为空,也就是说这个video标签在原网页中并不存在,很可能是动态加载出来的

2. 从动态请求获取视频的url

Python爬取梨视频的示例

果然在动态请求中发现了包含视频url的json数据

Python爬取梨视频的示例

可是发起请求后拿到的json数据却和抓包工具中看到的不一样,试着在请求头中加入Referer参数,查看referer可以发现,它最后video_后面跟的是首页中视频的编号

Python爬取梨视频的示例

{
	"resultCode":"1",
	"resultMsg":"success", "reqId":"fd1c910d-f49a-431a-b9a4-9c193c3c1983",
	"systemTime": "1611666178518",
	"videoInfo":{"playSta":"1","video_image":"https://image1.pearvideo.com/cont/20210125/11107897-184717-1.png","videos":{"hdUrl":"","hdflvUrl":"","sdUrl":"","sdflvUrl":"","srcUrl":"https://video.pearvideo.com/mp4/third/20210125/1611666178518-11107897-181816-hd.mp4"}}
}

在headers中加入Referer后顺利拿到json数据

Python爬取梨视频的示例

可向json数据中的视频url发起请求拿到的却是404页面

3. 拼接正确的url

这里花了很长时间去想哪里有问题,把前面的步骤理了很多遍才发现,其实动态请求返回的json数据中的视频url和主页video标签中的视频url根本不一致

Python爬取梨视频的示例

首页中加载出来的视频链接是正确的,可以顺利的拿到视频,而json数据中的链接则会返回404。把他们进行对比,可以看到他们前半部分是一样的,但到了红线框住的地方就不一样了。
正确的url是 cont-视频id-
而json数据中的url这个部分是 一串数字
那只要把这一串数字改成 cont-视频id- 的形式就能获得正确的视频url了

代码

# 爬取梨视频

import requests
from lxml import etree
import os
from multiprocessing import Pool

# 梨视频首页url
url = "https://www.pearvideo.com/category_6"
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36'
  }

# 获取响应,并用etree解析
response = requests.get(url=url, headers=headers).text
tree = etree.HTML(response)

# 拿到视频的名字和视频号
video_id_list = tree.xpath("//ul[@class='listvideo-list clearfix']/li[@class='categoryem ']//a[@class='vervideo-lilink actplay']/@href")
video_name_list = tree.xpath("//ul[@class='listvideo-list clearfix']/li[@class='categoryem ']//a/div[@class='vervideo-title']/text()")
data_list = [{"name": video_name_list[i], "idNum": video_id_list[i][6:]} for i in range(len(video_name_list))]

# 创建一个存放视频的文件夹
if not os.path.exists("./videos"):
  os.mkdir("./videos")

# 获取视频的函数
def down_video(data):
  name = data['name']
  idNum = data['idNum']

  # 获取视频需要的headers,注意这里的Referer要和视频的id匹配
  headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36',
    'Referer': f'https://www.pearvideo.com/video_{idNum}'
  }
  # 获取接近真正视频url的url,这里的id也需要和视频id匹配才行
  url = f'https://www.pearvideo.com/videoStatus.jsp?contId={idNum}'

  # 得到包含视频地址json响应数据
  response = requests.get(url=url, headers=headers).json()
  video_url = response["videoInfo"]["videos"]["srcUrl"]

  # 将视频地址中的数字替换成 cont-视频编号 拿到真正的视频地址
  video_url = video_url.replace(video_url.split("/")[-1].split("-")[0], "cont-" + idNum)

  # 拿到视频并保存
  video = requests.get(url=video_url, headers=headers).content
  with open(f"./videos/{name}.mp4", "wb") as f:
    print(f"正在下载视频 {name} ...")
    f.write(video)
    print(f"视频 {name} 下载完成!")

if __name__ == '__main__':
  # 创建进程池并使用
  pool = Pool(3)
  pool.map(down_video, data_list)
  pool.close()
  pool.join()

总结

其实最难的地方是获取正确的视频url,中间过程比较绕。只要找到这个地址,再加上从首页拿到的视频id就可以顺利拿到视频了。
如果要爬取整个首页视频只需要重新设置xpath路径就可以了。

以上就是Python爬取梨视频的示例的详细内容,更多关于Python爬取梨视频的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python中给List添加元素的4种方法分享
Nov 28 Python
用Python创建声明性迷你语言的教程
Apr 13 Python
基于Django模板中的数字自增(详解)
Sep 05 Python
Python实现中一次读取多个值的方法
Apr 22 Python
PyCharm鼠标右键不显示Run unittest的解决方法
Nov 30 Python
python 通过类中一个方法获取另一个方法变量的实例
Jan 22 Python
python函数局部变量、全局变量、递归知识点总结
Nov 15 Python
tensorflow模型的save与restore,及checkpoint中读取变量方式
May 26 Python
Python grpc超时机制代码示例
Sep 14 Python
Python中qutip用法示例详解
Oct 02 Python
Pycharm创建python文件自动添加日期作者等信息(步骤详解)
Feb 03 Python
python三子棋游戏
May 04 Python
使用Python封装excel操作指南
Jan 29 #Python
用OpenCV进行年龄和性别检测的实现示例
Jan 29 #Python
python使用numpy中的size()函数实例用法详解
Jan 29 #Python
Python机器学习工具scikit-learn的使用笔记
Jan 28 #Python
K近邻法(KNN)相关知识总结以及如何用python实现
Jan 28 #Python
Python3中对json格式数据的分析处理
Jan 28 #Python
Python实现微信表情包炸群功能
Jan 28 #Python
You might like
windows下升级PHP到5.3.3的过程及注意事项
2010/10/12 PHP
PHP基础学习之流程控制的实现分析
2013/04/28 PHP
Yii 2.0中场景的使用教程
2017/06/02 PHP
比较简单实用的使用正则三种版本的js去空格处理方法
2007/11/18 Javascript
firefox浏览器下javascript 拖动层效果与原理分析代码
2007/12/04 Javascript
如何使用jquery控制CSS样式,并且取消Css样式(如背景色,有实例)
2013/07/09 Javascript
javascript 按键事件(兼容各浏览器)
2013/12/20 Javascript
PHP 数组current和next用法分享
2015/03/05 Javascript
JavaScript每天定时更换皮肤样式的方法
2015/07/01 Javascript
深入JavaScript高级程序设计之对象、数组(栈方法,队列方法,重排序方法,迭代方法)
2015/12/01 Javascript
JavaScript生成.xls文件的代码
2016/12/22 Javascript
Angular 2父子组件数据传递之局部变量获取子组件其他成员
2017/07/04 Javascript
bootstrap table表格客户端分页实例
2017/08/07 Javascript
vue-router权限控制(简单方式)
2018/10/29 Javascript
vue列表单项展开收缩功能之this.$refs的详解
2019/05/05 Javascript
Vue通过for循环随机生成不同的颜色或随机数的实例
2019/11/09 Javascript
[01:07:34]DOTA2-DPC中国联赛定级赛 RNG vs Aster BO3第二场 1月9日
2021/03/11 DOTA
Python语法快速入门指南
2015/10/12 Python
Python中正则表达式详解
2017/05/17 Python
python学生信息管理系统
2018/03/13 Python
python3如何将docx转换成pdf文件
2018/03/23 Python
Python GUI编程 文本弹窗的实例
2019/06/11 Python
Python实现隐马尔可夫模型的前向后向算法的示例代码
2019/12/31 Python
使用ITK-SNAP进行抠图操作并保存mask的实例
2020/07/01 Python
Pycharm无法打开双击没反应的问题及解决方案
2020/08/17 Python
python读取excel数据绘制简单曲线图的完整步骤记录
2020/10/30 Python
印度在线内衣和时尚目的地:Zivame
2017/09/28 全球购物
应届生幼儿园求职信
2013/11/12 职场文书
个人求职信范文分享
2014/01/06 职场文书
《李时珍夜宿古寺》教学反思
2014/04/09 职场文书
基于python的matplotlib制作双Y轴图
2021/04/20 Python
在JavaScript中如何使用宏详解
2021/05/06 Javascript
企业开发CSS命名BEM代码规范实践
2022/02/12 HTML / CSS
MySQL实现配置主从复制项目实践
2022/03/31 MySQL
SQL Server 中的事务介绍
2022/05/20 SQL Server
macos系统如何实现微信双开? mac登录两个微信以上微信的技巧
2022/07/23 数码科技