前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >❤️心动挑战❤️python爬虫爬取B站封面图片

❤️心动挑战❤️python爬虫爬取B站封面图片

原创
作者头像
远方的星
修改2021-08-21 10:20:05
1.2K0
修改2021-08-21 10:20:05
举报

🍑源生动力😍

对于文章,标题是其浓缩的精华;那么对于视频,其封面就可能是最亮眼的那一帧。B站,作为最近比较火热的短视频平台,其舞蹈区各种各样的舞蹈,尤其是宅舞,深受“宅男”的喜爱。(别和我说什么黑丝、jk,我真的不喜欢😆

在这里插入图片描述
在这里插入图片描述

于是乎,我就尝试使用爬虫获取B站的封面。

🍉网页获取

B站是有防爬措施的,我一开始根据网页进行分析,无果。

转念一想,这么火热的B站,想爬取的人肯定不止我一个,于是乎,我就开始搜索相关的文章和视频。

啪的一下,很快啊,我就找到一篇,根据B站AV号爬取封面图片的文章,我试了一下,咦,还真能用🤩(心中狂喜)

代码语言:txt
复制
# 根据aid,获取封面
https://api.bilibili.com/x/web-interface/view?aid=(aid)

可转念一想,从去年开始,B站就开始用BV号了,哪来的AV号给我呀,文章里的AV号是哪来的呀?害,我转念又看了文章的日期,2019年,哦,那没事了,人家写那会,B站还没改呢😂

方法总比困难多,现在起码知道了怎么利用AV号,那我利用BV号找到AV号不就可以了吗?我真是个大聪明。

找寻一番,有个大佬分享了BV号的api点击传送至大佬页面

我一看,哦,还是B站的大佬,你这不讲武德,居然教别人搞B站(不过我喜欢🤪

代码语言:txt
复制
# 根据BV号获取cid
https://api.bilibili.com/x/player/pagelist?bvid=(bvid,要带上开头的BV!)
# 根据BV号和cid获取视频播放列表
https://api.bilibili.com/x/player/playurl?cid=(cid)&qn=(qn)&bvid=(bvid,要带上开头的BV!)
# 根据BV号和cid获取aid
https://api.bilibili.com/x/web-interface/view?cid=(cid)&bvid=(bvid,要带上开头的BV!)

总结上述内容的api,那么思路就有了,简直是有手就行呀,跟着大佬混,就是行!😏

先根据BV号找到cid,再根据BV号和cid获取aid,再根据aid获取封面。

而且爬取过程中的数据基本上都是json数据。其中:

cid的数据在json的['data'][0]['cid']

aid的数据在json的['data']['aid']

封面图片的数据在json的['data']['pic']

更详细的过程,我写在了代码的注释中👇

🍇完整代码

代码语言:txt
复制
# -*- coding: UTF-8 -*-
# @Time: 2021/8/17 20:12
# @Author: 远方的星
# @CSDN: https://blog.csdn.net/qq_44921056

import os
import json
import requests
import chardet
from fake_useragent import UserAgent

# 随机产生请求头
ua = UserAgent(verify_ssl=False, path='D:/Pycharm/fake_useragent.json')


# 随机切换请求头
def random_ua():
    headers = {
        "accept-encoding": "gzip",  # gzip压缩编码  能提高传输文件速率
        "user-agent": ua.random
    }
    return headers


#  创建文件夹
def path_creat():
    _path = "D:/B站封面/"
    if not os.path.exists(_path):
        os.mkdir(_path)
    return _path


# 对爬取的页面内容进行json格式处理
def get_text(url):
    res = requests.get(url=url, headers=random_ua())
    res.encoding = chardet.detect(res.content)['encoding']  # 统一字符编码
    res = res.text
    data = json.loads(res)  # json格式化
    return data


# 根据bv号获取av号
def get_aid(bv):
    url_1 = 'https://api.bilibili.com/x/player/pagelist?bvid={}'.format(bv)

    response = get_text(url_1)
    cid = response['data'][0]['cid']  # 获取cid

    url_2 = 'https://api.bilibili.com/x/web-interface/view?cid={}&bvid={}'.format(cid, bv)
    response_2 = get_text(url_2)

    aid = response_2['data']['aid']  # 获取aid
    return aid


# 根据av号获取封面图片
def get_image(aid):
    url_3 = 'https://api.bilibili.com/x/web-interface/view?aid={}'.format(aid)
    response_3 = get_text(url_3)
    image_url = response_3['data']['pic']  # 获取图片的下载连接
    image = requests.get(url=image_url, headers=random_ua()).content  # 获取图片
    return image


# 下载封面
def download(image, file_name):
    with open(file_name, 'wb') as f:
        f.write(image)
        f.close()


def main():
    k = 'Y'
    while k == 'Y':  # 根据用户需要一直循环
        path = path_creat()  # 创建保存B站封面的文件夹
        bv = input("请输入视频的bv号:")
        image_name = input("请你给想要下载的封面取一个喜欢的名字叭:")
        aid = get_aid(bv)
        image = get_image(aid)
        file_name = path + '{}.jpg'.format(image_name)
        download(image, file_name)
        print("封面提取完毕^_^")
        k = input("按Y键继续提取,按Q退出:")


if __name__ == '__main__':
    main()

==代码可直接复制运行==,如果对你有帮助,记得==点赞==哦,也是对作者最大的鼓励,不足之处可以在评论区多多指正、交流。

🍋运行结果:美女姐姐,拿来把你🤣

  • 以BV号为BV1C5411P7qM的视频为例:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

🍊图片无损放大

在线网址:https://bigjpg.com/zh

这个是可以在线使用的,可以将你的图片在线放大并且做降噪处理。有兴趣的小伙伴可以自己尝试一下,我感觉效果还可以。

🍍参考文章

参考文章1:python 爬取B站封面

参考文章2:bilibili新出的BV号api

作者:远方的星 CSDN:https://blog.csdn.net/qq_44921056

本文仅用于交流学习,未经作者允许,禁止转载,更勿做其他用途,违者必究。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 🍑源生动力😍
  • 🍉网页获取
  • 🍇完整代码
  • 🍋运行结果:美女姐姐,拿来把你🤣
  • 🍊图片无损放大
  • 🍍参考文章
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档