网络

教育改变生活

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 41704|回复: 2
打印 上一主题 下一主题

[后端开发] 爬虫入门——怎么获取B站视频封面?

  [复制链接]

271

主题

284

帖子

1243

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1243

最佳新人活跃会员热心会员突出贡献优秀版主

跳转到指定楼层
楼主
发表于 2020-9-18 11:13:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
刚刚好有这个诉求,代码刚写好还热着呢,批量获取一个up所有视频的封面原图!


于是突然来了兴致,想通过自己为所欲为的技术手段,实现一波儿封面批量自提。
简单调查了一番,发现这东西用Pyhton爬虫搞,不仅难度不大而且很有搞头!于是很快便开始上手缕逻辑。

实施

第一次接触爬虫,就想要那种短平快的东西,所以我把逻辑抽离的非常宏观:
1. 先知道目标图片的网址是什么?
2. 通过代码访问这个网址,拿到目标页面的全部代码。
3. 解析这个代码,找到图片所在区域ID
4. 遍历区域内所有的内容,找到每一个img标签,获取它的src属性就是图片的地址
5. 通过代码+地址下载对应的图片保存到本地
6. 大功告成
上面的这几步骤基本都能看懂,有几个步骤需要一些技术支持,分别对应是:
1. 就是你访问的地址
2. urllib2或者requests
3. BeautifulSoup4
4. 浏览器的F12+选择器找一下
5. urllib
我把主逻辑理顺后,写成代码也很简单(这段代码不能用哈,不用看太细):
  1. # -*- coding:utf-8 -*-
  2. import requests
  3. from bs4 import BeautifulSoup

  4. #指定要爬取的网站url
  5. x = 0
  6. def get_images(url):
  7.     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'}
  8.     req = urllib2.Request(url,headers=headers)# 用url地址创建一个request对象
  9.     page = urllib2.urlopen(req,timeout=20)#打开网址
  10.     contents = page.read() # 获取源码

  11.     res = requests.get(url,headers=headers,timeout=(5,5))
  12.     print (res.content)
  13.     soup = BeautifulSoup(contents,'html.parser') # 创建一个soup对象
  14.     cover_imgs = soup.find_all('img')# 找到img标签  find只找一次,find_all找到所有
  15.     for cover_img in cover_img:# 遍历list,选取属性
  16.         link = cover_img.get('src');#获取src图片路径
  17.         link.replace(".webp",".png")
  18.         print (link);

  19.         #下载的文件,取名字
  20.         global x
  21.         urllib. urlretrieve(link,'image\%s.png'%x)
  22.         print ("Downloading image No.{}".format(x));
  23.         x += 1;

  24. for page in range(1,10):
  25.     <blockquote>    url = 'https://api.bilibili.com/x/space/arc/search?mid=21151219&ps=30&tid=0&pn=1&keyword=&order=pubdate&jsonp=jsonp'.format(page)
复制代码


阻碍


这段代码的主逻辑是通的,思路也是完全按照上面的123456来的,但是就当我已经兴奋地搓搓小手准备爬图的时候,却遇到了很大的障碍:
res.content拿到的并不是完整页面的代码」
拿到的只是一个主的html加一堆js文件的加载路径,并没有拿到包含着图片标签的代码。
也就是说,我通过浏览器访问这个网址看到页面的时候,其实已经进行过多次请求响应了
而我通过代码单独请求这个网址,只拿到了单次请求主页的内容,所以这么搞并不能拿到指定的内容。
在这个页面上通过右键查看源代码确认了一下。确实,这个页面的源代码就是这个样子滴:
那这就比较难搞了,我该如何获知浏览器发出的其他请求并模拟出来,然后通过返回拿到我想要的东西呢?
怎么说也是个大厂的网站,让我一没摸过爬虫的人上来说爬就爬了是不是有点太low了。
再想想办法,只能硬着头皮看请求了。

柳暗花明


这是我访问页面的get请求:
后面跟的请求好多,我也不是很懂,只能是凭感觉找可疑的请求查验。
感觉上它应该是访问后台的某个api接口,反馈回来的是一堆json数据,然后前端根据数据给它渲染成了我们看到的亚子。
功夫不负有心人,就这么感觉了几下还真让我发现了一个可疑的:
看见那个api.开头我就觉得有门,复制到浏览器试了一下,果然!
把这里面pic的地址扔到浏览器里一看!我的妈直接get到了1768*1080的原图(在浏览器里F12查找元素能看到的,只有320*240webp格式了)!比我电脑屏幕分辨率都高,兴奋的我大腿都拍肿了!
这个突破口有了,我们回到技术上来!
现在直接从api拿到的是json数据,所以现在思路大改!
根本不需要解析页面,更不需要什么bs4,只需要访问api接口,从数据里提取出图片地址,下载图片就完了。
不仅思路更加简短,难度也陡然下降。
比刚才的代码还要简单,一共只有20行不到:
  1. import requests
  2. # noinspection PyUnresolvedReferences
  3. import json
  4. import urllib
  5. x = 0
  6. def get_images(url):
  7.     headers = {
  8.         'Usar-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36'}
  9.     res = requests.get(url, headers=headers, timeout=(5, 5))
  10.     for video in res.json()['data']['list']['vlist']:
  11.         global x
  12.         urllib.request.urlretrieve("http:" + video['pic'], '8KRAW_OFFICIAL\\%s.jpg' % x)
  13.         print("Downloading image No.{}".format(x));
  14.         x += 1
  15.         #range=爬取页数
  16. for page in range(1, 5):

  17.     #8KRAW_OFFICIAL
  18.     url = 'https://api.bilibili.com/x/space/arc/search?mid=21151219&ps=30&tid=0&pn=1&keyword=&order=pubdate&jsonp=jsonp'.format(page)

  19.     get_images(url)
复制代码

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


举一反三


有了这个技术手段,其他up主的封面原图,也不是问题。你需要做的只是:
· 打开这个up的个人主页点投稿
· F12点到network页面
· 刷新页面,找到大量的webp图片请求然后开始往上找。找到一个search?xxxx的请求
· 点击就能看到Request url 项指定的真实api地址
· 把这个地址替换掉上面代码里的url,执行脚本就可以下图片了
· 爬取的页数根据需要自己调整range
爬取的结果,你可以尽情欣赏:

这个爬虫还是很简单的,几乎可是说是入门都没有的水平了。
真的要把爬虫这门技术发展成可以挣钱吃饭的手艺,那难度就不是这个量级了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

271

主题

284

帖子

1243

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1243

最佳新人活跃会员热心会员突出贡献优秀版主

沙发
 楼主| 发表于 2020-9-18 13:39:47 | 只看该作者
程序文件就送给大家了,有兴趣的同学可以一起研究

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

517

主题

544

帖子

4万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
41511

最佳新人活跃会员热心会员推广达人宣传达人灌水之王突出贡献优秀版主荣誉管理论坛元老

板凳
发表于 2020-10-14 16:29:36 | 只看该作者
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

WEB前端

QQ|手机版|小黑屋|金桨网|助学堂  咨询请联系站长。

GMT+8, 2024-10-31 12:27 , Processed in 0.038570 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表