爬某牙小姐姐视频,播放量最多的那种。因为数据提取很繁琐,就不bb了。直接上代码,代码里有注释。
"""
试爬某牙的视频,养养眼
"""
import os
import pprint
import re
import requests
# 视频地址:https://v.huya.com/ ->频道,星宿颜值->最多播放
filePath = 'video\' # 要存储的地址
if not os.path.exists(filePath):
os.mkdir(filePath)
# 首先请求的是视频列表页面,获取视频id
url = 'https://v.huya.com/g/all_most_31' # 视频列表页面
# 请求参数
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36',
}
# 请求数据
response = requests.get(url=url, headers=headers)
# print(response.text)
# 用正则表达式找到视频列表id
results = re.findall('<a href="//v.huya.com/play/(d+).html"', response.text)
# print(results)
# 找到了视频列表id之后,现在要确定视频播放来源,
# 随便点开一个视频播放,找到它请求的播放地址
# 发现为类似的:https://huya-w20.huya.com/2120/510233425/1300/e0817db60b0729879b0a5553d7474214.mp4?bitrate=1401&client=22&definition=1300&pid=1199564385429&scene=vod&vid=510233425
# 复制.mp4前面的字符串,在开发者工具里进行查找,看它的最终源
# 发现有类似json的数据,展开查看,发现正是需要的数据源
# 请求json数据
for vedioId in results:
# # 构造视频列表播放请求的url
# videoPlayurl = f'https://liveapi.huya.com/moment/getMomentContent?callback=jQuery1124037387656100533784_1635472169330&'
# f'videoId={vedioId}&uid=&_=1635472169352'
# # 请求一下上面的地址以查看数据是否准确
# playUrlresponse = requests.get(url=videoPlayurl, headers=headers)
# print(playUrlresponse.text) # 这里肯定是个字符串,可以用处理字符串的方式或者用re提取想要的信息
# # 有个大神说,只需要将url里的callback那一串去掉就能打印出json数据
# 上面的处理需要字符串处理,用大神说的,将callback那一串删除
videoPlayurl = f'https://liveapi.huya.com/moment/getMomentContent?'
f'videoId={vedioId}&uid=&_=1635472169352'
playUrlresponse = requests.get(url=videoPlayurl, headers=headers)
# print(playUrlresponse.json()) # 到此就获取到了json数据
# pprint.pprint(playUrlresponse.json())
# 获取到了json数据就提取要下载的源url和视频名称
videoOrginalUrl = playUrlresponse.json()['data']['moment']['videoInfo']['definitions'][0]['url'] # 取到url
videoName = playUrlresponse.json()['data']['moment']['videoInfo']['videoTitle']
print(videoName, videoOrginalUrl)
# break # 调试的时候可以只打印一次
# 取到了数据源就可以请求下载了
requestVideoDownload = requests.get(url=videoOrginalUrl, headers=headers)
with open(filePath + videoName + '.mp4', mode='wb') as f: # 以二进制方式保存数据
f.write(requestVideoDownload.content)
if os.path.exists(videoName + '.mp4'):
print(videoName + '视频已经存在!')
else:
print(videoName + '还在下载中。。。')
下载完后的结果:

我就爬了一页,没做分页爬取,电脑太卡。分页的话加个for循环。