前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用python爬取梨视频,谁让我无聊的时候爱看小视频呢!

用python爬取梨视频,谁让我无聊的时候爱看小视频呢!

作者头像
Python与Excel之交
发布2021-08-05 14:48:06
3320
发布2021-08-05 14:48:06
举报
文章被收录于专栏:Python与Excel之交

Hi~大家好!

有时人无聊就喜欢看一些小视频,但网络却时好时坏的,所以就下载下来再看了,但一个一个的下载有点慢,所以本文就出现了。

本文篇幅较长,按照惯例,分析网页走一波,所以只想看源码的可以在微信公众号后台回复梨视频三字,即可获取本文的完整代码!

分析网页

目标网址:

代码语言:javascript
复制
https://www.pearvideo.com/popular

本文爬取的是梨视频排行榜的总榜视频,一共五十六条,这个是会变化的,6号的时候还是五十条。

网站刚开始只显示几条内容,这几条内容在网页源代码中是存在的,但剩下的内容需要鼠标往下拉才会显示,而且网页源代码中是没有新加载的内容的,这样可以断定该网页是动态加载的。

进入浏览器的开发者工具→Network→XHR,鼠标在网页往下拉或者点击加载更多,这时会加载出几条内容。

点开第一条链接,发现这些就是我们需要的,他长这样:

该网页是简单的静态网页,我们查看网页源代码,里面有视频的标题和视频简介,以及进入播放视频页的链接。这个网页只包含几条内容,所以后面我们需要进行翻页爬取。

我们查看下加载的链接,发现参数startsort以及mrd是会发生变化。参数start会发生递增式变化,每次增加10;参数sort的变化是没有规则的,而且每天的值都不一样,但可以直接写下其递增的数字,把它固定就可以了;参数mrd对我们没有影响。后面直接替换参数start和参数sort进行翻页操作。

代码语言:javascript
复制
https://www.pearvideo.com/popular_loading.jsp?reqType=1&categoryId=&start=10&sort=6&mrd=0.707501605581558
https://www.pearvideo.com/popular_loading.jsp?reqType=1&categoryId=&start=20&sort=13&mrd=0.2340385059536354
https://www.pearvideo.com/popular_loading.jsp?reqType=1&categoryId=&start=30&sort=18&mrd=0.39877818938331755

进入视频播放界面,视频一般都是动态加载的,所以我们直接进入开发者工具进行抓包,找到了一条MP4后缀的链接。

但你复制到浏览器是播放不了的。

经过我的分析,加载过来的链接其实是个假链接,它和被浏览器渲染过的链接的参数是有区别的。能播放的链接是有cont-1722159的,而 1722159这串数字就是每个视频的ID,所以,后面我们需要对假链接进行拼接修改,获取真正的视频链接。

代码语言:javascript
复制
# 假链
https://video.pearvideo.com/mp4/adshort/20210304/1615027146434-15622552_adpkg-ad_hd.mp4
# 真链
https://video.pearvideo.com/mp4/adshort/20210304/cont-1722159-15622552_adpkg-ad_hd.mp4

爬取思路:

  • 向排行榜首页动态加载的链接发送请求 - 获取视频ID标题
  • 向视频播放页动态加载出的链接发送请求 - 获取视频的假链接
  • 利用视频假链接视频ID拼接成视频真链接-保存视频为MP4文件。

实战代码

导入模块:

代码语言:javascript
复制
import requests
import re
import os
import time
import random

构建视频标题视频ID获取函数:

代码语言:javascript
复制
def title_video(url):
    res = requests.get(url).text
    title = findall('<h2 class="popularem-title">(.*?)</h2>', res)
    video = re.findall('<a href="video_(.*?)" class="popularembd actplay">', res)
    return title, video

该网页是静态加载的,视频标题视频ID都在网页源代码中,而且没有任何反爬虫措施;接着直接用正则表达式进行提取视频标题视频ID

构建视频解析、保存函数:

代码语言:javascript
复制
def url_data(title, video):
    for title_, video_ in zip(title, video):
        headers = {
        # Referer后面的video需要跟着变化
        'Referer': 'https://www.pearvideo.com/video_{}'.format(video_),
        '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'
        }
        # 访问视频播放页动态加载出的链接,转换为json格式,提取假链接
        urls = 'https://www.pearvideo.com/videoStatus.jsp?contId={}&mrd=0.8225231045349968'.format(video_)
        response = requests.get(urls, headers=headers).json()
        srcUrl = response['videoInfo']['videos']['srcUrl']
        # 拼接链接
        srcUrl_s = 'https://video.pearvideo.com/mp4/adshort/' + srcUrl.split('/')[-2] + '/cont-' + str(video_) + srcUrl.split('/')[-1][13:]
        with open('./视频/' + title_.replace('"', '') + '.mp4', 'wb')as f:
            data = requests.get(srcUrl_s, headers=headers).content
            print(title_)
            f.write(data)
            print('下载完成')
    # 停一下
    t = random.uniform(1, 3)
    time.sleep(t)

构建主函数,用来调用上面的函数:

代码语言:javascript
复制
def main(url):
    title, video = title_video(url)
    url_data(title, video)

控制台:

代码语言:javascript
复制
if __name__ == '__main__':
 # 利用os模块自动创建一个文件保存视频
    if not os.path.exists('./视频/'):
        os.mkdir('./视频/')
    url = 'https://www.pearvideo.com/popular_loading.jsp?reqType=1&categoryId=&start={}&sort={}&mrd=0.031311729238955976'
    # url中的sort参数变化值
    t = [0, 8, 5, 3, 4, 9, 4, 1, 4, 8, 4]
    for start, sort in zip(range(0, 100, 10), t):
        main(url.format(start, sort))

运行后,56条视频都下载完成!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-03-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python与Excel之交 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云点播
面向音视频、图片等媒体,提供制作上传、存储、转码、媒体处理、媒体 AI、加速分发播放、版权保护等一体化的高品质媒体服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档