1. 程式人生 > >關於ftp的檔案批量下載(包括資料夾和檔案)的多種方法

關於ftp的檔案批量下載(包括資料夾和檔案)的多種方法

博主純手工打字,轉載請註明出處!各位大佬不喜勿噴!

先籠統說一下本文針對ftp協議下的資料夾和檔案遞迴下載方法:

(I)使用FileZilla工具進行下載;

(II)使用指令碼爬取;

(III)使用命令直接下載;

(IV)python指令碼直接下載。

       最近需要下載一批新的韌體,本來是準備寫指令碼爬取的,但是使用scrapy框架爬取的時候,發現並不能有效地支援ftp協議的情況,貌似很好地支援http和https協議的網址。

(1)通過向大佬同學東神諮詢和學習後,得知存在一些下載工具或者使用命令準們針對ftp協議的檔案傳輸下載會更好。

在windows和linux或者os系統下,一個很好的圖形介面工具是FileZilla,能夠很好地支援資料夾和檔案的遞迴下載:

必要的時候需要輸入使用者名稱和密碼。對於這個ftp伺服器,暫時還是不需要的。

(2)然而使用scrapy框架爬取,只是針對網頁內容的爬取比較好。當然也存在一些擴充套件外掛,支援ftp的爬取。如下面這個部落格裡面就提供了一個很好的使用案例和方法。

#! -*- encoding:utf-8 -*-
#file is 'ftp.py', sys.path:'src.middleware.ftp.FtpDownloadHandler'

__author__ = 'C.L.TANG'
import urllib2
from scrapy.http import Response


class FtpDownloadHandler(object):

    def download_request(self, request, spider):
        """Return a deferred for the HTTP download"""
        handler = urllib2.FTPHandler()
        req = urllib2.Request(url = request.url)
        opener = urllib2.build_opener(handler)
        f = opener.open(req)
        b = f.read()
        print len(b)
        respcls = Response(url = request.url, body=b, request = request)
        return respcls

##然後在自己專案的settings.py檔案中指定:

DOWNLOAD_HANDLERS = {'ftp' :  'src.middleware.ftp.FtpDownloadHandler'}
##在爬蟲類中有:

#! -*- encoding:utf-8 -*-
from scrapy.selector import HtmlXPathSelector
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.http import Request


