Java教程

α爬取梨视频汽车板块视频详细步骤解析Ω

本文主要是介绍α爬取梨视频汽车板块视频详细步骤解析Ω,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

爬取梨视频单个视频的详细流程

1、首先一如既往,先分析网页的加载模式,在空白处点击右键查看网页源代码,随便复制某个视频标题在源代码页面按Ctrl+F搜索,能够搜索到,说明这个网站是直接加载的

2、然后回到刚刚的页面,在空白处右键点击检查,选择Elements栏,再点击最右边的箭头符号,把鼠标移到视频部分,下边会定位到其所在的标签,寻找规律,发现这些标签都是在一个个<li class="categoryem">标签下

3、可以尝试向刚才看到的带有视频编号的地址发送请求看看能拿到什么,这里地址不全,可以补全一下

4、打开一个视频详情页,按照之前的方法判断一下视频详情页面的加载方式,发现网页源代码中找不到视频数据,说明该页面是二次加载的,这样就无需向详情页发送请求了直接向该地址发送即可

5、上图url中问号后的是get请求的参数,先选择Preview栏,可以看到返回信息中有个地址是.mp4,可以认为这就是视频数据的来源

6、尝试一下携带参数向该地址发送请求,其中mrd随机数在这暂时无用(可不加),发现和上述结果不同,这说明该网站采取一定的防爬措施

7、按照视频或者图片网站会采取的常规措施,应该是防盗链技术,看一下请求头,验证了我的猜想,这里的refer的值表示网络请求的来源,通俗地讲就是验证是否从网页点击打开视频的,不是的就拒绝访问

可以将这个参数加入到之前发送的请求中,这样就能拿到正常的响应

8、返回的数据是json格式,可利用互联网上的json解析工具格式化一下,方便观看

可以看到,视频地址是在videoInfo中的videos中的srcUrl的值

9、我们可以先在代码中将返回的响应反序列化,在层层递进,取srcUrl的值

 但是

这个地址是打不开的!!!    浏览器会显示资源不存在

为什么呢?很简单,这个地址不对!!!

 

虚假的地址:https://video.pearvideo.com/mp4/short/20210923/1632414141772-15772830-hd.mp4

真实的地址:https://video.pearvideo.com/mp4/short/20210923/cont-1742392-15772830-hd.mp4

有何不同呢???

10、对的,我们接收到的响应中,视频编号部分是被系统时间替换过的,只需要在代码中将其换回即可

然后就可以向真实地址发送请求拿到视频了

 

11、以上,是爬取单个视频的详细流程,理论上可以根据视频编号获取指定的视频数据

  稍作修改,我们就能获得这一页的全部视频了!!!


爬取梨视频单页全部视频的详细流程

1、经过观察发现,对于每一个视频只有发送请求是携带的视频编号不一样,主要地址是一样的

2、我们可以在获取单个视频数据的代码段外套一层循环并将视频编号改成随着列表获取

3、这样可以向当页所有视频链接发送请求以获取当页所有视频数据

 4、接着,为了避免访问次数过多,需要在循环内加入主动延迟,而且需要将视频保存至本地文件中

这里再添加两个模块

 5、接下来是文件操作,首先创建存放视频的目录

 6、拼接文件路径并将获取到的视频数据写入文件

7、以上,是爬取单页全部视频的详细流程,理论上可以以此类推获取其它页的视频数据

  稍作修改,我们就能获得汽车板块的全部视频了!!!

 


爬取梨视频的多页视频的详细流程

1、回到汽车板块的首页,在检查页面选择Netork下的Fetch/XHR,将页面滚动条往下拖到底,可以看到浏览器自动发送了个请求

 2、再来看一下这个请求的参数,可以看到12个视频id以及页面的起始位置,不妨大胆的猜测一下,再往下拖滚动条会引起参数的变化

 3、果然,又发送了一个请求,可以看到前三个是“最热”分类的视频,置顶;而后面十二个是在滚动条底部位置更新的视频

 4、接下来我们可以将代码稍作修改

# 首先用上述请求地址替代之前汽车板块首页,起始位置自定义参数
carUrl = 'https://www.pearvideo.com/category_loading.jsp?reqType=5&categoryId=31&start={}'.format(n)

5、再将整个发送网络请求获取视频数据最后保存的代码段封装成函数以便使用,参数为请求中的起始位置

 6、调用此方法即可随意获取视频数据,参数必须是12的倍数

~~~~~~~~ 以下是完整代码 ~~~~~~~~

# 引入发送网络请求的模块
import requests
# 引入处理HTML文件的模块
from bs4 import BeautifulSoup
# 引入文件操作模块
import os
# 引入时间模块
import time

# 1.判断存放视频的目录是否存在,不存在则自动创建
if not os.path.exists(r'梨视频_Car'):
    os.mkdir(r'梨视频_Car')

def getVideo(n):
    """
        获取梨视频汽车板块全部视频方法
        参数n : 起始视频索引
    """
    # 1.梨视频汽车板块和主页的url
    carUrl = 'https://www.pearvideo.com/category_loading.jsp?reqType=5&categoryId=31&start={}'.format(n)
    baseUrl = 'https://www.pearvideo.com/'
    # 2.向梨视频汽车板块发送get请求
    carRes = requests.get(carUrl)
    # 3.针对梨视频汽车板块的网页构造html解析器
    carSoup = BeautifulSoup(carRes.text, 'lxml')
    # 4.获取所有存放视频的li标签
    liList = carSoup.find_all(name='li', attrs={'class': 'categoryem'})
    # 5.获取a标签的href值,同时也是视频编号
    videoDetailList = [li.a.get('href') for li in liList]
    # 6.循环视频编号
    for video in videoDetailList:
        # 主动延迟
        time.sleep(1)
        # 7.获取视频编号
        videoCode = video
        # 8.获取视频id
        videoId = videoCode.split('_')[-1]
        # 9.向视频链接发送请求
        videoRes = requests.get('https://www.pearvideo.com/videoStatus.jsp',
                                params={'contId': videoId},
                                headers={'referer': baseUrl + videoCode}
                                )
        # 9.将返回结果反序列化
        dataJson = videoRes.json()
        # 10.获取视频链接
        srcUrl = dataJson.get('videoInfo').get('videos').get('srcUrl')
        # 11.需要获取真实链接
        realUrl = srcUrl.replace(dataJson.get('systemTime'), 'cont-{}'.format(videoId))
        # 12.向真实视频链接发送请求
        realVideoRes = requests.get(realUrl, stream=True)
        # 13.拼接文件路径
        filePath = os.path.join(r'梨视频_Car', '{}.mp4'.format(videoId))
        # 14.以写模式打开文件
        with open(filePath, 'wb') as f:
            # 16.按行读取视频
            for line in realVideoRes.iter_content():
                f.write(line)
        print('视频{}下载成功!!!'.format(videoId))

"""调用此方法"""
for n in range(12, 48, 12):
    getVideo(n)
View Code

 

这篇关于α爬取梨视频汽车板块视频详细步骤解析Ω的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!