Python爬取梨视频的示例

作者:Miraak 时间:2022-05-24 08:12:33 

爬取流程(美食区最热标签下的三个视频)

  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路径就可以了。

来源:https://www.cnblogs.com/miraak/p/14336184.html

标签:python,爬虫,梨视频
0
投稿

猜你喜欢

  • JavaScript大牛:Douglas Crockford

    2009-03-31 12:06:00
  • 制作Dreamweaver活动菜单条

    2008-10-03 20:59:00
  • python虚拟环境迁移方法

    2021-09-13 07:52:51
  • 详解go-admin在线开发平台学习(安装、配置、启动)

    2023-08-26 15:27:31
  • Python ChineseCalendar包主要类和方法详解

    2021-10-12 10:40:40
  • asp如何编写sql语句来查询|搜索数据记录

    2008-10-09 12:35:00
  • 仿google的asp分页代码

    2009-03-08 18:27:00
  • ASP网页编程的19个基本技巧

    2023-07-09 11:52:01
  • css网页下拉菜单制作方法(2):初步实现

    2007-02-03 11:39:00
  • 渗透和改变 非洲web 2.0网站Logo

    2008-01-22 13:31:00
  • python根据开头和结尾字符串获取中间字符串的方法

    2021-01-02 01:44:28
  • MSSQL数据类型

    2008-08-03 17:21:00
  • 在ASP中用“正则表达式对象”来校验数据的合法性

    2010-05-27 12:25:00
  • scrapy-redis分布式爬虫的搭建过程(理论篇)

    2022-04-25 20:49:25
  • asp如何判断偶数和奇数?

    2010-01-12 20:16:00
  • 如何基于Python和Flask编写Prometheus监控

    2021-03-21 13:37:13
  • Python+OpenCV实现将图像转换为二进制格式

    2021-06-25 08:10:33
  • 基于.net开发的遵循web标准的个人站点程序包下载

    2023-07-21 12:37:57
  • 深入探讨SQL Server 2008商务智能(BI)

    2008-12-23 13:56:00
  • JS+CSS实现的日本门户网站经典选项卡导航效果

    2023-09-04 03:40:24
  • asp之家 网络编程 m.aspxhome.com