嗨喽!大家好,这里是魔王~
- requests >>> pip install requests (数据请求 第三方模块)
- re # 正则表达式 去匹配提取数据
- json
- Python 3.8 解释器
- Pycharm 2021.2 版本 建议
win + R 输入cmd 输入安装命令 pip install 模块名 如果出现爆红 可能是因为 网络连接超时 切换国内镜像源
- 确定目标网站 >>> 爬取网址是什么 数据是什么
- 通过开发者工具进行抓包分析
采集视频
- 先看network下面 media(媒体文件包含视频数据或者音频数据) [如果没有数据]
- 通过数据包数据慢慢分析
如果说url里面包含 ts 后缀 >>> 视频片段 >>> m3u8视频格式 (有专门m3u8文件保存所有ts文件内容)
m3u8 就是把一个整体视频, 分割成很多视频小片段 一个片段只有几秒时间…
(可以更好缓存, 你看多少,他就给加载多少, 减少服务器压力)通过上述分析可以知道 只需要获取m3u8文件, 可以获取所有ts视频片段…
- 发送请求, 对于视频详情页页面发送请求
- 获取数据, 获取网页源代码
- 解析数据, 提取我们想要数据内容 视频信息
- 发送请求, 对于m3u8 url地址发送请求
- 获取数据, 获取返回ts文件内容
- 解析数据, 提取所有ts文件
# 导入数据请求模块
import requests # 第三方模块 pip install requests
# 导入正则
import re # 内置模块 不需要安装
# 导入json
import json # 内置模块 不需要安装
# 导入格式化输出模块
import pprint # 内置模块 不需要安装
for page in range(8, 17):
# 获取一页视频ID
url = '网址'
data = {
'quickViewId': 'ac-space-video-list',
'reqID': '1',
'ajaxpipe': '1',
'type': 'video',
'order': 'newest',
'page': page,
'pageSize': '20',
't': '1648129818743',
}
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.82 Safari/537.36'
}
response_1 = requests.get(url=url, params=data, headers=headers)
video_ids = re.findall('ac(\d+)', response_1.text)
for video_id in video_ids:
"""
1. 发送请求, 对于视频详情页页面发送请求 https://www.acfun.cn/v/ac34063499
I. 确定请求网址
II. 确定请求方式
III. 如何实现伪装 如何防止被反爬 user-agent: 用户代理 表示浏览器基本身份信息
在开发者工具里面直接复制
等号左边都是自定义变量 (见名知意)
"""
url = f'https://www.acfun.cn/v/ac{video_id}'
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.82 Safari/537.36'
}
# 通过requests这个模块里面get请求方式, 对于url地址发送请求, 并且携带上headers请求头, 最后用自定义变量response接收返回数据
response = requests.get(url=url, headers=headers) # 表示对象 200状态码表示请求成功
# 2. 获取数据, 获取网页源代码 response.text 获取响应文本数据(字符串数据)
# print(response.text)
"""
3. 解析数据, 提取我们想要数据内容 视频信息
正则表达式 可以直接对于字符串数据进行提取解析
re.findall() 找到所有, 找数据 >>> 找什么样数据, 从哪里找数据
防止有一种情况, 我们想要数据中间, 突然出现一个分号
css 根据标签属性内容提取数据
xpath 根据标签节点提取数据
re 直接提取字符串数据
"""
html_data = re.findall('window.pageInfo = window.videoInfo = (.*)', response.text)[0].replace(';', '')
json_data = json.loads(html_data)
# print(json_data)
# pprint.pprint(json_data)
# json_data 字典数据类型, 就可以根据键值对取值 根据冒号左边的内容(键) 提取冒号右边的内容(值)
title = json_data['title'] # 提取视频标题
m3u8_url = json.loads(json_data['currentVideoInfo']['ksPlayJson'])['adaptationSet'][0]['representation'][0]['backupUrl'][0]
m3u8_data = requests.get(url=m3u8_url, headers=headers).text
# print(m3u8_data)
m3u8_data = re.sub('#E.*', '', m3u8_data).split() # split() 字符串分割 返回列表数据
for ts in m3u8_data:
ts_url = '/'.join(m3u8_url.split('/')[:-1]) + '/' + ts
print(ts_url)
# ts_url = 'https://tx-safety-video.acfun.cn/mediacloud/acfun/acfun_video/hls/' + ts
# ts_url_1 = 'https://tx-safety-video.acfun.cn/mediacloud/acfun/acfun_video/' + ts
# https://tx-safety-video.acfun.cn/mediacloud/acfun/acfun_video/hls/
ts_content = requests.get(url=ts_url, headers=headers).content
# ab 以二进制数据追加保存不会覆盖 wb 二进制数据保存 会覆盖
with open(title + '.mp4', mode='ab') as f: # as
f.write(ts_content)
print(title, '视频保存成功', url)
更多资源、解答可点击
【python】采集优质阿婆主全部视频~下载流媒体m3u8格式
好了,我的这篇文章写到这里就结束啦!
有更多建议或问题可以评论区或私信我哦!一起加油努力叭(ง •_•)ง
喜欢就关注一下博主,或点赞收藏评论一下我的文章叭!!!