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

2021-08-05 14:48:06 浏览数 (1)

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条视频都下载完成!

0 人点赞