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将文本转换成图片输出的方法
Apr 28 Python
Python实现大文件排序的方法
Jul 10 Python
Python实现堆排序的方法详解
May 03 Python
浅谈Python使用Bottle来提供一个简单的web服务
Dec 27 Python
python 读文件,然后转化为矩阵的实例
Apr 23 Python
Linux(Redhat)安装python3.6虚拟环境(推荐)
May 05 Python
python对象与json相互转换的方法
May 07 Python
Python基本类型的连接组合和互相转换方式(13种)
Dec 16 Python
Python unittest单元测试openpyxl实现过程解析
May 27 Python
Python是怎样处理json模块的
Jul 16 Python
python 服务器运行代码报错ModuleNotFoundError的解决办法
Sep 16 Python
pytorch 一行代码查看网络参数总量的实现
May 12 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加Nginx实现动态裁剪图片方案
2014/03/10 PHP
使用PHPMailer实现邮件发送代码分享
2014/10/23 PHP
浅谈PHP链表数据结构(单链表)
2016/06/08 PHP
PHP 极验验证码实例讲解
2016/09/29 PHP
php中遍历二维数组并以表格的形式输出的方法
2017/01/03 PHP
PHP+Mysql分布式事务与解决方案深入理解
2021/02/27 PHP
有关JavaScript的10个怪癖和秘密分享
2011/08/28 Javascript
常用一些Javascript判断函数
2012/08/14 Javascript
js中的this关键字详解
2013/09/25 Javascript
jQuery中before()方法用法实例
2014/12/25 Javascript
angularJS中$apply()方法详解
2015/01/07 Javascript
jquery中EasyUI实现同步树
2015/03/01 Javascript
百度UEditor编辑器如何关闭抓取远程图片功能
2015/03/03 Javascript
TypeError document.getElementById(...) is null错误原因
2015/05/18 Javascript
jQuery深拷贝Json对象简单示例
2016/07/06 Javascript
微信小程序 自定义消息提示框
2017/08/06 Javascript
利用babel将es6语法转es5的简单示例
2017/12/01 Javascript
浅谈Vue初学之props的驼峰命名
2018/07/19 Javascript
详解JSON Web Token 入门教程
2018/07/30 Javascript
深入学习TypeScript 、React、 Redux和Ant-Design的最佳实践
2019/06/17 Javascript
原生js滑动轮播封装
2020/07/31 Javascript
python之wxPython应用实例
2014/09/28 Python
Python3多进程 multiprocessing 模块实例详解
2018/06/11 Python
numpy中矩阵合并的实例
2018/06/15 Python
python垃圾回收机制(GC)原理解析
2019/12/30 Python
通过python实现windows桌面截图代码实例
2020/01/17 Python
Python类如何定义私有变量
2020/02/03 Python
python+requests接口压力测试500次,查看响应时间的实例
2020/04/30 Python
keras的ImageDataGenerator和flow()的用法说明
2020/07/03 Python
python获取系统内存占用信息的实例方法
2020/07/17 Python
Python趣味实例,实现一个简单的抽奖刮刮卡
2020/07/18 Python
设计师珠宝:Ylang 23
2018/05/11 全球购物
社区学习雷锋活动总结
2014/04/25 职场文书
星级党支部申报材料
2014/05/31 职场文书
2015年领班工作总结
2015/04/29 职场文书
Vue.Draggable实现交换位置
2022/04/07 Vue.js