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的struct模块中进行数据格式转换的方法
Jun 17 Python
python实现文本去重且不打乱原本顺序
Jan 26 Python
Python黑帽编程 3.4 跨越VLAN详解
Sep 28 Python
python爬虫实现教程转换成 PDF 电子书
Feb 19 Python
Centos7 Python3下安装scrapy的详细步骤
Mar 15 Python
Python UnboundLocalError和NameError错误根源案例解析
Oct 31 Python
Python中使用pypdf2合并、分割、加密pdf文件的代码详解
May 21 Python
使用python进行波形及频谱绘制的方法
Jun 17 Python
python gensim使用word2vec词向量处理中文语料的方法
Jul 05 Python
Python对接六大主流数据库(只需三步)
Jul 31 Python
python实现tail实时查看服务器日志示例
Dec 24 Python
python制作抽奖程序代码详解
Jan 15 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 删除记录实现代码
2009/03/12 PHP
php 遍历数据表数据并列表横向排列的代码
2009/09/05 PHP
PHP 一个页面执行时间类代码
2010/03/05 PHP
php 操作符与控制结构
2012/03/07 PHP
ajax取消挂起请求的处理方法
2013/03/18 PHP
PHP 生成N个不重复的随机数
2015/01/21 PHP
php封装好的人民币数值转中文大写类
2015/12/20 PHP
Laravel中的Auth模块详解
2017/08/17 PHP
JavaScript原型继承之基础机制分析
2011/08/26 Javascript
Javascript弹出窗口的各种方法总结
2013/11/11 Javascript
js计算两个时间之间天数差的实例代码
2013/11/19 Javascript
JQuery each()嵌套使用小结
2014/04/18 Javascript
JS实现从连接中获取youtube的key实例
2015/07/02 Javascript
全面解析bootstrap格子布局
2016/05/22 Javascript
JS中递归函数
2016/06/17 Javascript
jQuery+ajax读取json数据并按照价格排序示例
2018/03/28 jQuery
小程序分页实践之编写可复用分页组件
2019/07/18 Javascript
Python实现的查询mysql数据库并通过邮件发送信息功能
2018/05/17 Python
Python实现的绘制三维双螺旋线图形功能示例
2018/06/23 Python
flask框架使用orm连接数据库的方法示例
2018/07/16 Python
python用plt画图时,cmp设置方法
2018/12/13 Python
详解python做UI界面的方法
2019/02/27 Python
Python中最大递归深度值的探讨
2019/03/05 Python
python 计算平均平方误差(MSE)的实例
2019/06/29 Python
pymysql的简单封装代码实例
2020/01/08 Python
python实现五子棋程序
2020/04/24 Python
详解python 条件语句和while循环的实例代码
2020/12/28 Python
用Python自动清理系统垃圾的实现
2021/01/18 Python
纯CSS实现预加载动画效果
2017/09/06 HTML / CSS
CSS3实现文本垂直排列的方法
2018/07/10 HTML / CSS
Looking4Parking美国:全球排名第一的机场停车比较品牌
2019/08/26 全球购物
中国梦演讲稿5分钟
2014/08/19 职场文书
2014年大堂经理工作总结
2014/11/21 职场文书
专职安全员岗位职责
2015/04/11 职场文书
老乡聚会通知
2015/04/23 职场文书
如何使用 resize 实现图片切换预览功能
2021/08/23 HTML / CSS