如何使用 urlopen() 下载 Python3 中的文件或将自定义 headers 添加到 urlretrieve()?

How can I download a file in Python3 with urlopen() or add custom headers to urlretrieve()?

tl;dr 我想从只允许某些 User-Agents 的服务器下载文件。我设法使用以下代码从该站点获得了 200 OK

opener = urllib.request.build_opener()
opener.addheaders = [('User-Agent', 'Interwebs Exploiter 4')]
opener.open(url)

由于文件可以是 .pdf 或 .zip 或其他格式,我想下载它而不解析或读取它。 Urlretrieve() 似乎是个好主意,但它使用默认值 header,这使得服务器 return 成为 403 Forbidden.

我如何使用自定义构建的开启器下载文件或简单地将 header 添加到 urlretrieve()

Python 文档中的 this example 对我来说完全是胡言乱语。

我会使用 requests

import requests   

headers = {'User-Agent': 'Interwebs Exploiter 4'}

 r = requests.get(url, allow_redirects=True, headers=headers)
    with open(filename, 'wb') as f:
        for chunk in r.iter_content(1024):
            f.write(chunk)

除非出于某种原因绝对必须使用 urllib

下载 URL urllib.request:

opener = urllib.request.build_opener()
opener.addheaders = [('User-Agent', 'Interwebs Exploiter 4')]
with opener.open(url) as url_file:
    url_content = url_file.read()

请注意 url_file.read() 会将 整个 文件读入内存,如果它可能是一个非常大的文件,这可能不是您想要的。