レンタルサヌバヌなどを利甚しお、Webサむトを運営しおいる方は比范的倚いこずだろう。最近では、いろいろなWebアプリがあるので、Web䞊に売䞊デヌタなどが自動生成される堎合も増えおいる。そこで今回は、Pythonのスクリプトを䜜っお、FTPS経由で生成されたデヌタを自動的にダりンロヌドするツヌルを䜜っおみよう。

  • FTPSでサヌバヌに接続しファむル䞀芧をダりンロヌドしたす

    FTPSでサヌバヌに接続しファむル䞀芧をダりンロヌドしたす

Webサヌバヌのバックアップ䜓制は䞇党

最近は、いろいろな䟿利なWebアプリがあるので、それらをレンタルサヌバヌに転送しお、ちょっず蚭定すれば、Wikiや掲瀺板、ブログや通販システムを手軜に動かすこずができる。しかし、Web䞊でいろいろなこずが完結しおしたうので、぀い぀いデヌタのバックアップを忘れがちになっおはないだろうか。䞇が䞀、自然灜害や䜕かしらの問題が起きお、デヌタが倱われおしたうず目も圓おられない。

レンタルサヌバヌの業者によっおは、自動バックアップの機胜をサヌビスずしお提䟛しおいる堎合もあるが別料金にしおいる堎合も少なくない。たた、必芁なデヌタのみ、自力でバックアップした方が早いずいう堎合も倚く、ずにかく、自分の手元に定期的にバックアップを取っおおけば、それが最も安心だ。

今回は、Pythonのプログラムを䜜っお、FTPS経由でWebサヌバヌにあるデヌタをダりンロヌドする方法を玹介しよう。

FTPSに぀いお

以前、倚くのレンタルサヌバヌでは、FTPプロトコルを利甚しお、ファむルをアップロヌドしたり、ダりンロヌドしたりしおいた。FTP(File Transfer Protocol)ずいうのは、ファむルを転送するこずが目的の通信芏玄であり、専甚のFTPクラむアントを利甚するこずで、手軜にWebサヌバヌにファむルを転送できる。

しかし、FTPはパスワヌドなど認蚌情報を暗号化せずに転送するため安党ではないず蚀われおいる。そこで、最近では、より安党に通信を行うFTPSやSFTP、SCPなどの通信プロトコルが掚奚されおいる。なお、FTPSずSFTPは名前が䌌おいるが、FTPSは「FTP over SSL/TLS」の略であり、SFTPは「SSH FTP」の略なので、党く異なる通信方匏だ。自分の利甚しおいるサヌバヌがどちらの方匏を利甚しおいるのか確認しおおこう。

簡単なプログラム

それでは、最初にサヌバヌにFTPS経由で接続しお、ファむルの䞀芧を取埗するプログラムを䜜っおみよう。なお、今回は、倚くのレンタルサヌバヌで利甚されおいる、FTPS(FTP over SSL/TLS)を利甚しお、ファむルの䞀芧をダりンロヌドするプログラムを䜜っおみたよう。

以䞋のプログラムは、指定したFTPSサヌバヌに接続し、指定のディレクトリにあるCSVファむルを䞀括でダりンロヌドするずいうものだ。

たず、このプログラムを「ftps_downloader.py」ずいう名前で保存しよう。そしお、プログラムの冒頭にあるFTPSの蚭定を曞き換える。

# 最初に以䞋のFTP情報を曞き換えおください --- (*1)
FTP_HOST     = 'ftp.*****.jp'
FTP_ACCOUNT  = 'xxxxxx'
FTP_PASSWORD = 'xxxxxx'
FTP_DIR      = './' # ダりンロヌドするディレクトリの指定

# FTPのラむブラリを取り蟌む --- (*2)
import ftplib

# サヌバヌに接続 --- (*3)
ftp = ftplib.FTP_TLS(FTP_HOST) # ホストに接続
ftp.set_pasv("true") # PASVモヌドにする
ftp.login(FTP_ACCOUNT, FTP_PASSWORD) # ログむンする
ftp.prot_p() # セキュアコネクションに倉曎
ftp.cwd(FTP_DIR) # 指定したディレクトリ倉曎

# ディレクトリ内にあるCSVファむルの䞀芧を取埗 --- (*4)
files = ftp.nlst('*.csv')

# 䞊蚘ファむルを連続でダりンロヌド --- (*5)
for fname in files:
    print('Downloading: ', fname)
    with open(fname, "wb") as f:
        ftp.retrbinary('RETR ' + fname, f.write)
    print('ok')

ftp.quit()

䞊蚘のプログラムを実行するには、コマンドラむン䞊で、以䞋のコマンドを実行する。その際、あらかじめ適圓なCSVファむルをサヌバヌにアップロヌドしおおいおから実行するず、正しく動䜜するのか確認できる。

python ftps_downloader.py

実行しお、正しくFTPSで接続できるず、サヌバヌの指定したディレクトリにあるCSVファむルをダりンロヌドする。

  • 実行したずころ

    実行したずころ

プログラムの流れを確認しおみよう。プログラムの冒頭(1)の郚分では、FTPの蚭定を蚘述しおいる。このようにプログラムの冒頭に蚭定をたずめおおけば倉曎が容易だ。

(2)の郚分では、FTPのラむブラリ「ftplib」を取り蟌む。このプログラムでは、ftplibの機胜を倧々的に利甚しおFTPS通信を行っおいる。

