意见箱
恒创运营部门将仔细参阅您的意见和建议,必要时将通过预留邮箱与您保持联络。感谢您的支持!
意见/建议
提交建议

Python 爬虫 爬取A站视频

来源:恒创科技 编辑:恒创科技编辑部
2023-12-30 05:23:59
一、环境使用

Python 3.8

Pycharm

二、模块使用

import requests >>> pip install requests


Python 爬虫 爬取A站视频

内置模块 你安装好python环境就可以了

import re

import json

三、模块安装问题

win + R 输入cmd 输入安装命令 pip install 模块名 (如果你觉得安装速度比较慢, 你可以切换国内镜像源)

模块安装问题:

- 如何安装python第三方模块:

1. win + R 输入 cmd 点击确定, 输入安装命令 pip install 模块名 (pip install requests) 回车

2. 在pycharm中点击Terminal(终端) 输入安装命令

- 安装失败原因:

- 失败一: pip 不是内部命令

解决方法: 设置环境变量

- 失败二: 出现大量报红 (read time out)

解决方法: 因为是网络链接超时, 需要切换镜像源

清华:https://pypi.tuna.tsinghua.edu.cn/simple

阿里云:https://mirrors.aliyun.com/pypi/simple/

中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/

华中理工大学:https://pypi.hustunique.com/

山东理工大学:https://pypi.sdutlinux.org/

豆瓣:https://pypi.douban.com/simple/

例如:pip3 install -i https://pypi.doubanio.com/simple/ 模块名

- 失败三: cmd里面显示已经安装过了, 或者安装成功了, 但是在pycharm里面还是无法导入

解决方法: 可能安装了多个python版本 (anaconda 或者 python 安装一个即可) 卸载一个就好

或者你pycharm里面python解释器没有设置好

四、配置pycharm里面的python解释器

1. 选择file(文件) >>> setting(设置) >>> Project(项目) >>> python interpreter(python解释器)

2. 点击齿轮, 选择add

3. 添加python安装路径

五、pycharm如何安装插件

1. 选择file(文件) >>> setting(设置) >>> Plugins(插件)

2. 点击 Marketplace 输入想要安装的插件名字 比如:翻译插件 输入 translation / 汉化插件 输入 Chinese

3. 选择相应的插件点击 install(安装) 即可

4. 安装成功之后 是会弹出 重启pycharm的选项 点击确定, 重启即可生效

六、爬虫基本流程思路: <通用 绿色视频网站>

爬虫是什么?

采集网页上面数据程序, 模拟浏览器对于url地址发送请求 获取服务器响应数据

采集一个视频, 然后再采集多个视频, 最后采集多页

(1). 数据来源分析

1. 确定自己需求, 采集那个网站什么数据内容

2. 通过开发者工具进行抓包分析, 分析我们想要视频内容以及视频标题来自于哪里

- F12 或者鼠标右键点击检查 选择 network

A站这个网站视频内容, m3u8视频格式

m3u8视频格式 ---> 了解 1 不知道 2

正常是一个视频内容 完整数据 ---> 2分18秒

m3u8视频格式 ---> 会把完整视频内容 分割成非常多个小片段 (ts文件)

一个小片段 可能是5-10秒钟时间

所有视频片段 <ts> 都保存在一个m3u8文件里面

m3u8视频内容, 你看10秒钟 他就给加载10秒钟的数据

通过分析, 视频内容 ---> ts文件 分片段 ---> m3u8文件链接 --> 网页源代码里

(2). 代码实现步骤: 发送请求 获取数据 解析数据 保存数据

1. 发送请求, 对于视频播放页url地址发送请求

2. 获取数据, 网页源代码

3. 解析数据, 提取我们想要 m3u8链接地址 以及 视频标题

4. 发送请求, 对于m3u8链接地址发送请求

5. 获取数据, 获取服务器返回数据内容

6. 解析数据, 提取所有ts文件链接

7. 保存数据, <发送请求获取数据> 保存成一个完整视频内容


1. 特殊字符

2. 你保存数据之后 播放有问题 视频内容播放

