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 类详解及简单实例
Mar 24 Python
Python sqlite3事务处理方法实例分析
Jun 19 Python
python、java等哪一门编程语言适合人工智能?
Nov 13 Python
Python虚拟环境项目实例
Nov 20 Python
Python实现调用另一个路径下py文件中的函数方法总结
Jun 07 Python
Python实现多条件筛选目标数据功能【测试可用】
Jun 13 Python
python数据结构学习之实现线性表的顺序
Sep 28 Python
Django Rest framework之权限的实现示例
Dec 17 Python
django 类视图的使用方法详解
Jul 24 Python
python3 BeautifulSoup模块使用字典的方法抓取a标签内的数据示例
Nov 28 Python
opencv+python实现均值滤波
Feb 19 Python
Keras保存模型并载入模型继续训练的实现
Feb 20 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
Syphon 秘笈
2021/03/03 冲泡冲煮
PHP在Web开发领域的优势
2006/10/09 PHP
PHP与MYSQL中UTF8编码的中文排序实例
2014/10/21 PHP
php使用curl打开https网站的方法
2015/06/17 PHP
PHP使用MPDF类生成PDF的方法
2015/12/08 PHP
PHP使用curl_multi_select解决curl_multi网页假死问题的方法
2018/08/15 PHP
laravel model模型处理之修改查询或修改字段时的类型格式案例
2019/10/17 PHP
javascript 多种搜索引擎集成的页面实现代码
2010/01/02 Javascript
iframe父页面获取子页面参数的方法
2014/02/21 Javascript
基于jQuery实现的文字按钮表单特效整理
2014/12/07 Javascript
node.js中的events.EventEmitter.listenerCount方法使用说明
2014/12/08 Javascript
jQuery模仿阿里云购买服务器选择购买时间长度的代码
2016/04/29 Javascript
javascript如何创建对象
2016/08/29 Javascript
jQuery实现搜索页面关键字的功能
2017/02/16 Javascript
BootStrap模态框和select2合用时input无法获取焦点的解决方法
2017/09/01 Javascript
Vue2仿淘宝实现省市区三级联动
2020/04/15 Javascript
jquery分页插件pagination使用教程
2018/10/23 jQuery
vue-cli 目录结构详细讲解总结
2019/01/15 Javascript
微信小程序实现的一键拨号功能示例
2019/04/24 Javascript
js 递归json树实现根据子id查父id的方法分析
2019/11/08 Javascript
使用element-ui +Vue 解决 table 里包含表单验证的问题
2020/07/17 Javascript
python生成指定尺寸缩略图的示例
2014/05/07 Python
深入理解NumPy简明教程---数组1
2016/12/17 Python
Python中关键字nonlocal和global的声明与解析
2017/03/12 Python
python实现播放音频和录音功能示例代码
2018/12/30 Python
从python读取sql的实例方法
2020/07/21 Python
python 递归相关知识总结
2021/03/03 Python
html5 touch事件实现触屏页面上下滑动(一)
2016/03/10 HTML / CSS
美国礼品卡交易网站:Cardpool
2018/08/27 全球购物
市场营销专业个人求职信范文
2013/12/14 职场文书
授权委托书格式模板
2014/04/03 职场文书
仓管员岗位职责范本
2015/04/01 职场文书
2015年成本会计工作总结
2015/10/14 职场文书
如何书写先进事迹材料?
2019/07/02 职场文书
导游词之广东佛山(南风古灶)
2019/09/24 职场文书
用Python的绘图库(matplotlib)绘制小波能量谱
2021/04/17 Python