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快速排序代码实例
Nov 21 Python
Python实现的HTTP并发测试完整示例
Apr 23 Python
Python虚拟环境的原理及使用详解
Jul 02 Python
使用Python opencv实现视频与图片的相互转换
Jul 08 Python
django框架使用方法详解
Jul 18 Python
python list转置和前后反转的例子
Aug 26 Python
opencv3/C++实现视频读取、视频写入
Dec 11 Python
python 实现字符串下标的输出功能
Feb 13 Python
keras 实现轻量级网络ShuffleNet教程
Jun 19 Python
Python selenium爬取微信公众号文章代码详解
Aug 12 Python
python 破解加密zip文件的密码
Apr 22 Python
只用Python就可以制作的简单词云
Jun 07 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
php数组(array)输出的三种形式详解
2013/06/05 PHP
PHP实现简单爬虫的方法
2015/07/29 PHP
YII2框架中查询生成器Query()的使用方法示例
2020/03/18 PHP
php实现微信和支付宝支付的示例代码
2020/08/11 PHP
JavaScript获取网页、浏览器、屏幕高度和宽度汇总
2014/12/18 Javascript
jQuery实现自动与手动切换的滚动新闻特效代码分享
2015/08/27 Javascript
jQuery实现可编辑的表格实例讲解(2)
2015/09/17 Javascript
详解JavaScript UTC时间转换方法
2016/01/07 Javascript
基于jquery实现图片放大功能
2016/05/07 Javascript
基于javascript实现最简单的选项卡切换效果
2016/05/16 Javascript
Bootstrap学习笔记之css样式设计(2)
2016/06/07 Javascript
微信小程序实现滑动删除效果
2017/05/19 Javascript
vue父组件中获取子组件中的数据(实例讲解)
2017/09/27 Javascript
vue-router3.0版本中 router.push 不能刷新页面的问题
2018/05/10 Javascript
微信小程序实现人脸识别
2018/05/25 Javascript
JavaScript类的继承操作实例总结
2018/12/20 Javascript
微信小程序绘制图片发送朋友圈
2019/07/25 Javascript
简单了解常用的JavaScript 库
2020/07/16 Javascript
vue中使用router全局守卫实现页面拦截的示例
2020/10/23 Javascript
Python操作rabbitMQ的示例代码
2019/03/19 Python
python自动生成model文件过程详解
2019/11/02 Python
利用Python的turtle库绘制玫瑰教程
2019/11/23 Python
python实现3D地图可视化
2020/03/25 Python
浙大网新C/C++面试解惑
2015/05/27 面试题
出纳岗位职责模板
2013/11/27 职场文书
制衣厂各岗位职责
2013/12/02 职场文书
小学五年级学生评语
2014/04/22 职场文书
专家推荐信模板
2014/05/09 职场文书
大一新生期末自我评价
2014/09/12 职场文书
民间借贷借条范本
2015/05/25 职场文书
爱国影片观后感
2015/06/18 职场文书
个人工作总结怎么写?
2019/04/09 职场文书
《哪吒之魔童降世》观后感:世上哪有随随便便的成功
2019/11/08 职场文书
Ajax常用封装库——Axios的使用
2021/05/08 Javascript
日本动漫十大公认神作:第五现已全网禁播,《死亡笔记》在榜
2022/03/18 日漫
详解Python中*args和**kwargs的使用
2022/04/07 Python