Python 爬虫爬坑路(二)——B站图片,咸鱼的正确 GET 姿势

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python 爬虫爬坑路(二)——B站图片,咸鱼的正确 GET 姿势相关的知识,希望对你有一定的参考价值。

参考技术A

昨天在写完 入门级爬虫之后 ,马上就迫不及待的着手开始写 B站的图片爬虫了,真的很喜欢这个破站呢 (〜 ̄△ ̄)〜

这里不涉及到 Python 爬虫的高级技巧,没有使用框架,没有考虑反爬机制,没有使用异步IO技术,因为这些,我都不会!

我们选定 B站的 动画区 进行测试,打开后我们发现有好多好多图....

但当我们使用 F12 查看这些图片的时候,发现并没有图片的地址...

这就是目前大多网站使用的 Ajax 技术动态加载数据的锅,可遇到这种情况这么办呢?别急别急,我们知道这些图片的地址一定是需要加载的,而目前常见WEB传输数据的基本就是方式 XML 和 Json (其实是我就知道这两种...),那好我们去看看请求的 XML 和 Json 文件。

以下省略查找过程....

我们发现 B站的图片地址是保存在 Json 里面的,ok,我们保存好这个 json 地址:
https://api.bilibili.com/x/web-interface/dynamic/region?callback=jQuery172071087417824369_1505783866149&jsonp=jsonp&ps=15&rid=24&_=1505783866453

这个是 MAD·AMV 最新动态的 Json 文件,利用上面相同的方法,我们找到 3D区、短片·配音区、综合区 以及 右边排行部分 的相应 json 地址。

好在 Chrome 浏览器提供了一个 Preview 功能,自动帮我们整理好 数据,如下

这样就很清晰啦,我们只需要一层层解析拿到 pic 即可。于是我们这样写:

我们利用 requests 内置的 json 解码器,很不幸,报错:

json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

它提示说:解码 Json 数据的时候出了问题,可能是在 第一行 第一列,咦?好奇怪,刚才不是用浏览器看过结构了吗,没毛病啊,怎么还在报错:Σ(  ̄□ ̄||)

别急别急,我们先看看原始的 Json 数据长啥样?用 浏览器打开上面的 json 链接就可以了。

(/TДT)/ 前面的那些字母是干嘛的呀,为什么还有括号啊!

所以我们知道了 Json 解析错误 的原因啦:后面在处理的时候把前面的这部分删掉就好啦,另外我们也发现了 archives 这个关键字,我们在上一张图看见过的哦,有印象吗?啊,你说没有呀,没关系,这里你只需要记着它是一个 List 的数据类型就好了呀!

为了防止被当作是 恶意访问 从而被封 IP,这里我们选择牺牲时间,取巧使用 sleep(x) ,让其等待一段时间之后再发出请求。

你可能会问我,呀,你这个,根本没有代理、没有混淆IP防止反爬、也没有模拟 Ajax 请求动态抓取云云~

那我可以很负责的告诉你,你!走错地方了!你要找的技术贴出门右拐!( ̄へ ̄)

我们恰巧使用的是 B站的 Ajax 技术,只要哪个视频有了最新评论(或者是一下其它的条件),就会使用 Ajax 将最新的数据取出来。就像下面这样:

所以可能在访问人数多的时候,更新越快,越有可能获得更多不同的图片啦!

之后你就可以在吃饭的时候,把它挂起,然后吃饭回来就会发现有好多好多的图片!(=・ω・=)

之后会陆续的更新自己爬虫的爬坑过程,希望能够找到小伙伴一起学习呀!

Python爬虫-----下载B站视频

声明:本教程只供学习,不用于商业用途。教程中的视频是博主自己发布的,不存在版权问题。

目录

一、找到下载的url-----思路

二、用python PA到视频文件

1.导入模块

2.请求表头设置

3.拿到页面源代码

4.写正则拿url和视频名

5.请求url并下载页面内容(下载视频文件)

三、运行结果


一、找到下载的url-----思路

