python爬取b站视频封面_我发现这个up封面确实有点东西,爬取B站视频的封面图片...

前言

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。

作者|三丨级丨狗

来源|帝都高级待业专家

缘起

周末在B站刷视频的时候,钢琴区一个up的视频突然拽住了我的眼球,一连翻看了她的几个视频之后,我发现这个up每次的封面确实有点东西!

于是突然来了兴致,想通过自己为所欲为的技术手段,实现一波儿封面批量自提。

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

实施

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

想知道目标图片的网址是什么?

通过代码访问这个网址,拿到目标页面的全部代码。

解析这个代码,找到图片所在区域ID

遍历区域内所有的内容,找到每一个img标签,获取它的src属性就是图片的地址

通过代码+地址下载对应的图片保存到本地

大功告成

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

就是你访问的地址

urllib2或者requests

BeautifulSoup4

浏览器的F12+选择器找一下

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 x

urllib. 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 urllib

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'}

res = requests.get(url,headers=headers,timeout=(5,5))

for video in res.json()['data']['list']['vlist']:

global x

urllib.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。

爬取的结果,你可以没人的时候尽情欣赏:

这个爬虫还是很简单的,几乎可以说是入门都没有的水平了。

PS:如有需要Python学习资料的小伙伴可以加下方的群去找免费管理员领取

可以免费领取源码、项目实战视频、PDF文件等

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值