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实现批量重命名文件的代码
May 25 Python
python计算圆周率pi的方法
Jul 11 Python
django admin添加数据自动记录user到表中的实现方法
Jan 05 Python
Python cookbook(数据结构与算法)保存最后N个元素的方法
Feb 13 Python
使用PM2+nginx部署python项目的方法示例
Nov 07 Python
pandas读取CSV文件时查看修改各列的数据类型格式
Jul 07 Python
python之拟合的实现
Jul 19 Python
python 循环数据赋值实例
Dec 02 Python
用60行代码实现Python自动抢微信红包
Feb 04 Python
python 如何用terminal输入参数
May 25 Python
anaconda python3.8安装后降级
Jun 11 Python
Python使用永中文档转换服务
May 06 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
Ubuntu VPS中wordpress网站打开时提示”建立数据库连接错误”的解决办法
2016/11/03 PHP
PHP符合PSR编程规范的实例分享
2016/12/21 PHP
PHP递归删除多维数组中的某个值
2017/04/17 PHP
php制作圆形用户头像的实例_自定义封装类源代码
2017/09/18 PHP
PHP通过bypass disable functions执行系统命令的方法汇总
2018/05/02 PHP
AlertBox 弹出层信息提示框效果实现步骤
2010/10/11 Javascript
简单实例处理url特殊符号&处理(2种方法)
2013/04/02 Javascript
window.showModalDialog参数传递中含有特殊字符的处理方法
2013/06/06 Javascript
前台js调用后台方法示例
2013/12/02 Javascript
jquery自定义滚动条插件示例分享
2014/02/21 Javascript
一个不错的仿携程自定义数据下拉选择select
2014/09/01 Javascript
简介JavaScript中POSITIVE_INFINITY值的使用
2015/06/05 Javascript
第三篇Bootstrap网格基础
2016/06/21 Javascript
require简单实现单页应用程序(SPA)
2016/07/12 Javascript
AngularJs bootstrap搭载前台框架——基础页面
2016/09/01 Javascript
Bootstrap对话框使用实例讲解
2016/09/24 Javascript
JS数组操作中的经典算法实例讲解
2017/07/26 Javascript
js禁止浏览器页面后退功能的实例(推荐)
2017/09/01 Javascript
VueJS事件处理器v-on的使用方法
2017/09/27 Javascript
vue父组件点击触发子组件事件的实例讲解
2018/02/08 Javascript
Bootstrap fileinput 上传新文件移除时触发服务器同步删除的配置
2018/10/08 Javascript
微信小程序实现的点击按钮 弹出底部上拉菜单功能示例
2018/12/20 Javascript
云服务器部署Node.js项目的方法步骤(小白系列)
2020/03/23 Javascript
element中的$confirm的使用
2020/04/26 Javascript
js用正则表达式筛选年月日的实例方法
2021/01/04 Javascript
编写自定义的Django模板加载器的简单示例
2015/07/21 Python
python 实现查找文件并输出满足某一条件的数据项方法
2019/06/12 Python
python内置函数sorted()用法深入分析
2019/10/08 Python
史蒂夫·马登加拿大官网:Steve Madden加拿大
2017/11/18 全球购物
2014基层党员干部学习全国两会心得体会
2014/03/17 职场文书
搞笑车尾标语
2014/06/23 职场文书
出国签证在职证明
2014/09/20 职场文书
呼兰河传读书笔记
2015/06/30 职场文书
新郎父母婚礼致辞
2015/07/27 职场文书
2020年元旦晚会策划书模板
2019/12/30 职场文书
TensorFlow的自动求导原理分析
2021/05/26 Python