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实现2014火车票查询代码分享
Jan 10 Python
python脚本实现统计日志文件中的ip访问次数代码分享
Aug 06 Python
python实现图书管理系统
Mar 12 Python
Python3 串口接收与发送16进制数据包的实例
Jun 12 Python
如何基于Python制作有道翻译小工具
Dec 16 Python
python tkinter之顶层菜单、弹出菜单实例
Mar 04 Python
python 成功引入包但无法正常调用的解决
Mar 09 Python
Python Json数据文件操作原理解析
May 09 Python
关于Python3爬虫利器Appium的安装步骤
Jul 29 Python
python用分数表示矩阵的方法实例
Jan 11 Python
详解Python+Selenium+ChromeDriver的配置和问题解决
Jan 19 Python
详解Python之Scrapy爬虫教程NBA球员数据存放到Mysql数据库
Jan 24 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
hadoop常见错误以及处理方法详解
2013/06/19 PHP
PHP中比较两个字符串找出第一个不同字符位置例子
2014/04/08 PHP
php结合ajax实现赞、顶、踩功能实例
2014/05/12 PHP
CI框架中通过hook的方式实现简单的权限控制
2015/01/07 PHP
php array_udiff_assoc 计算两个数组的差集实例
2016/11/12 PHP
yii2 resetful 授权验证详解
2017/05/18 PHP
PHP Beanstalkd消息队列的安装与使用方法实例详解
2020/02/21 PHP
Javascript 判断客户端浏览器类型代码
2010/03/01 Javascript
自定义jquery模态窗口插件无法在顶层窗口显示问题
2014/05/29 Javascript
json中换行符的处理方法示例介绍
2014/06/10 Javascript
推荐25个超炫的jQuery网格插件
2014/11/28 Javascript
jquery中object对象循环遍历的方法
2015/12/18 Javascript
jQuery取消特定的click事件
2016/02/29 Javascript
详解js中的apply与call的用法
2016/07/30 Javascript
jquery 动态合并单元格的实现方法
2016/08/26 Javascript
ThinkJS中如何使用MongoDB的CURD操作
2016/12/13 Javascript
Bootstrap和Java分页实例第一篇
2016/12/23 Javascript
Angular企业级开发——MVC之控制器详解
2017/02/20 Javascript
Iphone手机、安卓手机浏览器控制默认缩放大小的方法总结(附代码)
2017/08/18 Javascript
JS实现基于Sketch.js模拟成群游动的蝌蚪运动动画效果【附demo源码下载】
2017/08/18 Javascript
js实现本地时间同步功能
2017/08/26 Javascript
JavaScript实现新年倒计时效果
2018/11/17 Javascript
微信小程序动态添加view组件的实例代码
2019/05/23 Javascript
JavaScript布尔运算符原理使用解析
2020/05/06 Javascript
vue数据更新UI不刷新显示的解决办法
2020/08/06 Javascript
Anaconda多环境多版本python配置操作方法
2017/09/12 Python
Python基于dom操作xml数据的方法示例
2018/05/12 Python
Python通用循环的构造方法实例分析
2018/12/19 Python
python爬取豆瓣电影排行榜(requests)的示例代码
2021/02/18 Python
美国最大网上鞋店:Zappos
2016/07/25 全球购物
CHARLES & KEITH澳大利亚官网:新加坡时尚品牌
2019/01/22 全球购物
语文教育专业应届生求职信
2013/11/23 职场文书
挂科检讨书范文
2014/02/20 职场文书
2019年消防宣传标语集锦
2019/11/21 职场文书
Vue详细的入门笔记
2021/05/10 Vue.js
Canvas绘制像素风图片的示例代码
2021/09/25 HTML / CSS