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