Python爬取哔哩哔哩今日热门视频
今天给大家分享一个利用python来爬取哔哩哔哩今日热门视频的实战,
还是先说思路:
第一步:想办法寻找到单个视频的真实的url位置
第二步:提取单个视频真实url
第三步:保存获得的数据
第一步:
进入哔哩哔哩今日热门:https://vc.bilibili.com/p/eden/rank#/?tab=%E4%BB%8A%E6%97%A5%E7%83%AD%E9%97%A8
在写代码之前可以知道,视频肯定不止一个,所以用一下代码新建一个文件夹用来存放多个视频:
os.mkdir("D:\英雄时刻\\bilibili")
接下来开始操作,按F12审查元素,这时会发现在源码中找不到视频的真实地址,所以我们就要另想办法了,既然我们能看到视频那么肯定有方法知道视频真实地址,这时我们就要用到另一个神器了:
用这个可以进行抓包操作,我们刷新一下网页,可以发现其中有API接口,那就美滋滋了,有了API那就意味着可以直接获得数据也不用担心其他各种问题了,但是不止有一个API接口,我们可以进行筛选比如以下这个:
打开这个Preview,这个是通过url服务器返回的数据:
很显然这个API中没有我们需要的数据,那么我们可以继续分析下一个API,直到发现这个:
这个是不是有点东西哈哈,继续往下拉发现了这个宝贝:
发现这个里面貌似有.mp4的字样,我们可以复制这个url在新的页面打开发现可以直接下载,下载后播放果然是我们的视频,但是我们却发现这个API接口只有10个视频,其他的视频去哪里了?我们可以在网页中往下拉,多拉几下再去看开发者工具,发现以下情况:
差不多都一样,这是巧合么,哪里来这么多巧合,我们将他们url都列出来和原url比较看看:
很显然,这些都可以看成不同页面,每个url包含了10个视频资料,那么我们可以用个小循环获得所有页面url:
def get_yeshu():
yeshu = []
for i in range(10):
yeshu.append("https://api.vc.bilibili.com/board/v1/ranking/top?page_size=10&next_offset={yeshu}&tag=%E4%BB%8A%E6%97%A5%E7%83%AD%E9%97%A8&platform=pc".format(yeshu=i*10+1))
return yeshu
直到了这些页面url后,我们就可以进入下一步了
第二步:
看一下API返回的数据:
有没有想到一种数据格式:哈哈,没错就是Json格式,其实可以看成是字典的特殊格式,可以用字典用法,通过以下代码可以得到第一个视频标题和地址:
print(resonspe["data"]["items"][0]["item"]["description"])
print(response["data"]["items"][0]["item"]["video_playurl"])
其中的0我们可以用一个小循环来进行遍历每个页面的10个视频,那么到这,我们第二步的提取url工作也结束了。
第三步:
我还是用with来进行保存数据操作的,用起来比较舒服,注意的是访问的视频真实url时要记得用content转换成二进制的字节,保存时也要记得“b”这个二进制操作方式,保存代码如下:
def save_movie(message,x):
url = message["item"]["video_playurl"]
header = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"}
response = requests.get(url, headers=header).content
with open("D:\英雄时刻\\bilibili\\{x}.mp4".format(x=x),"wb") as f:
f.write(response)
其实不管是图片还是视频,其追根到底还是二进制的字节,因此要记得转换哟。就先这样吧!觉得某一篇文章写的好记得关注哟,嘻嘻,最后上代码:
import requests
from lxml import html
import os
#Mr.离
def get_yeshu():#每个页面url
yeshu = []
for i in range(10):
yeshu.append("https://api.vc.bilibili.com/board/v1/ranking/top?page_size=10&next_offset={yeshu}&tag=%E4%BB%8A%E6%97%A5%E7%83%AD%E9%97%A8&platform=pc".format(yeshu=i*10+1))
return yeshu
def get_url():#获得视频真实url信息
os.mkdir("D:\英雄时刻\\bilibili")#建立文件夹
allurl = get_yeshu()
x = 0
for url in allurl:
header = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"}
response = requests.get(url,headers=header).json()
#print(resonspe["data"]["items"][0]["item"]["description"])
#print(response["data"]["items"][0]["item"]["video_playurl"])
for i in range(10):
x += 1
print(response["data"]["items"][i])
save_movie(response["data"]["items"][i],x)
def save_movie(message,x):#保存
url = message["item"]["video_playurl"]
header = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"}
response = requests.get(url, headers=header).content
with open("D:\英雄时刻\\bilibili\\{x}.mp4".format(x=x),"wb") as f:
f.write(response)
if __name__ == "__main__":
get_url()