LINUX.ORG.RU

[Python][urllib2]Перенаправление запроса на сервере и докачка файлов

 


0

1

Приветствую.

Пишу простенькую файлокачалку с использование urllib2. Просто закачка уже работает, теперь хочу добавить докачку частично скачанных файлов.

Проблема в том, что из-за перенаправления запроса на сервере, изначально, имя скачиваемого файла не известно и я не могу определить скачан ли он уже или нет. В голову приходит сначала делать пробный запрос определять имя файла, его наличие и длину и на основе этих данных принимать решение о необходимости формирования второго запроса с заголовком «Range». Вопрос: насколько правилен и корректен такой подход с точки зрения нагрузки на сервер? Существуют ли другие способы решения это проблемы?

Если это важно, то качалка будет заниматься вытягиванием альбомов с Jamendo в oggvorbis формате по ссылкам вида http://www.jamendo.com/get/album/id/album/archiverestricted/redirect/${album_id}/?p2pnet=bittorrent&are=ogg3.

По поводу wget — он не подошел по двум причинам: во-первых из-за перенаправления не может правильно определить имя файла; во-вторых лишняя сущность при наличии urllib2 в стандартной библиотеке; в-третьих хочется разобраться с принципами организации протокола HTTP.

★★★★★
Ответ на: комментарий от hizel

или в mechanize точно есть, можно оттуда взять

hizel ★★★★★
()
Ответ на: комментарий от hizel

>RedirectHandler

Эммм… Что-то я не очень понимаю как он поможет избежать дополнительного запроса? Еще раз, с самим перенаправлением и определение имени скачиваемого файла проблем нет. Меня интересует, можно ли определить скачан файл уже или нет без дополнительного запроса?

mechanize


Так это ж отдельная библиотека, в моем случае однозначный overkill.

fat_angel ★★★★★
() автор топика
Ответ на: комментарий от Jetty

Оно конечно можно, но я не совсем понимаю, что мне это даст. Вот я обнаружил, что у меня половина файла скачалась, а сервер мне выдал его целиком и что дальше делать? seek()-методы разве работают с HTTP?

Прошу прощения за столь дурацкие вопросы, раньше с HTTP не сталкивался.

fat_angel ★★★★★
() автор топика
Ответ на: комментарий от fat_angel

Нет, я к тому что «скачай» предположим 10 байт начиная с 10-го :)
Таким образом ты убъешь 2 зайцев - узнаешь имя файла и узнаешь поддерживает ли сервер докачку :)

Jetty ★★★★★
()

а хранить где-нибудь имена недокачанных фалов с ранжами совсем нельзя?

и потом посылать запрос с ранжем и обрабатывать ошибки?

hotaru
()
Ответ на: комментарий от Jetty

>узнаешь имя файла и узнаешь поддерживает ли сервер докачку

Сервер у меня только один — jamendo.com и он поддерживает докачку. Поэтому не вижу смысла делать дополнительную проверку. Все что мне нужно — это имя файла.

fat_angel ★★★★★
() автор топика
Ответ на: комментарий от hotaru

>а хранить где-нибудь имена недокачанных фалов с ранжами совсем нельзя?

Можно, но тогда моя наколенная поделка потихоньку начнет перерастать в нечто более серьезное, а этого хотелось бы избежать. Ведь jamendo'вский апи для закачки ogg'а может быть в любой момент поломан или даже отключен. Хотя это конечно будет наиболее красивым решением.

fat_angel ★★★★★
() автор топика
Ответ на: комментарий от fat_angel

Задавай только нижнюю границу диапазона, наподобие [code]Range: bytes=1024-[/code] http позволяет. с именем все равно ничего не придумаешь (если не хочешь его сохранять), пока тебе его сервер не скажет.

hotaru
()
Ответ на: комментарий от hotaru

>с именем все равно ничего не придумаешь (если не хочешь его сохранять), пока тебе его сервер не скажет.

Понятно, я примерно так и думал, хотел уточнить просто. А на счет диапазонов — когда имя файла будет известно, определить диапазон из длинны этого файла для нового запроса по-моему не проблема.

fat_angel ★★★★★
() автор топика
Ответ на: комментарий от fat_angel

>определить диапазон из длинны этого файла
это я и имел ввиду

hotaru
()
Ответ на: комментарий от indie

Подумывал и о нем, но лениво разбираться. Тем более, что уже все работает с urllib2

fat_angel ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.