如何爬取B站视频的封面图片

2024-04-01 21:18
文章标签 视频 图片 爬取 封面

本文主要是介绍如何爬取B站视频的封面图片,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

缘起

周末在B站刷视频的时候,红灯区…啊呸!钢琴区一个up的视频突然拽住了我的眼球,一连翻看了她的几个视频之后,我发现这个up每次的封面确实有点东西!
在这里插入图片描述
于是突然来了兴致,想通过自己为所欲为的技术手段,实现一波儿封面批量自提。

简单调查了一番,发现这东西用Pyhton爬虫搞,不仅难度不大而且很有搞头!于是很快便开始上手缕逻辑。

实施

第一次接触爬虫,就想要那种短平快的东西,所以我把逻辑抽离的非常宏观:

  1. 先知道目标图片的网址是什么?
  2. 通过代码访问这个网址,拿到目标页面的全部代码。
  3. 解析这个代码,找到图片所在区域ID
  4. 遍历区域内所有的内容,找到每一个img标签,获取它的src属性就是图片的地址
  5. 通过代码+地址下载对应的图片保存到本地
  6. 大功告成

上面的这几步骤基本都能看懂,有几个步骤需要一些技术支持,分别对应是:

  1. 就是你访问的地址
  2. urllib2或者requests
  3. BeautifulSoup4
  4. 浏览器的F12+选择器找一下
  5. urllib

我把主逻辑理顺后,写成代码也很简单(这段代码不能用哈,不用看太细):

# -*- coding:utf-8 -*-
import requests
from bs4 import BeautifulSoup#指定要爬取的网站url
x = 0
def get_images(url):headers = {'Usar-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36'}req = urllib2.Request(url,headers=headers)# 用url地址创建一个request对象page = urllib2.urlopen(req,timeout=20)#打开网址contents = page.read() # 获取源码res = requests.get(url,headers=headers,timeout=(5,5))print (res.content)soup = BeautifulSoup(contents,'html.parser') # 创建一个soup对象cover_imgs = soup.find_all('img')# 找到img标签  find只找一次,find_all找到所有for cover_img in cover_img:# 遍历list,选取属性link = cover_img.get('src');#获取src图片路径link.replace(".webp",".png")print (link);#下载的文件,取名字global xurllib. urlretrieve(link,'image\%s.png'%x)print ("Downloading image No.{}".format(x));x += 1;for page in range(1,10):url = 'https://space.bilibili.com/72956117/video?tid=0&page={}&keyword=&order=pubdate'.format(page)get_images(url)

阻碍

这段代码的主逻辑是通的,思路也是完全按照上面的123456来的,但是就当我已经兴奋地搓搓小手准备爬图的时候,却遇到了很大的障碍:

res.content拿到的并不是完整页面的代码

拿到的只是一个主的html加一堆js文件的加载路径,并没有拿到包含着图片标签的代码。

也就是说,我通过浏览器访问这个网址看到页面的时候,其实已经进行过多次请求响应了

而我通过代码单独请求这个网址,只拿到了单次请求主页的内容,所以这么搞并不能拿到指定的内容。

在这个页面上通过右键查看源代码确认了一下。确实,这个页面的源代码就是这个样子滴:
那这就比较难搞了,我该如何获知浏览器发出的其他请求并模拟出来,然后通过返回拿到我想要的东西呢?

要知道一个优秀的爬虫大佬,那都是web前后端玩儿贼6的大佬,我一个搞C++客户端的,对这些是一窍不通啊?!一时间让我有点一筹莫展。

不过怎么说也是个大厂的网站,让我一没摸过爬虫的人上来说爬就爬了是不是有点太low了。

再想想办法,只能硬着头皮看请求了。

柳暗花明

这是我访问页面的get请求:
在这里插入图片描述
后面跟的请求好多,我也不是很懂,只能是凭感觉找可疑的请求查验。

感觉上它应该是访问后台的某个api接口,反馈回来的是一堆json数据,然后前端根据数据给它渲染成了我们看到的亚子。

功夫不负有心人,就这么感觉了几下还真让我发现了一个可疑的:
在这里插入图片描述
看见那个api.开头我就觉得有门,复制到浏览器试了一下,果然!
在这里插入图片描述
把这里面pic的地址扔到浏览器里一看!我的妈直接get到了1768*1080的原图(在浏览器里F12查找元素能看到的,只有320*240的webp格式了)!比我电脑屏幕分辨率都高,兴奋的我大腿都拍肿了!
在这里插入图片描述这个突破口有了,我们回到技术上来!

现在直接从api拿到的是json数据,所以现在思路大改!

根本不需要解析页面,更不需要什么bs4,只需要访问api接口,从数据里提取出图片地址,下载图片就完了。

不仅思路更加简短,难度也陡然下降。

比刚才的代码还要简单,一共只有20行不到(这个是真的可以跑,注意身体~):

import requests
import json
import urllibx = 0
def get_images(url):headers = {'Usar-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36'}res = requests.get(url,headers=headers,timeout=(5,5))for video in res.json()['data']['list']['vlist']:global xurllib.request.urlretrieve("http:"+video['pic'],'image\%s.jpg'%x)print ("Downloading image No.{}".format(x));x += 1
for page in range(1,10):url = 'https://api.bilibili.com/x/space/arc/search?mid=72956117&ps=30&tid=0&pn={}&keyword=&order=pubdate&jsonp=jsonp'.format(page)get_images(url)

装上对应的库后直接python3就可以跑,执行之前要在同级目录创建一个名为image的文件夹,否则没路径会报错。

举一反三

有了这个技术手段,其他up主的封面原图,也不是问题。你需要做的只是:

  • 打开这个up的个人主页点投稿
  • 按F12点到network页面
  • 刷新页面,找到大量的webp图片请求然后开始往上找。找到一个search?xxxx的请求
  • 点击就能看到Request url 项指定的真实api地址
  • 把这个地址替换掉上面代码里的url,执行脚本就可以下图片了
  • 爬取的页数根据需要自己调整range。

爬取的结果,你可以没人的时候尽情欣赏:
在这里插入图片描述
这个爬虫还是很简单的,几乎可是说是入门都没有的水平了。

真的要把爬虫这门技术发展成可以挣钱吃饭的手艺,那难度就不是这个量级了,想要有所精进的同学,我个人非常推荐去看老陈的博客(https://www.cnblogs.com/c-x-a)和崔大的文章(https://cuiqingcai.com/)。
不吹不黑他们的文章凭借扎实的技术和清晰地思维逻辑,往公安局送了不少搞爬虫的人(逃…

后记

最后关于这个UP主,大家爬爬图片就好,我本意是不想给她带哪怕一个人头的流量的。

她早年的视频封面风格还是这样的:
在这里插入图片描述
也可以看得出来还是挺正经的,后来发觉擦边球涨粉的套路后就一发不可收拾了

另外主要不想带流量的原因是我在了解过程中也发现:这个UP似乎在外网发表过一些台独言论,因此每次发视频评论弹幕都比视频热闹。而这UP从来都视而不见,建议B站能够严查!

这篇关于如何爬取B站视频的封面图片的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/868160

相关文章

使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)

《使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)》PPT是一种高效的信息展示工具,广泛应用于教育、商务和设计等多个领域,PPT文档中常常包含丰富的图片内容,这些图片不仅提升了... 目录一、引言二、环境与工具三、python 提取PPT背景图片3.1 提取幻灯片背景图片3.2 提取

Python实现图片分割的多种方法总结

《Python实现图片分割的多种方法总结》图片分割是图像处理中的一个重要任务,它的目标是将图像划分为多个区域或者对象,本文为大家整理了一些常用的分割方法,大家可以根据需求自行选择... 目录1. 基于传统图像处理的分割方法(1) 使用固定阈值分割图片(2) 自适应阈值分割(3) 使用图像边缘检测分割(4)

C#实现将Excel表格转换为图片(JPG/ PNG)

《C#实现将Excel表格转换为图片(JPG/PNG)》Excel表格可能会因为不同设备或字体缺失等问题,导致格式错乱或数据显示异常,转换为图片后,能确保数据的排版等保持一致,下面我们看看如何使用C... 目录通过C# 转换Excel工作表到图片通过C# 转换指定单元格区域到图片知识扩展C# 将 Excel

JS+HTML实现在线图片水印添加工具

《JS+HTML实现在线图片水印添加工具》在社交媒体和内容创作日益频繁的今天,如何保护原创内容、展示品牌身份成了一个不得不面对的问题,本文将实现一个完全基于HTML+CSS构建的现代化图片水印在线工具... 目录概述功能亮点使用方法技术解析延伸思考运行效果项目源码下载总结概述在社交媒体和内容创作日益频繁的

使用Node.js制作图片上传服务的详细教程

《使用Node.js制作图片上传服务的详细教程》在现代Web应用开发中,图片上传是一项常见且重要的功能,借助Node.js强大的生态系统,我们可以轻松搭建高效的图片上传服务,本文将深入探讨如何使用No... 目录准备工作搭建 Express 服务器配置 multer 进行图片上传处理图片上传请求完整代码示例

基于Python实现高效PPT转图片工具

《基于Python实现高效PPT转图片工具》在日常工作中,PPT是我们常用的演示工具,但有时候我们需要将PPT的内容提取为图片格式以便于展示或保存,所以本文将用Python实现PPT转PNG工具,希望... 目录1. 概述2. 功能使用2.1 安装依赖2.2 使用步骤2.3 代码实现2.4 GUI界面3.效

基于Python和MoviePy实现照片管理和视频合成工具

《基于Python和MoviePy实现照片管理和视频合成工具》在这篇博客中,我们将详细剖析一个基于Python的图形界面应用程序,该程序使用wxPython构建用户界面,并结合MoviePy、Pill... 目录引言项目概述代码结构分析1. 导入和依赖2. 主类:PhotoManager初始化方法:__in

Python实现AVIF图片与其他图片格式间的批量转换

《Python实现AVIF图片与其他图片格式间的批量转换》这篇文章主要为大家详细介绍了如何使用Pillow库实现AVIF与其他格式的相互转换,即将AVIF转换为常见的格式,比如JPG或PNG,需要的小... 目录环境配置1.将单个 AVIF 图片转换为 JPG 和 PNG2.批量转换目录下所有 AVIF 图

详解如何通过Python批量转换图片为PDF

《详解如何通过Python批量转换图片为PDF》:本文主要介绍如何基于Python+Tkinter开发的图片批量转PDF工具,可以支持批量添加图片,拖拽等操作,感兴趣的小伙伴可以参考一下... 目录1. 概述2. 功能亮点2.1 主要功能2.2 界面设计3. 使用指南3.1 运行环境3.2 使用步骤4. 核

Java图片压缩三种高效压缩方案详细解析

《Java图片压缩三种高效压缩方案详细解析》图片压缩通常涉及减少图片的尺寸缩放、调整图片的质量(针对JPEG、PNG等)、使用特定的算法来减少图片的数据量等,:本文主要介绍Java图片压缩三种高效... 目录一、基于OpenCV的智能尺寸压缩技术亮点:适用场景:二、JPEG质量参数压缩关键技术:压缩效果对比