Python爬取哔哩哔哩今日热门视频实战

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()
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值