前言
嗨喽!大家好呀,这里是魔王~
知识点:
- 爬虫基本流程
- re正则表达式简单使用
- requests
- json数据解析方法
- 视频数据保存
开发环境]:
- Python 3.8
- Pycharm
模块使用]:
- requests >>> pip install requests 第三方模块
- re
win + R 输入cmd 输入安装命令 pip install 模块名 如果出现爆红 可能是因为 网络连接超时 切换国内镜像源
爬虫基本流程(固定):
一. 数据来源分析
-
确定爬取内容是什么? (目标网址, 网址里面数据)
视频内容 -
通过开发者工具进行抓包分析, 分析我们想要数据 通过请求那个url地址可以获得
I. 通过分析可以知道 视频播放url地址是什么?
II. 通过视频播放地址, 去分析找寻, 视频数据包是在哪?
III. 通过两个视频数据包 请求参数对比, 可以知道 只要获取所有视频ID 就可以获取视频内容
(图片id 视频ID 音乐ID 还是什么ID 都可以去列表页面获取)
IV. 去分析 视频ID可以从哪里获取 (一般情况都可以在列表页面获取)
我想要获取视频播放地址 >>> 要得到视频数据包 >>> 获取视频ID
二. 代码实现步骤 发送请求 获取数据 解析数据 保存数据
- 发送请求, 对于舞蹈视频列表页面发送请求
- 获取数据, 服务器返回数据内容
- 解析数据, 提取我们想要数据内容 视频ID
- 发送请求, 把视频ID传入到 视频数据包里面 发送请求
- 获取数据, 服务器返回数据内容
- 解析数据, 提取我们想要数据内容 视频标题 以及视频播放地址
- 保存数据, 把视频内容保存本地
- 多页数据采集
代码
# 导入数据请求模块
import requests # 第三方模块 pip install requests 需要自行安装
# 导入re正则表达式
import re # 内置模块 不需要安装
# 导入格式化输出模块
import pprint # 内置模块 不需要安装
# 1. 发送请求, 对于舞蹈视频列表页面发送请求
for page in range(1, 11):
print(f'正在爬取第{page}页的数据内容')
url = f'https://v.huya.com/g/all?set_id=51&order=hot&page={page}'
# 爬虫是模拟浏览器对于服务器发送请求, 然后获取服务器返回数据内容
# user-agent: 用户代理 表示浏览器基本身份信息 (一种简单反反爬手段)
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36'
}
# 通过requests模块里面get请求方式对于url地址发送请求, 并且携带上headers请求进行伪装, 最后用自定义变量response接收返回数据
response = requests.get(url=url, headers=headers)
# <Response [200]> 表示请求成功, 请求网址成功了 *** 200状态码表示请求成功, 但是不一定能够得到数据
# 2. 获取数据, 服务器返回数据内容 response.text 获取响应文本数据
# print(response.text)
# 3. 解析数据, 提取我们想要数据内容 视频ID
# 解析方式: css re xpath
# <li data-vid="676382675"> 想要数据 可以(.*?) 从response.text 里面去找寻这样数据内容
# .*? 是可以匹配任意字符(除了\n换行符以外) 如果你只是单纯提取数字 最好用 \d+ 匹配一个或者多个数字
video_ids = re.findall('<li data-vid="(\d+)">', response.text) # 返回列表数据
for video_id in video_ids: # 通过for循环遍历 提取列表里面元素 一个一个提取
# print(video_id)
# 4. 发送请求, 把视频ID传入到视频数据包里面发送请求
# 5. 获取数据, 服务器返回数据内容
# f 字符串格式化方法 {} 占位符
video_info = f'https://liveapi.huya.com/moment/getMomentContent?videoId={video_id}&uid=&_=1647433310180'
json_data = requests.get(url=video_info, headers=headers).json()
# 有反爬 就有 反反爬
# print(json_data)
# pprint.pprint(json_data)
# 根据冒号左边的内容, 提取冒号右边的内容
# 6. 解析数据
title = json_data['data']['moment']['title']
video_url = json_data['data']['moment']['videoInfo']['definitions'][0]['url']
# 7. 保存数据 >>> 发送请求 并且获取数据
"""
response.text >>> 文本数据返回字符串数据
response.json() >>> json字典数据
response.content >>> 二进制数据
"""
video_content = requests.get(url=video_url, headers=headers).content
with open('video\\' + title + '.mp4', mode='wb') as f:
f.write(video_content)
print(title, video_url)
尾语
好了,我的这篇文章写到这里就结束啦!
有更多建议或问题可以评论区或私信我哦!一起加油努力叭(ง •_•)ง
喜欢就关注一下博主,或点赞收藏评论一下我的文章叭!!!
网友评论