Hi~大家好!
有时人无聊就喜欢看一些小视频,但网络却时好时坏的,所以就下载下来再看了,但一个一个的下载有点慢,所以本文就出现了。
本文篇幅较长,按照惯例,分析网页走一波,所以只想看源码的可以在微信公众号后台回复梨视频
三字,即可获取本文的完整代码!
分析网页
目标网址:
代码语言:javascript复制https://www.pearvideo.com/popular
本文爬取的是梨视频排行榜的总榜视频,一共五十六条,这个是会变化的,6号的时候还是五十条。
网站刚开始只显示几条内容,这几条内容在网页源代码中是存在的,但剩下的内容需要鼠标往下拉才会显示,而且网页源代码中是没有新加载的内容的,这样可以断定该网页是动态加载
的。
进入浏览器的开发者工具→Network→XHR
,鼠标在网页往下拉或者点击加载更多,这时会加载出几条内容。
点开第一条链接,发现这些就是我们需要的,他长这样:
该网页是简单的静态网页,我们查看网页源代码,里面有视频的标题和视频简介,以及进入播放视频页的链接。这个网页只包含几条内容,所以后面我们需要进行翻页爬取。
我们查看下加载的链接,发现参数start
、sort
以及mrd
是会发生变化。参数start
会发生递增式变化,每次增加10;参数sort
的变化是没有规则的,而且每天的值都不一样,但可以直接写下其递增的数字,把它固定就可以了;参数mrd
对我们没有影响。后面直接替换参数start
和参数sort
进行翻页操作。
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
,所以,后面我们需要对假链接
进行拼接修改,获取真正的视频链接。
# 假链
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
获取函数:
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条视频都下载完成!