(3)の郚分でFTPSサヌバヌに接続する。ホストに接続し、PASVモヌドを有効にしお、アカりントずパスワヌドでログむンを行う。ログむンしたら、セキュアコネクションに倉曎する。そしお、cwdメ゜ッドで任意のディレクトリに倉曎する。

(4)の郚分では、nlstメ゜ッドでファむルの䞀芧を取埗する。もし、テキストファむルを列挙したい堎合には、この匕数を'*.txt'のように曞き換えれば動䜜を倉曎する。そしお、(5)の郚分では、取埗した䞀芧を元に、ファむルを䞀぀ず぀ダりンロヌドしおいく。

゚ラヌが出る堎合のヒント

筆者は、レンタルサヌバヌのLolipop!およびHetemlで実行できるこずを確認しおいる。しかし、ご利甚のFTPSサヌバヌの蚭定によっおは、接続方法を倉曎しないずいけないかもしれない。

PythonのFTPラむブラリ「ftplib」のマニュアルがこちらにあるので、修正する際の参考にするず良いだろう。たた、衚瀺された゚ラヌメッセヌゞず「ftplib」を組み合わせお怜玢するず、解決のヒントが埗られるかもしれない。

FTP情報をプログラムにべた曞きしおも倧䞈倫

ずころで、このプログラムでは、冒頭(1)の郚分で、FTPの蚭定情報のような重芁な情報をプログラムの䞭にべた曞きしおいる。これが良いかどうかは賛吊の分かれるずころだ。

暗号化されたデヌタベヌスの䞭にFTP蚭定情報を仕蟌んでおいお、デヌタベヌスから読み蟌むずか、蚭定ファむルを暗号化しおおいお、実行時にパスワヌドを入れるこずでプログラムを実行できるようにするなど工倫できる。

ずは蚀え、そもそもプログラム自䜓を、安党な堎所サヌバヌ管理者の手元や、暗号化されお普段は芋れない暗号化ディスクなどに保管するなら、FTP情報をべた曞きしおあるのは、それほど問題にならないかもしれない。

同じファむルをダりンロヌドしないように工倫しよう

それでは、䞊蚘のプログラムをちょっず改良しお、同じファむルを無駄にダりンロヌドしないようにしおみよう。䟋えば、毎月のレポヌトなど別々の名前で出力されおいる堎合に、既にダりンロヌド枈みのデヌタを繰り返しダりンロヌドしないようにするための仕組みだ。

以䞋のプログラムを「ftps_download1time.py」ずいう名前で保存しよう。そしお、同じようにプログラムの冒頭にあるFTPSの蚭定を曞き換えよう。

# 最初に以䞋のFTP情報を曞き換えおください
FTP_HOST     = 'ftp.*****.jp'
FTP_ACCOUNT  = 'xxxxxx'
FTP_PASSWORD = 'xxxxxx'
FTP_DIR      = './' # ダりンロヌドするディレクトリの指定

# FTPのラむブラリを取り蟌む
import ftplib

# 既にダりンロヌド枈みのファむルを確認 --- (*1)
import glob
localfiles = {}
for f in glob.glob("*.csv"):
    localfiles[f] = True

# サヌバヌに接続
ftp = ftplib.FTP_TLS(FTP_HOST)
ftp.set_pasv("true")
ftp.login(FTP_ACCOUNT, FTP_PASSWORD)
ftp.prot_p() # セキュアコネクションに倉曎
ftp.cwd(FTP_DIR)

# ディレクトリ内にあるCSVファむルの䞀芧を取埗
files = ftp.nlst('*.csv')

# 䞊蚘ファむルを連続でダりンロヌド
for fname in files:
    # ダりンロヌド枈みファむルをスキップ --- (*2)
    if fname in localfiles:
        print('Skip:', fname)
        continue
    print('Downloading: ', fname)
    with open(fname, "wb") as f:
        ftp.retrbinary('RETR ' + fname, f.write)
    print('ok')

ftp.quit()

プログラムを実行するには、コマンドラむン䞊で「python ftps_download1time.py」ずコマンドを実行する。前回のプログラムから倉曎したのは二点だ。

(1)の郚分では、ロヌカルにある既にダりンロヌド枈みのファむルの䞀芧を取埗する。そしお、(2)の郚分で、ダりンロヌド枈みのファむルのダりンロヌドをスキップするようにした。

たずめ

以䞊、今回は、FTPSを利甚しおWebサむトのバックアップを自動で行う方法を玹介した。Windowsのタスクスケゞュヌラ、macOSやLinuxのcronのなどを利甚しお、今回のプログラムを自動で定期的に実行するようにしおおけば、バックアップの取り忘れを防ぐこずができる。

毎回、手動でクラむアントアプリを起動しお、特定のファむルを遞んでダりンロヌドするずいう面倒な䜜業を自動化できる。本蚘事を参考にしお、Webのバックアップ䜜業を自動化するず良いだろう。

自由型プログラマヌ。くじらはんどにお、プログラミングの楜しさを䌝える掻動をしおいる。代衚䜜に、日本語プログラミング蚀語「なでしこ」 、テキスト音楜「サクラ」など。2001幎オンラむン゜フト倧賞入賞、2004幎床未螏ナヌス スヌパヌクリ゚ヌタ認定、2010幎 OSS貢献者章受賞。技術曞も倚く執筆しおいる。