Загрузка файлов с помощью Python Urllib, Urllib2

Я пытаюсь загрузить файлы с веб-сайта, используя urllib, как описано в этой теме: текст ссылки

import urllib
urllib.urlretrieve ("http://www.example.com/songs/mp3.mp3", "mp3.mp3")

Я могу скачать файлы (в основном в формате pdf), но все, что я получаю, это поврежденные файлы, которые невозможно открыть. Я подозреваю, что это потому, что сайт требует авторизации.

Как можно изменить вышеуказанную функцию для обработки файлов cookie? Я уже знаю имена полей формы, которые содержат информацию об имени пользователя и пароле. Когда я печатаю возвращаемые значения urlretrieve, я получаю такие сообщения, как:

a, b = urllib.urlretrieve ("http://www.example.com/songs/mp3.mp3", "mp3.mp3")
print a, b

>> **cache-control:** no-cache, no-store, must-revalidate, s-maxage=300, proxy-revalida
te

>> **connection:** close

Я могу вручную загрузить файлы, если введу их URL-адреса в браузере. Спасибо


person SleepingSpider    schedule 22.01.2011    source источник
comment
Если веб-сайт требует входа в систему, вы должны быть перенаправлены на страницу входа, но страница будет сохранена как ваше имя файла, которое вы передали + расширение. Переименуйте свой mp3.mp3 во что-то вроде mp3.html и попробуйте открыть его в веб-браузере. - Это нужно для того, чтобы убедиться, что он запрашивает логин   -  person ccheneson    schedule 22.01.2011
comment
посмотрите библиотеку запросов. если вам не нужно использовать urllib2, просто не делайте этого - это ничего не делает, но все усложняет. pypi.python.org/pypi/requests   -  person Jonathan Vanasco    schedule 10.02.2013


Ответы (2)


Во-первых, urllib2 фактически поддерживает файлы cookie, и обработка файлов cookie должна быть простой, во-вторых, вы можете проверить, что тип файла, который вы скачали. Например. AFAIK все mp3 начинаются с байта "ID3"

import cookielib, urllib2
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
r = opener.open("http://example.com/")
person Erik Johansson    schedule 22.01.2011

Возможно, сервер, к которому вы обращаетесь, ищет определенные заголовочные сообщения, такие как User-Agent. Вы можете попытаться имитировать поведение браузера, отправив дополнительные заголовки.

person rubayeet    schedule 22.01.2011
comment
Спасибо ccheneson & rubayeet! Это была моя ошибка. В именах моих файлов были некоторые ошибки, из-за которых браузер перенаправлялся на страницу входа. Я могу скачать сейчас, используя механизировать через: file.write(browser.response().read()) :) - person SleepingSpider; 22.01.2011