Есть несколько способов загрузки файла из интернета при помощи 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.
Домашнее чтение
- Python 101: Как скачать файл
- ftplib официальная документация
Я прошу прощения, я новичок в питоне. У меня выбило следущее:
ОтветитьУдалить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
Видите ли передо мной стоит задача. Нужно скачать файлы через 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()
http://www.wwpdb.org/remediation-downloads.html
УдалитьМне нужно как то не только скачать файлы через фтп а создать систему в которой скачивалис бы новые обновления. Это мировая база протеинов. Она необходима для медицыны. У меня есть уже работающий код который скачивает всю базу данных. При желании выложу код. Но нет скрипта который бы позволил обновлять. Полноценно обновлять. Как - то скачивать новые файлы только или измененные. Как это сделать - не представляю
http://www.wwpdb.org/remediation-downloads.html
УдалитьТам кстати есть адреса фтп.
Помогите, пожалуйста. Для медицины.
Добрый день!
УдалитьПо поводу обновления - не совсем понял. А ошибка говорит о том, что на сервере нет папки с названием "folderOne", что вполне ожидаемо. В команде ftp.cwd() в качестве параметра надо указать строку с именем папки, куда надо перейти.
Я просто думал, что может вы подскажите как вообще впринципе организовать на Питоне скачивание и обновление по ftp. Дело в том, что мировая база протеинов она вообще пополняется временами. Любые новые исследования в мире заносятся туда. Но в том проэкте в котором я помогаю необходимо как бы не только скрипт который собственно скачивает, а еще и переодически проверяет не вышло ли что-то новое из протеинов. А если вышло, то нужно не заново скачивать 70 гб из этой базы данных, а лишь то что вышло. Я по правде сам в растеренности как быть.. Просто по другому работать проэкту будет крайне сложно. Скачивание 70 гб заняло 2-ва дня. Тоесть
Удалитьне возможно. Мне посоветовали глянуть вот здесь - ftp://ftp.wwpdb.org/pub/pdb/data/biounit/coordinates/divided/
Здесь вроде бы список дат добавления файлов. Не знаю, помогите или подскажите, пожалуйста, где можно хоть почитать как организовать такое...
понял. эта база - это один файл или несколько? как именно происходит добавление новых протеинов? В принципе, можем по скайпу связаться, если затрудняетесь это описать
УдалитьЗатрудняюсь ответить. Видите ли это не коммерческий проэкт. Он сугубо научный, тоесть на него не выделяют почти никаких средств. Было принято решение использовать питон. Смысл - компьютерное прогнозирование деятельности вирусов и способы их проникновения в клетки. Но этим занимаюсь не я. Насколько я понимаю от меня сейчас требуется просто каким-то образом добится возможности дозагружать базу протеинов через ftp. Программист я слабый мягко говоря.
УдалитьМы используем мировую базу протеинов - http://www.wwpdb.org/remediation-downloads.html
Там указаны адреса ftp как к ним достучатся.
А сейчас от нас потребовали так как мировая база протеинов обновляется (с какой-то периодичностью), то значит необхидимо что бы в проэкт так же поступали эти обновления. Но при этом заново перезакачивать то что уже есть не имеет смысла. Тоесть мне сказали сделать скрипт который бы сначала загрузил всю базу по тем ftp, что указаны на сайте мирового банка протеинов (ссылка что выше), а потом еще и проверяла поступления в этот банк. Я собственно и нашел ваш сайт по запросу как скачать фтп файлы с помощью питона.
Это все что я знаю. Мне дали только те ссылки что я уже писал. =)
Еще посоветовали подумать про RCSB PDB, которые указаны на страничке сайта мирового банка протеинов человека. Сказали, что там есть видимо способ как-то сделать это. Рад буду любой помощи.
Я так думаю мой скрипт должен смотреть поступления в мировую базу протеинов здесь - ftp://ftp.wwpdb.org/pub/pdb/data/biounit/coordinates/divided/
УдалитьТам вроде бы их даты поступления
Я думал сделать как сделал этот человек - http://koldunov.net/?p=192. Но он рассматривал данные температуры для примера. Но я что-то совсем не разобрался
я посмотрел ещё и понял, что:
Удалить1) можно делать это через ftp, но это в любом случае будет не быстро, так как просмотр большого количества файлов всё равно будет медленным.
2) для каждого формата есть возможность получения файлов через rsync. Что гораздо удобнее. В таком случае можно использовать FreeNAS куда и скачивать файлы, а оттуда раздавать в локальную сеть
Если можно использовать только первый вариант - то могу подумать, как это сделать. Вопрос только в сроках.
Сроки не поджимают. У меня весь февраль на это.
УдалитьПодумайте, пожалуйста. Иногда решение приходит неожиданно. Я постараюсь регулярно заходить на ваш блог.
Удалитьто есть второй вариант не подходит? Если так, то буду думать над первым)
УдалитьНа самом деле любой вариант подходит. Главное что бы он заработал. Я просто совсем не разобрался во втором.
УдалитьВот ещё что надо знать: всё пользователи находятся в одной сети? Что-нибудь в этих файлах при работе они изменяют? Или только читают их? Отдельный сервер для данных или, на худой конец, виртуальную машину поставить можно?
УдалитьНасколько я понимаю, программа (скрипт) вообще будет использоваться на одном компьютере (во всяком случае вначале так это точно). Только чтение. Ведь мы же один раз загрузим эту БД всемирного банка - тоесть мы грубо говоря получим дистрибутивы (данные) наших протеинов. Менять их нельзя - это как то было бы и не логично. Мы же с телом человека работать будем. =)
УдалитьПользователь не будет менять содержимое файлов, ему важнее другое - проверять вышли ли новые протеины из всемирного банка и если "да", то дополнить к своей загруженной БД. Я так понимаю.
тогда, я думаю, я просто сделаю виртуальную машину, настрою на получение и раздачу файлов. ок, буду посмотреть
УдалитьДобрый вечер! У вас ничего пока что в голову не пришло?
Удалитья пока застопорился с настройкой rsync на FreeNAS + на работе завалы один за другим, так что до конца месяца могу просто не успеть(
УдалитьНе страшно. Я все равно до конца февраля уже ничего не сдам
УдалитьУ меня вот не настолько много файлов. Я решил сделать так: смотрим mdtm файла (то есть дату модификации файла на ftp), сохранять локально в базе, в следующий раз сравнивать сохраненную дату с датой mdtm. Есть разница качае/обновляем. В ваше случае можно сделать также, листом читать список файлов, потом по листу поочередно смотреть модификацию файлов, а также на новые. Это думаю задачу решит, но вот насчет оптимальности данного решения не уверен.
ОтветитьУдалитьПожалуйста скиньте полный код с описанием строк нужно скачать файл data.php с пути public_html/data
ОтветитьУдалить