class ShopSpider(CrawlSpider):
    name = '958shop'
    allowed_domains = ['958shop.com']

    def start_requests(self):
        request = Request(url = 'ftp://b9:
[email protected]
/2011/11/15/52076863815926.jar') request.callback = self.down_debug_html return [request,] def down_debug_html(self, response): #在這裡呼叫存入下載連結地址的方法. #file_name = response.meta['file_name'] print response.url filename = 'debug.html' open(filename, 'wb').write(response.body)

針對上面的這個方法,本博主還沒有著手實現。有志者可以著手試試!順便寫個留言部落格地址讓我膜拜一下。

(3)關於使用命令於是就各種百度查詢,使用命令都需要知道ftp伺服器的使用者名稱和密碼,但是我一臉懵逼,因為我現在只知道對應的ftp地址,哪裡知道什麼使用者名稱和密碼。這就很氣了!

於是就使用wireshark進行抓包分析和觀望,得到了使用者名稱和密碼:

username = anonymous, [email protected]

但是第二次我再次抓包的時候,發現登入的密碼已經變成了[email protected],我嘗試把密碼改為這個進行測試的時候,結果顯示也是能夠直接獲取資料的。然後我就猜測匿名登入的時候密碼為空的時候,於是我就測試一下發現的確密碼為空的時候是可以登入,所以驗證密碼為任意。

於是我又大膽地猜測如果使用者名稱也為空的話,是不是能通過?於是我就把使用者名稱和密碼都置為空,但是好像無法登陸!

於是我又猜測,是不是隻用使用者名稱不為空就可以呢?我就把使用者名稱改為不是anonymous這個內容,結果報錯了:

就構造了下面這條連結,但是並非那麼地好用,因為下載速度很是慢啊。

wget -r -nH -P ./ ftp://ftp2.dlink.com/PRODUCTS/* --f --ftp-user=anonymous [email protected]

在接下來本博主準備寫一個指令碼處理問價,下載檔案內容,猜測應該會好用很多。

(4)python指令碼下載

本博主寫的python下載內容是參考這個的,由於專案內容,暫時不便放出來。需要的同學參考這個自己寫一個吧。

# -*- encoding: utf8 -*-
import os
import sys
import ftplib 
sys.setdefaultencoding('gbk')
XFER_FILE = 'FILE'  
_XFER_DIR = 'DIR'  
class FTPSync(object):
    def __init__(self):
        self.conn = ftplib.FTP('192.168.8.5', 'tools', 'tools')
        self.conn.cwd('/meteor')        # 遠端FTP目錄
        os.chdir('./aa')        # 本地下載目錄
    def get_dirs_files(self):
        u''' 得到當前目錄和檔案, 放入dir_res列表 '''
        dir_res = []
        self.conn.dir('.', dir_res.append)
        files = [f.split(None, 8)[-1] for f in dir_res if f.startswith('-')]
        dirs = [f.split(None, 8)[-1] for f in dir_res if f.startswith('d')]
        return (files, dirs)
    def walk(self, next_dir):
        print 'Walking to', next_dir
        self.conn.cwd(next_dir)
        try:
            os.mkdir(next_dir)
        except OSError:
            pass
        os.chdir(next_dir)
        ftp_curr_dir = self.conn.pwd()
        local_curr_dir = os.getcwd()
        files, dirs = self.get_dirs_files()
        print "FILES: ", files
        print "DIRS: ", dirs
        for f in files:
            print next_dir, ':', f
            outf = open(f, 'wb')
            try:
                self.conn.retrbinary('RETR %s' % f, outf.write)
            finally:
                outf.close()
        for d in dirs:
            os.chdir(local_curr_dir)
            self.conn.cwd(ftp_curr_dir)
            self.walk(d)
    def run(self):
        self.walk('.')
def main():
    f = FTPSync()
    # f.run()
if __name__ == '__main__':
    main()
 
 
class Xfer(object):  
    ''''' 
    @note: upload local file or dirs recursively to ftp server 
    '''  
    def __init__(self):  
        self.ftp = None  
      
    def __del__(self):  
        pass  
      
    def setFtpParams(self, ip, uname, pwd, port = 21, timeout = 60):          
        self.ip = ip  
        self.uname = uname  
        self.pwd = pwd  
        self.port = port  
        self.timeout = timeout  
      
    def initEnv(self):  
        if self.ftp is None:  
            self.ftp = ftplib.FTP()  
            print '### connect ftp server: %s ...'%self.ip  
            self.ftp.connect(self.ip, self.port, self.timeout)  
            self.ftp.login(self.uname, self.pwd)   
            print self.ftp.getwelcome()  
      
    def clearEnv(self):  
        if self.ftp:  
            self.ftp.close()  
            print '### disconnect ftp server: %s!'%self.ip   
            self.ftp = None  
      
    def uploadDir(self, localdir='./', remotedir='./'):  
        if not os.path.isdir(localdir):    
            return  
        self.ftp.cwd(remotedir)   
        for file in os.listdir(localdir):  
            src = os.path.join(localdir, file)  
            if os.path.isfile(src):  
                self.uploadFile(src, file)  
            elif os.path.isdir(src):  
                try:    
                    self.ftp.mkd(file)    
                except:    
                    sys.stderr.write('the dir is exists %s'%file)  
                self.uploadDir(src, file)  
        self.ftp.cwd('..')  
      
    def uploadFile(self, localpath, remotepath='~/test'):  
        if not os.path.isfile(localpath):    
            return  
        print '+++ upload %s to %s:%s'%(localpath, self.ip, remotepath)  
        self.ftp.storbinary('STOR ' + remotepath, open(localpath, 'rb'))  
      
    def __filetype(self, src):  
        if os.path.isfile(src):  
            index = src.rfind('\\')  
            if index == -1:  
                index = src.rfind('/')                  
            return _XFER_FILE, src[index+1:]  
        elif os.path.isdir(src):  
            return _XFER_DIR, ''          
      
    def upload(self, src):  
        filetype, filename = self.__filetype(src)  
          
        self.initEnv()  
        if filetype == _XFER_DIR:  
            self.srcDir = src              
            self.uploadDir(self.srcDir)  
        elif filetype == _XFER_FILE:  
            self.uploadFile(src, filename)  
        self.clearEnv()   
                 
  
if __name__ == '__main__':  
    srcDir = r"/Users/meteor/Desktop/gitlab/aa"  
# srcFile = r'C:\sytst\sar.c'  
    xfer = Xfer()  
    xfer.setFtpParams('192.168.8.5', 'tools', 'tools')  
    xfer.upload(srcDir)      
    xfer.upload(srcFile)  

參考連結:

相關推薦

關於ftp檔案批量下載包括資料檔案多種方法

博主純手工打字,轉載請註明出處!各位大佬不喜勿噴! 先籠統說一下本文針對ftp協議下的資料夾和檔案遞迴下載方法: (I)使用FileZilla工具進行下載; (II)使用指令碼爬取; (III)使用命令直接下載; (IV)python指令碼直接下載。       

實現對easyui-datagrid的資料批量修改包括修改內容刪除

先上一個easyui-datagrid的資料。 而我們要實現的功能是1.對三條記錄進行批量的刪除和批量的修改狀態。 1.批量的刪除 我們選擇傳入三條記錄的id值,並利用service層的deleteByid方法進行刪除。 具體程式碼如下所示。 先上service層程式碼:

Qt總結之三:磁碟檔案操作、遍歷資料檔案目錄,並過濾獲取檔案資訊、字尾名、字首名

前言 本節內容主要包括磁碟容量檢測、磁碟內指定或特定檔案的操作 話不多說,先上效果圖 共分為兩個部分,第一部分是檢測磁碟容量,第二部分是篩選磁碟內指定檔案(test.txt)或特定檔案(.txt / .png型別檔案) 獲取磁碟容量關鍵函式:【fileapi.h】 

FTPClient的使用 ftp資料檔案下載,上傳,複製備份

原創文章,轉載請註明出處 下例亮色部分分別是下載,複製備份,上傳的方法,其他多餘的程式碼為路徑處理,可根據自己的情況處理: 如何登陸退出FTP請看上一篇,     類開始的全域性變數         private static FTPClient ftpClient =

Linux 刪除資料檔案的命令強制刪除包括非空檔案

linux刪除目錄很簡單,很多人還是習慣用rmdir,不過一旦目錄非空,就陷入深深的苦惱之中,現在使用rm -rf命令即可。直接rm就可以了,不過要加兩個引數-rf 即:rm -rf 目錄名字-r 就

圖文SVN檔案/資料圖示顏色不顯示問題解決辦法、SVN資料檔案狀態圖示顯示不正常

svn檢出的資料夾上沒有綠色的對號,或者紅色的感嘆號標識。仍然是windows預設的資料夾。 解決方法: 首先,用win+R鍵開啟 執行 視窗,裡面輸入regedit(登錄檔),確定進入 首先我們找到localmachine,點選進入,下面找到software,展開下面的節點 在sof

Qt總結之二:遍歷資料檔案目錄,並過濾獲取檔案資訊、字尾名、字首名

前言 需要在特定目錄或磁碟下查詢特定檔案 一、篩選目錄 (一)單一目錄下遍歷,篩選特定檔案 QDir dir("./SaveFiles"); QFileInfoList list = dir.entryInfoList(); (二)裝置所有磁碟中遍歷 QF

Qt總結之一:遍歷資料檔案目錄,並過濾獲取檔案資訊、字尾名、字首名

一、採用遞迴和QDir實現資料夾下所有檔案遍歷的方法 #include <QDir> bool FindFile(const QString & path) {     QDir dir(path);   if (!dir.exists(

Android使用okhttp封裝多檔案批量下載 帶進度條,取消下載

在網上搜索了很多關於okhttp封裝的網路框架,唯獨沒找到完美實現了多個檔案批量下載的案例,當前使用的最多的也就是okhttp了,所以,我學習了各位大神的封裝後,自己也試著封裝了一個關於okhttp的網路請求框架,方便專案中的使用。 實現的功能基本如下:

批量重新命名一個資料檔案,例如:img下有600張圖片,對其重名

import java.io.File; import java.util.ArrayList; import java.util.Arrays; public class FileUtilDeal { public static void main(String[]

Qt實現遍歷資料檔案目錄,並過濾獲取檔案資訊、字尾名、字首名

下面是自己的實際工作中寫的程式碼,請大家斧正#ifndefINQUIRYDIALOG_H#defineINQUIRYDIALOG_H#include<QDialog>#include<QFileDialog>#include<QDir>#i

Linux下使用touch批量修改資料檔案的時間

下面只有兩個引數存在差別,d與f,d表示資料夾,f表示檔案。 查詢當前目錄下,所有的資料夾以及子資料夾,並把所有的資料夾及子資料夾設定成755,包括當前目錄 find ./ -type d -exe

JAVA之File類 獲取一個目錄下的所有資料檔案包括資料檔案

package ioTest.io3; import java.io.File; /* * 獲取一個目錄下的所有資料夾和檔案,包括子資料夾和子檔案 。 * 並將資料夾和檔名稱列印在控制檯上面。並且要顯示檔案目錄的層級 * 注:運用了遞迴的演算法。 */ public

c 判斷檔案資料是否存在,多種方法, 為什麼從一開始就不直接來個統一的呢?

具體內容,請看: https://blog.csdn.net/u012494876/article/details/51204615   判斷檔案或資料夾是否存在,竟然有這麼多方法: GetFileAttributes() CreateFile() _access() Find

docker部署nginx並且掛載資料檔案

轉載來源:https://blog.csdn.net/qq_26614295/article/details/80505246 這段時間在研究docker,在部署nginx時遇到了坑,最主要的問題是在掛載檔案和資料夾的時候不知道怎麼掛載,經過反覆實驗以及檢視網上的教程,先總結如下: 1首先p

【筆記】window下 使用c++遍歷資料及其子資料檔案,並列印檔案路徑及各檔案內容

這兩天一直在學習如何使用c++遍歷資料夾、讀取檔案內容和寫入檔案。 話不多說,直接上程式碼 /** 檔案功能:遞迴遍歷資料夾,遍歷資料夾及其子資料夾和檔案.列印資料夾名稱、檔名稱和檔案數目*** 參考:https://www.cnblogs.com/collectionne/p/679230

【Tools】TortoiseGit資料檔案狀態圖示不顯示問題

00.目錄 01. 執行環境 TortoiseGit版本: TortoiseGit-2.6.0.0-64bit.msi Git版本: Git-2.16.2-64-bit.exe 02. 問題描述 首先在桌面新建一個資料夾叫“Project”

myBatis 配置檔案 批量操作增、刪、改操作資料庫 oracle 11g

1、更新 <update id="batchUpdate" parameterType="java.util.List"> <foreach collection="list" item="item" index="index" open="

讀取資料檔案路徑簡單的小功能

using System.IO; //定義變數   private Stream myStream;  private void button2_Click(object sender, EventArgs e)         {

java 同時建立多個資料檔案

public void demo1() { try { File dir = new File("d:\\abc\\bcd"); if (!dir.exists()) { dir.mkdirs(); } File file = new