在Python中从URL下载视频

21

我正在尝试使用Python中的以下代码下载视频。

import urllib
dwn_link = 'https://class.coursera.org/textanalytics-001/lecture/download.mp4?lecture_id=73'

file_name = 'trial_video.mp4' 
urllib.retrieve(dwn_link, file_name)

但这段代码只下载了382 KB,视频打不开。

有什么帮助吗?

编辑:我可以使用下载链接下载此页面上的所有pdf文件,但似乎视频文件存在问题。 视频已经下载到我的本地系统中,但是会出现错误。


1
网站是否需要登录才能访问视频? - Patrick Roberts
@PatrickRoberts 我已经登录了Coursera。 - user3035935
应该将urllib.retrieve(dwn_link, file_name)更改为urllib.urlretrieve(dwn_link, file_name)。 - user3035935
@user3035935 Python并没有你的浏览器凭据。你需要在代码中手动设置HTTP头。 - Patrick Roberts
@PatrickRoberts 请参考我在问题中的编辑。我认为凭据不是一个问题。 - user3035935
1
382kB的文件很可能是网站重定向到以提示进行身份验证的HTML文件,因此请参考那些回答。 - Patrick Roberts
5个回答

40

在Python 3中,

import urllib.request
urllib.request.urlretrieve(url_link, 'video_name.mp4') 

对我来说它运行良好,您可以在以下链接中查看脚本。


1
另外,查看这个答案以添加一个“progressbar”来直观地查看您的下载进度。https://dev59.com/C1oU5IYBdhLWcg3wK0tX - user8491363

12

您可以使用requests库:

def download_video_series(video_links): 

for link in video_links: 

    '''iterate through all links in video_links 
    and download them one by one'''

    # obtain filename by splitting url and getting  
    # last string 
    file_name = link.split('/')[-1]    

    print "Downloading file:%s"%file_name 

    # create response object 
    r = requests.get(link, stream = True) 

    # download started 
    with open(file_name, 'wb') as f: 
        for chunk in r.iter_content(chunk_size = 1024*1024): 
            if chunk: 
                f.write(chunk) 

    print "%s downloaded!\n"%file_name 

print "All videos downloaded!"
return

11
如果您可以使用 urllib2 ,则可以在 url 上使用 urlopen ,这将返回一个 response 对象,然后可以使用 response.read()读取数据并将其写入文件中。
示例 -
import urllib2
dwn_link = 'https://class.coursera.org/textanalytics-001/lecture/download.mp4?lecture_id=73'

file_name = 'trial_video.mp4' 
rsp = urllib2.urlopen(dwn_link)
with open(file_name,'wb') as f:
    f.write(rsp.read())

同时,您需要确保已向服务器进行身份验证,如果下载视频需要身份验证。

我不确定使用什么类型的身份验证,但是如果它是基本HTTP身份验证(我非常怀疑),您可以使用 -

password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()
top_level_url = "http://class.coursera.org/"
password_mgr.add_password(None, top_level_url, username, password)

handler = urllib2.HTTPBasicAuthHandler(password_mgr)

# create "opener" (OpenerDirector instance)
opener = urllib2.build_opener(handler)

# use the opener to fetch a URL
opener.open(dwn_link)

urllib2在输出方面的行为与urllib完全相同。请问哪个库有password_mgr对象?我想试一下这个。 - user3035935
哦,抱歉,没有注意到password_mgr没有初始化,我已经更新了代码,它是password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm() - Anand S Kumar
我在你的代码末尾添加了以下命令:rsp = opener.open(dwn_link)with open(file_name,'wb') as f: f.write(rsp.read())不幸的是,输出仍然相同。文件大小为382 kb。 - user3035935

4

要下载 Coursera 课程中的视频,您需要:

  1. 登录 Coursera.org 的会话
  2. 在 Coursera.org 上注册该课程

一旦完成上述步骤,您可以在 HTTP 客户端通过身份验证(使用您的用户名/密码)和有效的会话后下载视频。


代码中的dwn_link变量是所需的URL。在运行此代码时,我已登录Coursera会话。 - user3035935

0

为了以最小的内存占用下载文件,您可以使用 smart_open

代码变得相当Pythonic,它一次只在内存中保留文件的一小部分:

# pip install smart_open[http]
from smart_open import open

def stream_uri(uri_in, uri_out, chunk_size=1 << 18):  # 256kB chunks
    """Write from uri_in to uri_out with minimal memory footprint."""
    with open(uri_in, "rb") as fin, open(uri_out, "wb") as fout:
        while chunk := fin.read(chunk_size):
            fout.write(chunk)

# from https to disk
stream_uri("https://ik.imagekit.io/demo/sample-video.mp4", "./sample-video.mp4")
# from s3 to ftp
stream_uri("s3://bucket1/example.pdf", "ftp://192.168.178.1:21/example.pdf")

他们支持一系列协议,可以在这里组合使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接