七、完整代码
# 导入数据请求模块  ---> 第三方模块 需要安装 cmd pip install requests
import requests
# 导入re正则模块 ---> 内置模块 不需要
import re
# 导入json ---> 内置模块 不需要
import json
# 导入格式化输出模块 ---> 内置模块 不需要
from pprint import pprint
# 确定请求url地址
link = 'https://www.acfun.cn/u/29946310'
# 请求参数 ctrl + R 选中内容 输入正则命令 点击替换即可 (.*?): (.*) '$1': '$2',
data = {
'quickViewId': 'ac-space-video-list',
'reqID': '3',
'ajaxpipe': '1',
'type': 'video',
'order': 'newest',
'page': '2',
'pageSize': '20',
't': '1658842573436',
}
headers = {
# 用户代理 表示浏览器基本身份标识 用来伪装python代码的
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36'
}
# 发送请求
response_1 = requests.get(url=link, params=data, headers=headers)
# 获取数据 pprint(response_1.text)
# 解析数据
video_id_list = re.findall('"atomid.*?":.*?"(\d+).*?"', response_1.text)
print(video_id_list)
for video_id in video_id_list:
"""
1. 发送请求, 对于视频播放页url地址发送请求
模拟浏览器发送请求

python代码如何实现模拟浏览器?
使用请求头伪装 headers

模块 你使用到了 再去导入,

不加headers相当于裸奔...

headers 相当于衣服....

先听思路, 在课后找落落要录播 在自己去写代码

采集多个数据 ---> 分析请求url变化规律
"""
# 确定url地址
url = f'https://www.acfun.cn/v/ac{video_id}'
# 模拟浏览器 ---> 在开发者工具里面直接复制
headers = {
# 用户代理 表示浏览器基本身份标识 用来伪装python代码的
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36'
}
# 发送请求 ---> <Response [200]>: <>表示对象 response 回复响应 200 状态码表示请求成功
response = requests.get(url=url, headers=headers)
# 得到响应对象
print(response)
# 2. 获取数据, 获取文本数据 响应对象文本数据 print(response.text)
"""
3. 解析数据, 提取我们想要数据内容 选择最适合方法, 最好用的
- m3u8文件链接
- 视频标题
re css xpath 这三个都要学习掌握... 你从事爬虫工程师
这三个知识点, 系统课程全部都会教授...

re 会用 1 不会 2
re.findall() 找到所有我们想要数据内容
从什么地方去找什么数据
从 response.text 里 找 <title >(.*?) - AcFun弹幕视频网 其中 (.*?)
. 可以匹配任意字符
* 可以匹配前一个字符 0 或者无限
? 非贪婪匹配模式
.*? 通配符 可以匹配任意字符 <除了\n换行符以外> re.S

"""
# 提取视频标题
title = re.findall('<title >(.*?) - AcFun弹幕视频网', response.text)[0]
# 提视频m3u8信息
html_data = re.findall('window.pageInfo = window.videoInfo = (.*?);', response.text)[0]
print(title)
# 转换数据类型
json_data = json.loads(html_data)
# 格式化输出 调用pprint文件里面pprint函数 这个知识点函数知识点 pprint(json_data)
# 字典取值 根据冒号左边的内容[键], 提取冒号右边的内容[值] 键值对取值 字典是单引号, 字符串是双引号
m3u8_url = \
json.loads(json_data['currentVideoInfo']['ksPlayJson'])['adaptationSet'][0]['representation'][0]['backupUrl'][0]
print(m3u8_url)
# 发送请求 + 获取数据
m3u8_data = requests.get(url=m3u8_url, headers=headers).text
# 把含有#E 内容都替换掉 split() 分割 返回列表
m3u8_data = re.sub('#E.*', '', m3u8_data).split()
for ts in m3u8_data:
ts_url = 'https://tx-safety-video.acfun.cn/mediacloud/acfun/acfun_video/' + ts
# 保存数据
ts_content = requests.get(url=ts_url, headers=headers).content
# mode ab 保存方式 a追加保存 b 二进制
# video\\' + title + '.mp4' file 文件路径 文件名字后缀
with open('video\\' + title + '.mp4', mode='ab') as f:
# 写入数据
f.write(ts_content)
print(ts_url)

Python 爬虫 爬取A站视频_数据








上一篇: #yyds干货盘点#Python线性表-单链表 下一篇: Python函数进阶与文件操作(python函数的定义和调用)