Найти - Пользователи
Полная версия: httplib и скачка файлов(архивов)
Начало » Python для новичков » httplib и скачка файлов(архивов)
1
necrozyablo
Вот есть простой код

import httplib, re

con=httplib.HTTPConnection('www.sitename.ru:80')
print 'Start...'

def download_post(types = 'srt', range1 = 1, range2 = 5):

useragent='Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.1 (KHTML, like Gecko) Chrome/6.0.437.3 Safari/534.1'
headers={'Content-Type':'application/x-www-form-urlencoded', 'User-Agent':useragent}

for i in range(range1, range2):

print types, i

body=types+'='+str(i)
con.request('POST', '/base.php', body, headers)

temp=con.getresponse()
data=temp.read()

req = re.findall('windows',data)

if req:
print 'no data'
continue
else:
filename=types+'/'+str(i)+'.rar'
f = open(filename,'wb')
#print data
f.write(data)
f.close()


download_post('srt', 1, 6000)
Собственно хочу автоматом выкачивать архивы с субтитрами. Всё качает но есть проблема во многих случаях получаются битые архивы.
В частности есть 2 проблемы:
1 есть архивы составные, которые не могут найти свои части т.к. в данном коде у меня все переименовывается в 1-6000.rar Т.е. я не знаю как получить имя файла
2 И основная проблема это в символах конца строк когда я писал файлы f = open(filename,'w') вообще всё было плохо т.к. в конце строки добавлялся CR LF. Когда я начал писать f = open(filename,'wb') полегчало, но как оказалось есть архивы внутри которых в конце строки ставятся CR и LF а в моём двоичном писании они не ставятся. В итоге разница в 5 байт и невозможность даже восстановить архив.

Вообще возможно ли как то сразу копировать файл без всяких open и записи?

Httplib пользуюсь т.к. прямого доступа к файлам нет и приходится посылать форму.
necrozyablo
Так настоящие имя файла можно получить через

temp.getheaders()

А вот со второй проблемой что делать не знаю. Опытным путём понял что проблема в строках которые должны оканчиваться LF. Мой скрипт добовляет к ним CR. Т.е. в оригинале “строка”LF, а у меня “строка”CRLF. Я же ставлю бинарную запись почему так получается?…
necrozyablo
Добавил в конец

if os.path.isdir(filename):
print filename, “Directory!”
continue
data = open(filename, “rb”).read()
if ‘\0’ in data:
print filename, “Binary!”
continue
newdata = data.replace(“\r\n”, “\n”)
if newdata != data:
print filename
f = open(filename, “wb”)
f.write(newdata)
f.close()

Это стандартный конвертер виндоус ту юникс. Открывает находит CRLF и заменяет на LF
necrozyablo
Вообщем сколько не бился так и не могу понять в чём проблема. Хитрость в том что работает где то через раз. Т.е. качаю один тот же файл 10 раз скриптом в итоге в 50% случаев архив битый получается в других всё норм.
При этом если сравнивать файлы через нотпад++ то они полностью одинаковы даже переносы и концы строк. А вот бинарные различия есть из-за чего может проявляться данный баг?


Прошу у всех прощения оказывается код у меня был вполне рабочий. Просто сайт отдаёт битые архивы похоже специально. Защита у них такая от скачивания.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB