使用Python下载网络文件?


Python 提供了不同的模块,例如 urllibrequests 等,用于从网络下载文件。我将使用Python的requests库来高效地从URL下载文件。

让我们一步一步地看看如何使用requests库从URL下载文件:

1. 导入模块

import requests

2. 获取链接或URL

url = 'https://www.facebook.com/favicon.ico'
r = requests.get(url, allow_redirects=True)

3. 使用名称保存内容。

open('facebook.ico', 'wb').write(r.content)

将文件保存为facebook.ico。

示例

import requests


url = 'https://www.facebook.com/favicon.ico'
r = requests.get(url, allow_redirects=True)

open('facebook.ico', 'wb').write(r.content)

结果

我们可以看到文件(图标)已下载到我们的当前工作目录。

但是我们可能需要从网络下载不同类型的文件,例如图像、文本、视频等。所以让我们首先获取URL链接到的数据类型:

>>> r = requests.get(url, allow_redirects=True)
>>> print(r.headers.get('content-type'))
image/png

然而,有一种更聪明的方法,它涉及在实际下载文件之前仅获取URL的头部信息。这允许我们跳过下载那些不应下载的文件。

>>> print(is_downloadable('https://www.youtube.com/watch?v=xCglV_dqFGI'))
False
>>> print(is_downloadable('https://www.facebook.com/favicon.ico'))
True

为了根据文件大小限制下载,我们可以从content-length头部信息获取文件大小,然后根据我们的需求进行操作。

contentLength = header.get('content-length', None)
if contentLength and contentLength > 2e8: # 200 mb approx
return False

从URL获取文件名

要获取文件名,我们可以解析URL。下面是一个示例程序,它获取反斜杠(/)后的最后一个字符串。

url= "http://www.computersolution.tech/wp-content/uploads/2016/05/tutorialspoint-logo.png"
if url.find('/'):
print(url.rsplit('/', 1)[1]

以上将给出URL的文件名。但是,在许多情况下,例如http://url.com/download,URL中不存在文件名信息。在这种情况下,我们需要获取Content-Disposition头部信息,其中包含文件名信息。

import requests
import re

def getFilename_fromCd(cd):
"""
Get filename from content-disposition
"""
if not cd:
return None
fname = re.findall('filename=(.+)', cd)
if len(fname) == 0:
return None
return fname[0]


url = 'http://google.com/favicon.ico'
r = requests.get(url, allow_redirects=True)
filename = getFilename_fromCd(r.headers.get('content-disposition'))
open(filename, 'wb').write(r.content)

上述URL解析代码与上述程序结合使用,大多数情况下可以从Content-Disposition头部信息获取文件名。

更新于:2023年8月22日

156K+ 浏览量

开启你的职业生涯

完成课程获得认证

开始学习
广告