爬某牙小姐姐视频

爬某牙小姐姐视频,播放量最多的那种。因为数据提取很繁琐,就不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循环。

原文地址:https://www.cnblogs.com/mafu/p/15479145.html