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网络编程学习笔记(九):数据库客户端 DB-API
Jun 09 Python
在Python 3中实现类型检查器的简单方法
Jul 03 Python
Python教程之全局变量用法
Jun 27 Python
python实现跨excel的工作表sheet之间的复制方法
May 03 Python
详解Django中六个常用的自定义装饰器
Jul 04 Python
django settings.py 配置文件及介绍
Jul 15 Python
Python 调用 Outlook 发送邮件过程解析
Aug 08 Python
Python调用钉钉自定义机器人的实现
Jan 03 Python
Python while循环使用else语句代码实例
Feb 07 Python
python有序查找算法 二分法实例解析
Feb 18 Python
python怎么删除缓存文件
Jul 19 Python
Python实现淘宝秒杀功能的示例代码
Jan 19 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三层结构(上) 简单三层结构
2010/07/04 PHP
PHP手机号码归属地查询代码(API接口/mysql)
2012/09/04 PHP
Zend的MVC机制使用分析(二)
2013/05/02 PHP
php+mysql不用递归实现的无限级分类实例(非递归)
2014/07/08 PHP
php实现网站留言板功能
2015/11/04 PHP
thinkphp5.1框架模板赋值与变量输出示例
2020/05/25 PHP
prototype 学习笔记整理
2009/07/17 Javascript
JavaScript 闭包在封装函数时的简单分析
2009/11/28 Javascript
javascript 类型判断代码分析
2010/03/28 Javascript
让mayfish支持mysqli数据库驱动的实现方法
2010/05/22 Javascript
JS焦点图切换,上下翻转
2011/05/12 Javascript
用JQUERY增删元素的代码
2012/02/14 Javascript
jQuery函数map()和each()介绍及异同点分析
2014/11/08 Javascript
node.js中的path.normalize方法使用说明
2014/12/08 Javascript
javascript实现拖动元素交换位置
2015/11/29 Javascript
详细总结Javascript中的焦点管理
2016/09/17 Javascript
老生常谈angularjs中的$state.go
2017/04/24 Javascript
vue源码中的检测方法的实现
2019/09/26 Javascript
vue实现在线预览pdf文件和下载(pdf.js)
2019/11/26 Javascript
[01:02:07]Liquid vs Newbee 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
pandas中的DataFrame按指定顺序输出所有列的方法
2018/04/10 Python
python3读取csv和xlsx文件的实例
2018/06/22 Python
python实现QQ邮箱/163邮箱的邮件发送
2019/01/22 Python
弄懂这56个Python使用技巧(轻松掌握Python高效开发)
2019/09/18 Python
Django 请求Request的具体使用方法
2019/11/11 Python
使用Matplotlib绘制不同颜色的带箭头的线实例
2020/04/17 Python
Python定义一个函数的方法
2020/06/15 Python
python实现画图工具
2020/08/27 Python
html5 localStorage本地存储_动力节点Java学院整理
2017/07/06 HTML / CSS
HTML5梦幻之旅——炫丽的流星雨效果实现过程
2013/08/06 HTML / CSS
HTML5的语法变化介绍
2013/08/13 HTML / CSS
SQL Server笔试题
2012/01/10 面试题
地理信息科学专业推荐信
2014/09/08 职场文书
产品委托授权书范本
2014/09/16 职场文书
群众路线教育实践活动对照检查材料
2014/09/22 职场文书
《灰雀》教学反思
2016/02/19 职场文书