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采用Django开发自己的博客系统
Sep 29 Python
Python编程使用NLTK进行自然语言处理详解
Nov 16 Python
Python读取Excel表格,并同时画折线图和柱状图的方法
Oct 14 Python
matplotlib实现区域颜色填充
Mar 18 Python
Python + Flask 实现简单的验证码系统
Oct 01 Python
Pytorch Tensor基本数学运算详解
Dec 30 Python
TensorFlow设置日志级别的几种方式小结
Feb 04 Python
Python爬取新型冠状病毒“谣言”新闻进行数据分析
Feb 16 Python
Python基于模块Paramiko实现SSHv2协议
Apr 28 Python
python 调用Google翻译接口的方法
Dec 09 Python
pandas将list数据拆分成行或列的实现
Dec 13 Python
python Timer 类使用介绍
Dec 28 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
Display SQL Server Version Information
2007/06/21 Javascript
Javascript模块化编程(一)模块的写法最佳实践
2013/01/17 Javascript
动态添加option及createElement使用示例
2014/01/26 Javascript
JQUERY 设置SELECT选中项代码
2014/02/07 Javascript
jQuery.Highcharts.js绘制柱状图饼状图曲线图
2015/03/14 Javascript
javascript函数特点实例分析
2015/05/14 Javascript
JQuery复制DOM节点的方法
2015/06/11 Javascript
JavaScript中的跨浏览器事件操作的基本方法整理
2016/05/20 Javascript
微信小程序 教程之注册页面
2016/10/17 Javascript
Node.js 实现简单的接口服务器的实例代码
2017/05/23 Javascript
JavaScript数组排序reverse()和sort()方法详解
2017/12/24 Javascript
Vue.js 十五分钟入门图文教程
2018/09/12 Javascript
NodeJS模块与ES6模块系统语法及注意点详解
2019/01/04 NodeJs
JavaScript中常用的简洁高级技巧总结
2019/03/10 Javascript
原生js实现each方法实例代码详解
2019/05/27 Javascript
微信小程序实现滑动翻页效果(完整代码)
2019/12/06 Javascript
微信浏览器左上角返回按钮监听的实现
2020/03/04 Javascript
[04:11]DOTA2亚洲邀请赛小组赛第一日 TOP10精彩集锦
2015/01/30 DOTA
python实现画一颗树和一片森林
2018/06/25 Python
基于Python实现剪切板实时监控方法解析
2019/09/11 Python
Python scrapy增量爬取实例及实现过程解析
2019/12/24 Python
python获取依赖包和安装依赖包教程
2020/02/13 Python
python 写一个文件分发小程序
2020/12/05 Python
浅谈css3新单位vw、vh、vmin、vmax的使用详解
2017/12/01 HTML / CSS
加拿大最大的五金、家居装修和园艺产品商店:RONA
2017/01/27 全球购物
缓解脚、腿和背部疼痛:Z-CoiL鞋
2019/03/12 全球购物
Booking.com德国:预订最好的酒店和住宿
2020/02/16 全球购物
strlen的几种不同实现方法
2013/05/31 面试题
优秀大学生推荐信范文
2013/11/28 职场文书
中国梦演讲稿范文
2014/08/28 职场文书
卫校毕业生自我鉴定
2014/09/28 职场文书
2014年项目工作总结
2014/11/24 职场文书
工人先进事迹材料
2014/12/26 职场文书
2015年大学学生会工作总结
2015/05/13 职场文书
HTML中table表格拆分合并(colspan、rowspan)
2021/04/07 HTML / CSS
win11怎么用快捷键锁屏? windows11锁屏的几种方法
2021/11/21 数码科技