Как я могу загрузить файл в Python3 с помощью urlopen() или добавить пользовательские заголовки в urlretrieve()?

Я хочу сделать скачать файл с сервера, который позволяет только определенные User-Agents, Мне удалось получить 200 OK с сайта, используя следующий код:

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

Поскольку файл может быть в формате.pdf или.zip или в другом формате, я хочу загрузить его без разбора или чтения. Urlretrieve() кажется хорошей идеей, но он использует заголовок по умолчанию, который заставляет сервер возвращать 403 Forbidden,

Как я могу либо загрузить файл с помощью этого пользовательского встроенного открывателя, либо просто добавить заголовки в urlretrieve()?

И этот пример в Python Docs для меня полный бред.

2 ответа

Решение

Я хотел бы использовать 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()прочитает весь файл в память, что может быть не то, что вам нужно, если это может быть очень большой файл.

Другие вопросы по тегам