ã¬ã³ã¿ã«ãµãŒããŒãªã©ãå©çšããŠãWebãµã€ããéå¶ããŠããæ¹ã¯æ¯èŒçå€ãããšã ãããæè¿ã§ã¯ããããããªWebã¢ããªãããã®ã§ãWebäžã«å£²äžããŒã¿ãªã©ãèªåçæãããå Žåãå¢ããŠãããããã§ä»åã¯ãPythonã®ã¹ã¯ãªãããäœã£ãŠã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è²¢ç®è ç« åè³ãæè¡æžãå€ãå·çããŠããã

