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-----思路
案例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 姿势的主要内容,如果未能解决你的问题,请参考以下文章