点击上方“Python进击者”,关注我!
坚持初心,坚持原创
前言
hello,各位小伙伴,这是公众号改名后的第一篇原创。不管改不改名,我都是会坚持初心,记录技术,不搞虚的,希望大家能够持续关注这个一直原创的公众号。
昨天很多小伙伴加我,问Java的文章在哪里更新,这里就把二维码发给大家,如果是学习Java的同学可以关注一波,不是学习Java的,也可以关注一波。
好了,废话不多说,今天我来讲讲如何用Django开发一个b站视频下载的网站。
Bili-Download
开发缘由
有一些小伙伴可能不知道这是啥,可以先去我的网站上看一下:
http://39.106.45.143/
说实话,缘由就是想白嫖B站上大佬的视频(严格意义上不算白嫖,因为我都是给了三连的)
想去下载一些大佬的视频,就想到了我不是写爬虫的么?这个不会?但是本人也不想反复造轮子,于是打开GitHub搜了一搜,确实有很多B站爬虫开源项目。
经过简单的看那些大佬的开源,知道B站的视频其实是留有api接口的,当然有关于B站爬虫的项目,大家自行去GitHub上搜,真的非常多,我也忘记我是找的哪个了。
看完这些后,就想着每次还要运行代码,岂不是太麻烦?所以Django+B站爬虫的想法就出来了。
Bili-Download思路
其实拿到爬虫并且熟练Django的朋友应该很快就能够写出来,我开发这个小网站,大概用了一天中零零碎碎的时间。
我的前端非常的简单,就是一个表单,然后把你的BV号和视频清晰度传到我的后台。
我的后台会接受到你的数据,然后放入爬虫,进行爬取。在B站api中有quality这个参数,这个参数就是相应的清晰度
B站的api中可以返回给我们这个BV视频中所有视频的列表:
我们在前端搜索之后就跳转到视频列表:
这个页面应该是整个项目里稍微复杂一点的地方,点击相应的视频,就会自动下载了。
urllib.request.install_opener(opener)
# 开始下载
try:r = urllib.request.urlopen(url=video_download_url)response = StreamingHttpResponse(file_itrator(r), content_type="application/octet-stream",)response["Content-Disposition"] = 'attachment; filename={0}; filename*=utf-8''{0}'.format(quote(title) + '.flv') //视频格式可自行修改return response
except Exception as e:print("这里有个错误:", e)return HttpResponse("error,请返回重新搜索")
这里我是使用StreamingHttpResponse来对视频流进行获取并且返回给浏览器进行下载的。这个页面中,这段代码是核心。其中video_download_url就是从api中获取到的视频下载链接,file_itrator函数如下代码:
def file_itrator(f):chunk_size = 20000 # 每次读取的片大小while True:c = f.read(chunk_size)print(c)if c:yield celse:break
在下载那个页面,我是如何通过点击就实现下载的?
其实查看那个页面的源代码你就会发现,我把获取到的每个视频的下载链接以及其他参数都通过hidden显示在html上,当你点击某个视频时,我通过jQuery获取到你点击的对象,拿到相应的下载链接返回给后端,后端再返回视频流数据。
前端具体如何实现?
<script>
$("a").click(function () {var form = $('<form action="/down_video/" method="post" target="_self" style="display: none"></form>');var video_download_url = $('<input type="text" name="video_download_url" style="display: none" />');var start_url = $('<input type="text" name="start_url" style="display: none" />');var title = $('<input type="text" name="title" style="display: none" />');title.attr('value', $(this).text());video_download_url.attr('value', $(this).next().val());start_url.attr('value', $(this).next().next().next().val());form.append(title);form.append(video_download_url);form.append(start_url);$(document.body).append(form);form.submit();});
</script>
通过jQuery来伪造一个form表单进行数据的提交,提交之后后台就会自动的返回视频流数据。这里便是前端的核心代码。
关于源码
其实这种网站本不属于正规类型,所以我并不是很想开源,但是如果本篇文章在看
破20的话,我会开源在公众号上,到时候会发文章出来的。如果你对这个项目比较感兴趣,欢迎加入我们的Python web交流群进行讨论。
加群方式:
加我微信,回复python
我是kuls欢迎加我微信
备注姓名+学习方向
拉你进Java、Python交流群