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 获取 Linux 系统信息的代码
Jul 13 Python
python清除指定目录内所有文件中script的方法
Jun 30 Python
使用Python脚本将文字转换为图片的实例分享
Aug 29 Python
linux环境下python中MySQLdb模块的安装方法
Jun 16 Python
python导出chrome书签到markdown文件的实例代码
Dec 27 Python
python list格式数据excel导出方法
Oct 31 Python
python使用threading.Condition交替打印两个字符
May 07 Python
解决pycharm 远程调试 上传 helpers 卡住的问题
Jun 27 Python
Python Subprocess模块原理及实例
Aug 26 Python
使用pandas 将DataFrame转化成dict
Dec 10 Python
python GUI库图形界面开发之PyQt5 MDI(多文档窗口)QMidArea详细使用方法与实例
Mar 05 Python
如何实现一个python函数装饰器(Decorator)
Oct 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下载xls文件(自己动手写的)
2014/04/18 PHP
php读取3389的脚本
2014/05/06 PHP
php将字符串随机分割成不同长度数组的方法
2015/06/01 PHP
json 入门基础教程 推荐
2009/10/31 Javascript
JQuery 弹出框定位实现方法
2010/12/02 Javascript
JS+CSS 制作的超级简单的下拉菜单附图
2013/11/22 Javascript
js关于字符长度限制的问题示例探讨
2014/01/24 Javascript
jQuery对象的selector属性用法实例
2014/12/27 Javascript
深入理解JS中的substr和substring
2016/04/26 Javascript
很棒的js Tab选项卡切换效果
2016/08/30 Javascript
js正则表达式注册页面表单验证
2016/10/11 Javascript
nodejs中解决异步嵌套循环和循环嵌套异步的问题
2017/07/12 NodeJs
原生JS实现日历组件的示例代码
2017/09/22 Javascript
JavaScript实现封闭区域布尔运算的示例代码
2018/06/25 Javascript
vue将后台数据时间戳转换成日期格式
2019/07/31 Javascript
使用vue实现HTML页面生成图片的方法
2020/03/12 Javascript
使用PYTHON接收多播数据的代码
2012/03/01 Python
Windows8下安装Python的BeautifulSoup
2015/01/22 Python
举例讲解Python中的Null模式与桥接模式编程
2016/02/02 Python
Python遍历文件夹和读写文件的实现代码
2016/08/28 Python
pandas 按照特定顺序输出的实现代码
2018/07/10 Python
Python图像处理之简单画板实现方法示例
2018/08/30 Python
对pytorch网络层结构的数组化详解
2018/12/08 Python
python钉钉机器人运维脚本监控实例
2019/02/20 Python
python顺序执行多个py文件的方法
2019/06/29 Python
Python使用itchat 功能分析微信好友性别和位置
2019/08/05 Python
Python Multiprocessing多进程 使用tqdm显示进度条的实现
2019/08/13 Python
Django-silk性能测试工具安装及使用解析
2020/11/28 Python
北京SQL新华信咨询
2016/09/30 面试题
应届生服务员求职信
2013/10/31 职场文书
会计专业自荐信范文
2013/12/02 职场文书
电子信息科学专业自荐信
2014/01/30 职场文书
大型演出策划方案
2014/05/28 职场文书
起诉状范本
2015/05/20 职场文书
python正则表达式re.search()的基本使用教程
2021/05/21 Python
JavaScript实现队列结构过程
2021/12/06 Javascript