案例url:炸炉后遗症_哔哩哔哩bilibili_CSGO

打开网页,按F12,进入开发者工具,选择网络,然后按F5刷新网页进行抓包。

 抓完包后,根据我的经验,我们要找的包在预览中看到的是一堆乱码并且有红点的,它有可能就是我们要的音频或者视频,为了验证这个想法,我们可以用IDM这个下载工具做测试。

 我们复制这段url到IDM的下载地址里,看下图操作。

 

 

 复制到Address里,点击OK、Start Download,开始下载。

 诶~,报错了,意料之中,它说服务器回应我们没有权限下载这个文件,点击确定,不急解决方法很简单。

  

 我们双击这项任务,弹出了这个窗口,映入眼帘的是我们亲爱的Referer------俗称:防盗链。接下来懂得都懂。

 复制请求标头里面的防盗链值到刚刚那里,点击OK,再次Resume重新下载。

 OK这次下载成功了,打开看看,我下载到的是视频文件但它里面播放的是音频,那么就是说,B站的视频和音频的url是分开的,并且说明了我刚刚的推测是对的。

 我们把目光转到这个刚刚用来下载的url上,发现“.m4s”这串字符,根据我的测试带有这个字符的都是可以下载的视频文件。接下来我们要看这些url会不会在页面中出现,如果有我们就可以用正则快速的获取这些url。

 在页面源代码中的确有这些url,那就好办了!

重点来了:通过测试可得,这些url是有分布规律的,页面中第一次出现的.m4s的url,是清晰度的最高的,如果你是b站大会员并且视频支持4K的话,那么第一条url的清晰度就是4K,第二条则是第一条url的备用链接,也就是说第三条url才是1080P高码率,以此类推直到清晰度是360p时,它下一条url就是只有音频的视频文件当然这个规律只是暂时的而已,具体哪个是视频哪个是音频还需要自己做测试。

 说到这里下面我们就可以开始用Python爬取视频了。

二、用python PA到视频文件

1.导入模块

import requests
import re

2.请求表头设置

headers = 
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36",
    "referer": "https://www.bilibili.com/video/BV1TL411j7sr?spm_id_from=333.999.0.0",
    "cookie": "输入你自己的cookie"

3.拿到页面源代码

url = "https://www.bilibili.com/video/BV1TL411j7sr?spm_id_from=333.999.0.0"
resp = requests.get(url=url,headers=headers).text
#跳过识别不了的gbk字符
resp = resp.encode("gbk","ignore").decode("gbk", "ignore")

4.写正则拿url和视频名

obj = re.compile(r'"baseUrl":"(.*?)"',re.S)
obj2 = re.compile(r'<span class="tit">(.*?)</span>',re.S)
voide_url = obj.findall(resp)
voide_name = obj2.findall(resp)

5.请求url并下载页面内容(下载视频文件)

resp_video = requests.get(voide_url[0],headers=headers)#第一个url视频清晰度最高
resp_audio = requests.get(voide_url[7],headers=headers)#以此类推第八个就是自有音频的视频文件

with open("0.mp4".format(voide_name[0]), mode="wb") as f:
    f.write(resp_video.content)

#这里直接把视频文件保存为mp3的音频格式
with open("0.mp3".format(voide_name[0]), mode="wb") as f:
    f.write(resp_audio.content)

三、运行结果

 

 

拿到并能正常播放文件,最后用一些软件合并两个文件就是一个完整的视频了。 ​​​​​

以上是关于Python 爬虫爬坑路(二)——B站图片,咸鱼的正确 GET 姿势的主要内容,如果未能解决你的问题,请参考以下文章

一个咸鱼的Python爬虫之路:爬取网页图片

Python爬虫-----下载B站视频

Python爬虫之爬取B站首页热门推荐视频

Python漫画爬虫:B站!热血动漫番太好看了!用Python爬取热门的岛国动漫大片,内存都爆了,爬虫这也太牛了!

Python多线程爬虫入门级案例,采集整站图片素材!

一个咸鱼的python爬虫之路:scrapy 爬虫框架