вторник, 24 июля 2012 г.

Python 101: Загрузка файла при помощи ftplib (Пароль)


Есть несколько способов загрузки файла из интернета при помощи Python. Одним из самых популярных способов является подключение к FTP серверу и скачивание файла. Этим мы и сейчас займёмся. Всё, что нам понадобится - стандартная установка Python. В неё включена библиотека ftplib, которой нам вполне хватит.

Скачиваем!

Скачать файл очень просто:
# ftp-ex.py
 
import os
from ftplib import FTP
 
ftp = FTP("www.myWebsite.com", "USERNAME", "PASSWORD")
ftp.login()
ftp.retrlines("LIST")
 
ftp.cwd("folderOne")
ftp.cwd("subFolder") # или ftp.cwd("folderOne/subFolder")
 
listing = []
ftp.retrlines("LIST", listing.append)
words = listing[0].split(None, 8)
filename = words[-1].lstrip()
 
# скачиваем файл
local_filename = os.path.join(r"c:\myfolder", filename)
lf = open(local_filename, "wb")
ftp.retrbinary("RETR " + filename, lf.write, 8*1024)
lf.close()
Давайте разбираться. Во-первых, нам надо подключиться к FTP серверу, так что необходимо передать URL сервера, логин и пароль. Если же Вы используете анонимный FTP сервер - то последние два аргумента можно опустить. Команда retrlines(“LIST”) выдаёт листинг папки. Команда cwd изменяет рабочую папку (“change working directory”), которую Вы используете для перехода в нужную для Вас папку. В следующей части показано как достаточно глупым способом получить имя файла. Вы можете использовать os.path.basename для тех же целей. Последняя часть показывает, собственно, как скачать файл. Обратите внимание, что файл открывается в режиме “wb” (двоичная запись). “8*1024″ - размер блоков для загрузки, хотя Python достаточно умён, чтобы выбрать подходящий размер.

Обратите внимание: Эта статья основана на документации Python для модуля ftplib и этот скрипт можно найти в папке с установленным Python: Tools/scripts/ftpmirror.py.

Домашнее чтение

