1 Востаннє редагувалося frz (03.06.2021 00:20:58)

Тема: завантаження файлів з фтп - таймаут

Завантажую файли з фтп - в цілому працює, однак коли в папці трапляється великий файл, то отримую час від часу 421 Connection timed out

from ftplib import FTP
import wget
var_host = 'example.com'
var_path = 'some_path'
var_user = "user1"
var_password = "pass1"
ftp = FTP(var_host)
ftp.login(user=var_user, passwd=var_password)
ftp.cwd(var_path)
files = ftp.nlst()
for file in files: 
    print(file)
    link = 'ftp://' + var_user + ':' + var_password + '@' + var_host + var_path + file
    wget.download(link, out=file)
    print("ok... " + file)
print("ok all files!")
ftp.quit()

Поки що лягаю спати і буду пізніше фіксити, а за цей час може в когось є ідея. Так, я знаю що можна обійтися без wget і тоді буде більше свободи дій, та це я нашвидкуруч накидав. Можливо, є варіант загорнути wget.download в thread і таким чином гнучкіше керувати таймаутами+retry.

----

Додатково трохи погрався із sftp і зрозумів що так просто не вийде накидати код через хитромудру реалізацію TLS, тому поки що користуюся несекурним простим ftp...

Подякували: Chemist-i, leofun012

2

Re: завантаження файлів з фтп - таймаут

Ви робите одну роботу двічі: один раз логінитеся (вручну) через FTP, другий - через wget. Все ж якщо вже через FTP, то є retrbinary, тоді сервер бачитиме з'єднання і не вимикатиме його.
urllib/urllib2 вміють в FTP, зокрема, запит до директорії повертає стрічку з лістингом.
Ще можна в іншому потоці відправляти NOOP раз на пів хвилини.
Інше очевидне рішення - в циклі зберегти список файлів, а потім згодувати їх wget-у.

Подякували: frz, leofun012

3

Re: завантаження файлів з фтп - таймаут

Вибачте, у мене завжди помилки описуються якимись не-ITшними образами, от і тут: шахтар довго кувалдою і зубилом довбає дірку в стіні, обережно зрізає різні камінці, що стирчать із неї, відколює нерівності, мало не шліфує, а потім закладає туди динаміт... Отак і ви: довго і детально встановлюєте з'єднання FTP, а коли отримали звідти назву файлу - кидаєте туди wget.

Подякували: frz, leofun012

4 Востаннє редагувалося koala (03.06.2021 12:20:13)

Re: завантаження файлів з фтп - таймаут

Так, про NOOP і список файлів я трохи поспішив. Вам wget повертає 421? Цікаво, ніби він уміє нормально таке робити. Може, йому основне FTP з'єднання заважає? Спробуйте просто закрити з'єднання перед wget-ом:

files = ftp.nlst()
ftp.quit() #роз'єднуємося
for file in files: 
    print(file)
    link = 'ftp://' + var_user + ':' + var_password + '@' + var_host + var_path + file
    wget.download(link, out=file) #і хай тепер wget сам тримає з'єднання
    print("ok... " + file)
print("ok all files!")
Подякували: frz1