關於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