室友讓我幫他從一個國外的FTP服務器上面爬一些數據。之前只是從網頁上面爬,尚未從FTP服務器爬過,而後網上大概搜了一下,寫了個簡單的小demo。html
ftplib模塊官方文檔:https://docs.python.org/3/library/ftplib.html#module-ftplib
1 from ftplib import FTP # 導入ftplib模塊 2 ftp=FTP() # 獲取ftp變量 3 ftp.set_debuglevel(2) # 打開調試級別2,顯示詳細信息 4 ftp.connect("host","port") #鏈接的ftp sever服務器 5 ftp.login("usrname","password") # 用戶登錄 6 print(ftp.getwelcome()) # 打印歡迎信息 7 ftp.cmd("xxx/xxx") # 進入遠程目錄 8 ftp.retrbinaly("RETR filename.txt",file_handle,bufsize) # 接收服務器上文件並寫入本地文件 9 ftp.set_debuglevel(0) #關閉調試模式 10 ftp.quit() #退出ftp 11 12 ftp.cwd(ftppath) # 設置ftp當前操做的路徑 13 ftp.dir() # 顯示目錄下全部文件信息 14 ftp.nlst() # 獲取目錄下的文件,返回一個list 15 ftp.mkd(pathname) # 新建遠程目錄 16 ftp.pwd() # 返回當前所在路徑 17 ftp.rmd(dirname) # 刪除遠程目錄 18 ftp.delete(filename) # 刪除遠程文件 19 ftp.rename(fromname, toname) # 將fromname修更名稱爲toname。 20 ftp.storbinaly("STOR filename.txt",fid,bufsize) # 上傳目標文件 21 ftp.retrbinary("RETR filename.txt",fid,bufsize) # 下載FTP文件
下面是要取爬取的目標FTP服務器,左邊是目錄,右邊是目錄裏面的文件。python
因爲這個服務器不須要帳號和密碼便可訪問,因此在進行連接FTP服務器的時候沒有傳入帳號和密碼參數。其次,若是目標服務器中既有文件夾又有文件,就把函數ftpDownload中註釋的部分取消註釋,再稍加修改便可。服務器
1 import os 2 from ftplib import FTP 3 4 5 # 鏈接ftp服務器 6 def ftpConnect(ftpserver,port): 7 ftp = FTP() 8 try: 9 ftp.connect(ftpserver, port) 10 ftp.login() 11 except: 12 raise IOError('\n FTP connection failed, please check the code!') 13 else: 14 print(ftp.getwelcome()) # 打印登錄成功後的歡迎信息 15 print('\n+------- ftp connection successful!!! --------+') 16 return ftp 17 18 19 # 下載單個文件 20 def ftpDownloadFile(ftp, ftpfile, localfile): 21 bufsize = 1024 22 path = os.path.join(localfile,ftpfile) 23 with open(path, 'wb') as fid: 24 print('正在下載:',ftpfile) 25 ftp.retrbinary('RETR {0}'.format(ftpfile), fid.write, bufsize) # 接收服務器文件並寫入本地文件 26 print('下載完畢。') 27 return True 28 29 30 # 下載整個目錄下的文件 31 def ftpDownload(ftp, ftpath, localpath): 32 ''' 33 :param ftp: 登錄ftp返回的信息 34 :param ftpath: ftp中的目標路徑 35 :param localpath: 存放下載文件的本地路徑 36 :return: 37 ''' 38 print('Remote Path: {0}'.format(ftpath)) 39 if not os.path.exists(localpath): 40 os.makedirs(localpath) 41 ftp.cwd(ftpath) 42 print('成功進入ftp服務器:',ftpath) 43 for file in ftp.nlst(): 44 print('file:',file) 45 local = os.path.join(localpath, file) 46 file_path = os.path.join(ftpath, file) 47 if not os.path.exists(local): 48 os.makedirs(local) 49 ftp.cwd(file_path) 50 print('進入子目錄:--', file_path) 51 for sub_file in ftp.nlst(): 52 ftpDownloadFile(ftp, sub_file, local) 53 ftp.cwd('..')68 return True 69 70 71 # 退出ftp鏈接 72 def ftpDisConnect(ftp): 73 ftp.quit() 74 75 # 程序入口 76 if __name__ == '__main__': 77 # 輸入參數 78 ftpserver = 'www.ngs.noaa.gov' 79 ftpath = '/cors/rinex/2018/001/' 80 localpath = 'F:/data/' 81 82 ftp = ftpConnect(ftpserver, 21) 83 flag = ftpDownload(ftp, ftpath, localpath) 84 print(flag) 85 ftpDisConnect(ftp) 86 print("\n+-------- OK!!! --------+\n")
最後,可能因爲這個服務器是國外的緣由,下載速度奇慢無比,還不如用專門的FTP下載軟件去下載。cors