21 комментарий:

  1. Я прошу прощения, я новичок в питоне. У меня выбило следущее:

    Traceback (most recent call last):
    File "C:\Users\Алексей\Desktop\GUNYA.py", line 8, in
    ftp.cwd("folderOne")
    File "C:\Python27\lib\ftplib.py", line 550, in cwd
    return self.voidcmd(cmd)
    File "C:\Python27\lib\ftplib.py", line 249, in voidcmd
    return self.voidresp()
    File "C:\Python27\lib\ftplib.py", line 224, in voidresp
    resp = self.getresp()
    File "C:\Python27\lib\ftplib.py", line 219, in getresp
    raise error_perm, resp
    error_perm: 550 Can't change directory to folderOne: No such file or directory

    ОтветитьУдалить
    Ответы
    1. Видите ли передо мной стоит задача. Нужно скачать файлы через ftp и потом добится обновления. Я попробовал начать с самого начала:

      import os
      from ftplib import FTP

      ftp = FTP("www.wwpdb.org")
      ftp.login()
      ftp.retrlines("LIST")

      ftp.cwd("folderOne")
      ftp.cwd("subFolder") # или ftp.cwd("folderOne/subFolder")

      listing = []
      ftp.retrlines("LIST", listing.append)
      words = listing[0].split(None, 8)
      filename = words[-1].lstrip()

      # скачиваем файл
      local_filename = os.path.join(r"c:\myfolder", filename)
      lf = open(local_filename, "wb")
      ftp.retrbinary("RETR " + filename, lf.write, 8*1024)
      lf.close()

      Удалить
    2. http://www.wwpdb.org/remediation-downloads.html
      Мне нужно как то не только скачать файлы через фтп а создать систему в которой скачивалис бы новые обновления. Это мировая база протеинов. Она необходима для медицыны. У меня есть уже работающий код который скачивает всю базу данных. При желании выложу код. Но нет скрипта который бы позволил обновлять. Полноценно обновлять. Как - то скачивать новые файлы только или измененные. Как это сделать - не представляю

      Удалить
    3. http://www.wwpdb.org/remediation-downloads.html
      Там кстати есть адреса фтп.
      Помогите, пожалуйста. Для медицины.

      Удалить
    4. Добрый день!
      По поводу обновления - не совсем понял. А ошибка говорит о том, что на сервере нет папки с названием "folderOne", что вполне ожидаемо. В команде ftp.cwd() в качестве параметра надо указать строку с именем папки, куда надо перейти.

      Удалить
    5. Я просто думал, что может вы подскажите как вообще впринципе организовать на Питоне скачивание и обновление по ftp. Дело в том, что мировая база протеинов она вообще пополняется временами. Любые новые исследования в мире заносятся туда. Но в том проэкте в котором я помогаю необходимо как бы не только скрипт который собственно скачивает, а еще и переодически проверяет не вышло ли что-то новое из протеинов. А если вышло, то нужно не заново скачивать 70 гб из этой базы данных, а лишь то что вышло. Я по правде сам в растеренности как быть.. Просто по другому работать проэкту будет крайне сложно. Скачивание 70 гб заняло 2-ва дня. Тоесть
      не возможно. Мне посоветовали глянуть вот здесь - ftp://ftp.wwpdb.org/pub/pdb/data/biounit/coordinates/divided/
      Здесь вроде бы список дат добавления файлов. Не знаю, помогите или подскажите, пожалуйста, где можно хоть почитать как организовать такое...

      Удалить
    6. понял. эта база - это один файл или несколько? как именно происходит добавление новых протеинов? В принципе, можем по скайпу связаться, если затрудняетесь это описать

      Удалить
    7. Затрудняюсь ответить. Видите ли это не коммерческий проэкт. Он сугубо научный, тоесть на него не выделяют почти никаких средств. Было принято решение использовать питон. Смысл - компьютерное прогнозирование деятельности вирусов и способы их проникновения в клетки. Но этим занимаюсь не я. Насколько я понимаю от меня сейчас требуется просто каким-то образом добится возможности дозагружать базу протеинов через ftp. Программист я слабый мягко говоря.
      Мы используем мировую базу протеинов - http://www.wwpdb.org/remediation-downloads.html
      Там указаны адреса ftp как к ним достучатся.
      А сейчас от нас потребовали так как мировая база протеинов обновляется (с какой-то периодичностью), то значит необхидимо что бы в проэкт так же поступали эти обновления. Но при этом заново перезакачивать то что уже есть не имеет смысла. Тоесть мне сказали сделать скрипт который бы сначала загрузил всю базу по тем ftp, что указаны на сайте мирового банка протеинов (ссылка что выше), а потом еще и проверяла поступления в этот банк. Я собственно и нашел ваш сайт по запросу как скачать фтп файлы с помощью питона.
      Это все что я знаю. Мне дали только те ссылки что я уже писал. =)
      Еще посоветовали подумать про RCSB PDB, которые указаны на страничке сайта мирового банка протеинов человека. Сказали, что там есть видимо способ как-то сделать это. Рад буду любой помощи.

      Удалить
    8. Я так думаю мой скрипт должен смотреть поступления в мировую базу протеинов здесь - ftp://ftp.wwpdb.org/pub/pdb/data/biounit/coordinates/divided/
      Там вроде бы их даты поступления

      Я думал сделать как сделал этот человек - http://koldunov.net/?p=192. Но он рассматривал данные температуры для примера. Но я что-то совсем не разобрался

      Удалить
    9. я посмотрел ещё и понял, что:
      1) можно делать это через ftp, но это в любом случае будет не быстро, так как просмотр большого количества файлов всё равно будет медленным.
      2) для каждого формата есть возможность получения файлов через rsync. Что гораздо удобнее. В таком случае можно использовать FreeNAS куда и скачивать файлы, а оттуда раздавать в локальную сеть

      Если можно использовать только первый вариант - то могу подумать, как это сделать. Вопрос только в сроках.

      Удалить
    10. Сроки не поджимают. У меня весь февраль на это.

      Удалить
    11. Подумайте, пожалуйста. Иногда решение приходит неожиданно. Я постараюсь регулярно заходить на ваш блог.

      Удалить
    12. то есть второй вариант не подходит? Если так, то буду думать над первым)

      Удалить
    13. На самом деле любой вариант подходит. Главное что бы он заработал. Я просто совсем не разобрался во втором.

      Удалить
    14. Вот ещё что надо знать: всё пользователи находятся в одной сети? Что-нибудь в этих файлах при работе они изменяют? Или только читают их? Отдельный сервер для данных или, на худой конец, виртуальную машину поставить можно?

      Удалить
    15. Насколько я понимаю, программа (скрипт) вообще будет использоваться на одном компьютере (во всяком случае вначале так это точно). Только чтение. Ведь мы же один раз загрузим эту БД всемирного банка - тоесть мы грубо говоря получим дистрибутивы (данные) наших протеинов. Менять их нельзя - это как то было бы и не логично. Мы же с телом человека работать будем. =)
      Пользователь не будет менять содержимое файлов, ему важнее другое - проверять вышли ли новые протеины из всемирного банка и если "да", то дополнить к своей загруженной БД. Я так понимаю.

      Удалить
    16. тогда, я думаю, я просто сделаю виртуальную машину, настрою на получение и раздачу файлов. ок, буду посмотреть

      Удалить
    17. Добрый вечер! У вас ничего пока что в голову не пришло?

      Удалить
    18. я пока застопорился с настройкой rsync на FreeNAS + на работе завалы один за другим, так что до конца месяца могу просто не успеть(

      Удалить
    19. Не страшно. Я все равно до конца февраля уже ничего не сдам

      Удалить
  2. У меня вот не настолько много файлов. Я решил сделать так: смотрим mdtm файла (то есть дату модификации файла на ftp), сохранять локально в базе, в следующий раз сравнивать сохраненную дату с датой mdtm. Есть разница качае/обновляем. В ваше случае можно сделать также, листом читать список файлов, потом по листу поочередно смотреть модификацию файлов, а также на новые. Это думаю задачу решит, но вот насчет оптимальности данного решения не уверен.

    ОтветитьУдалить