首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >自己如何开发一个B站视频下载网站?

自己如何开发一个B站视频下载网站?

作者头像
Python进击者
发布2020-04-16 15:46:57
发布2020-04-16 15:46:57
1.1K0
举报
文章被收录于专栏:JAVAandPython君JAVAandPython君

今天我来讲讲如何用Django开发一个b站视频下载的网站。

Bili-Download

开发缘由

有一些小伙伴可能不知道这是啥,可以先去我的网站上看一下:

代码语言:javascript
复制
http://39.106.45.143/

说实话,缘由就是想白嫖B站上大佬的视频(严格意义上不算白嫖,因为我都是给了三连的)

想去下载一些大佬的视频,就想到了我不是写爬虫的么?这个不会?但是本人也不想反复造轮子,于是打开GitHub搜了一搜,确实有很多B站爬虫开源项目。

经过简单的看那些大佬的开源,知道B站的视频其实是留有api接口的,当然有关于B站爬虫的项目,大家自行去GitHub上搜,真的非常多,我也忘记我是找的哪个了。

看完这些后,就想着每次还要运行代码,岂不是太麻烦?所以Django+B站爬虫的想法就出来了。

Bili-Download思路

其实拿到爬虫并且熟练Django的朋友应该很快就能够写出来,我开发这个小网站,大概用了一天中零零碎碎的时间。

我的前端非常的简单,就是一个表单,然后把你的BV号和视频清晰度传到我的后台。

我的后台会接受到你的数据,然后放入爬虫,进行爬取。在B站api中有quality这个参数,这个参数就是相应的清晰度

B站的api中可以返回给我们这个BV视频中所有视频的列表:

我们在前端搜索之后就跳转到视频列表:

这个页面应该是整个项目里稍微复杂一点的地方,点击相应的视频,就会自动下载了。

代码语言:javascript
复制
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函数如下代码:

代码语言:javascript
复制
def file_itrator(f):
  chunk_size = 20000  # 每次读取的片大小
  while True:
      c = f.read(chunk_size)
      print(c)
      if c:
          yield c
      else:
          break

在下载那个页面,我是如何通过点击就实现下载的?

其实查看那个页面的源代码你就会发现,我把获取到的每个视频的下载链接以及其他参数都通过hidden显示在html上,当你点击某个视频时,我通过jQuery获取到你点击的对象,拿到相应的下载链接返回给后端,后端再返回视频流数据。

前端具体如何实现?

代码语言:javascript
复制
<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交流群进行讨论。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python进击者 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Bili-Download
    • 开发缘由
    • Bili-Download思路
  • 关于源码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档