メモ

テスト用サーバとしてanonymous利用ができる理化学研究所のftpサーバを見つけたのでこれで練習してみる

ftp://ftp.riken.go.jp/

とりあえず

  • アノニマスログイン
  • データ閲覧
  • データダウンロード

をやってみる

from ftplib import FTP

ftp = FTP('ftp.riken.go.jp')

# anonymous loginは空文字でやるらしい
ftp.login('', '')  

# このコマンドで現在のディレクトリの状態を見れる
ftp.nlst("")

"""
['cernlib',
 'FreeBSD',
 'GNU',
 'iris',
 'lang',
 'Lecture',
 'misc',
 'net',
 'NetBSD',
 'OpenBSD',
 'pc',
 'sagemath',
 'tex-archive',
 'X11',
 'CTAN',
 'Linux',
 'office',
 'welcome.msg',
 'pub',
 'HEADER.html']
"""

# HEADER.htmlをダウンロードしてみる
with open('./HEADER.html', 'wb') as fp:
    ftp.retrbinary('RETR HEADER.html', fp.write)


# 移動してみる
ftp.cwd("Linux")
ftp.nlst("")

"""
['centos',
 'opensuse',
 'ubuntu',
 'plamo',
 'linuxmint',
 'knoppix',
 'ubuntu-jp',
 'ubuntu-releases',
 'kernel',
 'kernel.org',
 'slackware',
 'manjaro',
 'porteus',
 'rpmfusion',
 'sabayon',
 'debian',
 'fedora',
 'redhat',
 'scientific',
 'remi',
 'mxlinux',
 'mxlinux-iso',
 'kali',
 'kali-images',
 'deepin',
 'ipfire',
 'gentoo-portage',
 'deepin-cd',
 'almalinux',
 'rocky',
 'centos-vault',
 'centos-stream',
 'springdale']
"""

ダウンロードの際のftp.retrbinary('RETR HEADER.html', fp.write) とかは独特なお作法だなとは思いつつもなんとなくは直感的に使えそうな気がしてきた

あと、ftpクライアントとかはwithで作ってあげた方が、コネクションのクローズとかを自動でやってくれるからきっちり作りたい時はもうちょい手を加えた方がいいかも

with ftplib.FTP() as ftp:
    try:
        ftp.connect(HOST, PORT) 
        ftp.login(USER, PASSWORD) 
        ftp.cwd(DIRECTORY)        
        with open(FILE_NAME, 'wb') as f:
            ftp.retrbinary('RETR ' + FILE_NAME, f.write) # 対象ファイルをバイナリ転送モードで取得
    except ftplib.all_errors as e:
        logger.error('FTP error = %s' % e)
    else:
        logger.debug('FTP success.')

こんな感じにするととてもしっかりしたものになりそうだね