python爬取FTP文件,並批量下載到本地。


背景

室友讓我幫他從一個國外的FTP服務器上面爬一些數據。以前只是從網頁上面爬,還沒有從FTP服務器爬過,然后網上大概搜了一下,寫了個簡單的小demo。

----------------------------------------------------------------------------------------------------------------------------

 安利一款自己在用的連接工具:

IIS7服務器管理工具是一款windows全系、Linux系統下鏈接並操控VPS、VNC、FTP等遠程服務器、雲服務器。
界面簡單明了,操作易上手,功能強大,支持批量導入服務器,並批量打開,多窗口化管理,除此之外,加載本地硬盤、硬盤映射、加載服務器的聲音,遠程聲卡讀取等,完全實現各類場景使用,對於FTP鏈接界面,朋友FTP定時上傳,定時下載(也可以說定時上傳下載 定時備份),對於經常使用FTP的小伙伴來說,非常適用。
工具支持自動更新,壓縮包只有7.62M,方便簡潔,一步到位。
下載地址:http://yczm.iis7.com/?tscc

 

 

----------------------------------------------------------------------------------------------------------------------------

補充知識

  1. FTP(File Transfer Protocol,文件傳輸協議) 是TCP/IP協議組中的協議之一。FTP協議包括兩個組成部分,其一為FTP服務器,其二為FTP客戶端。其中FTP服務器用來存儲文件,用戶可以使用FTP客戶端通過FTP協議訪問位於FTP服務器上的資源。
  2. 默認情況下FTP協議使用TCP端口中的 20和21這兩個端口,其中20用於傳輸數據,21用於傳輸控制信息。
需要用到的庫是:ftplib
 
ftplib模塊官方文檔:https://docs.python.org/3/library/ftplib.html#module-ftplib

ftp模塊常用函數和命令

 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服務器,左邊是目錄,右邊是目錄里面的文件。

 

 

 

 

代碼如下:

由於這個服務器不需要賬號和密碼即可訪問,所以在進行鏈接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下載軟件去下載。

 

參加文章:https://www.jianshu.com/p/055bbe9a2e7d


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM