批量下载b站视频
前提:已经将我想要下载的视频url链接爬到并保存到csv文件中,接下来就是通过这些url链接下载视频了。
注意:本分享仅供学习参考使用!无意侵犯任何人著作权!
在网上找了很多批量下载的介绍,基本都是爬取某个up主的所有视频,然后直接在命令行中使用you-get语句,而我的csv列表有1000条。。。显然不可能在命令行使用you-get语句了(岂不累死,虽然之前没找到方法的时候的确想过。。。)
话不多说进入正题,首先明确使用什么方法下载视频
1.you-get库
you-get库真的好用!它可能也有不足之处,但是瑕不掩瑜,目前我使用并未发现任何缺点,悔恨今天才发现这个库。
you-get库的下载
可以使用两种方法:
(1)直接在命令行
pip install you-get
pip3 install you-get
上面哪个有用用哪个,但是这个针对的是你使用的python环境就是你下载python时的python环境,我用anaconda新建了一个环境py36,基本代码都使用该环境,因此我是使用方法2
(2)直接在anaconda里面搜you-get库并下载
这个我用是可行的,有的博主说anaconda下载半天还是不行,我就不知道了。
2.ffmpeg的下载
下载方法参考
https://jingyan.baidu.com/article/3c48dd3473177da00ae3587f.html
这里我也比较混乱,装好ffmpeg后,下载还是flv格式,然后我又去anaconda下载了ffmpeg的库,不知道是哪个起了作用。大家可以都试一下。
3.python调用you-get
因为我是批量读取csv文件里面的url链接再进行下载,所以用pycharm比较方便,代码也很简单:
import sys
import you_get
import csv
import time
def download(url, path):
sys.argv = ['you-get', '-o', path, url]
you_get.main()
# 进度条
def view_bar(num, total):
rate = float(num) / float(total)
rate_num = int(rate * 100)
bar = '\r[%s%s]%d%%,%d' % ("=" * rate_num, "" * (100 - rate_num), rate_num, num)
sys.stdout.write(bar)
sys.stdout.flush()
if __name__ == '__main__':
with open("bilibili_url.csv", 'r', encoding='utf-8') as fp:
reader = csv.reader(fp)
j = 0
for i in reader:
url = ''.join(i)
# 视频输出的位置
path = 'F:\\b站视频'
download(url, path)
# 适当休息,防止ip被封
time.sleep(3)
j += 1
view_bar(j, 1000)
我本人在进行下载时,刚开始没有下载ffmpeg因此下载格式时flv,无法直接在电脑上查看很不方面,一同操作猛如虎后(我也不知道真正作用的是什么),再次运行代码,视频下载格式就自动转换成mp4格式了。
并且!you-get库还自动下载了弹幕(前几天为了弹幕熬秃了头都没有下载所有历史弹幕)
视频下载结果:
(因爬取的内容较为敏感被封了。。。)
爬到一半发现出现如下错误:
you-get: [error] oops, something went wrong.
you-get: don't panic, c'est la vie. please try the following steps:
you-get: (1) Rule out any network problem.
you-get: (2) Make sure you-get is up-to-date.
you-get: (3) Check if the issue is already known, on
you-get: https://github.com/soimort/you-get/wiki/Known-Bugs
you-get: https://github.com/soimort/you-get/issues
you-get: (4) Run the command with '--debug' option,
you-get: and report this issue with the full output.
应该是B站反爬,ip被封了。。。
之后发现等待几个小时就可以恢复,或者将下载频率调低一点,即可顺利下载。
以下为全部代码:
import sys
import you_get
import csv
import time
def download(url, path):
sys.argv = ['you-get', '-o', path, url]
you_get.main()
def view_bar(num, total):
rate = float(num) / float(total)
rate_num = int(rate * 100)
bar = '\r[%s%s]%d%%,%d' % ("=" * rate_num, "" * (100 - rate_num), rate_num, num)
sys.stdout.write(bar)
sys.stdout.flush()
if __name__ == '__main__':
with open("bilibili_url.csv", 'r', encoding='utf-8') as fp:
reader = csv.reader(fp)
j = 0
for i in reader:
# 视频网站的地址
url = ''.join(i)
# url = 'https://www.bilibili.com/video/av31059492?from=search&seid=8538131285851066960'
# 视频输出的位置
path = 'F:\\b站视频'
download(url, path)
time.sleep(3)
j += 1
view_bar(j, 91)
# break