[英]Setting up proxy with ftp with Python
我們正在嘗試開發一個Python模塊,該模塊將命中FTP服務器並將文件下載到我的本地計算機上。 當我們嘗試運行模塊的FTP部分時,它正在超時。
我們有一個代理服務器(簡稱為“ officeproxy.com:8080”)來處理此問題,並且在使用FileZilla或Windows資源管理器之類的FTP客戶端訪問FTP站點時,我們是成功的。
讓我們將ftp站點稱為“ ftp.cal.com”。 用戶名是“ papa”。 密碼是“ tango123”。
到目前為止,我們有:
Proxy = officeproxy.com:8080
FTP = ftp.cal.com
User = papa
PW = tango123
以上不是真實實體,因此如果您想將它們換成真實實體,請成為我的客人。
我需要一個模塊來首先加載代理服務,然后運行FTP部分。
我正在運行Python 2.7。
我到處搜索並獲得了此代碼。 OP表示,這只是測試與FTP的連接並讀取一個文件的簡短模塊。
(注意:我故意將#
放在很多地方以顯示我不知道填寫的內容或其他原因):
import urllib2
# I have filled in the proxy info
proxy_host = 'officeproxy.com:8080'
# I don't think this needs any modification, right?
proxy_handler = urllib2.ProxyHandler({'ftp': proxy_host})
# ditto here
proxy_auth_handler = urllib2.ProxyBasicAuthHandler()
# now here is where I am unsure what to put;
# also, I really need FTP user and FTP password, and NOT Proxy...
# so what do I need to change here?
proxy_auth_handler.add_password(None, proxy_host, proxy_user, proxy_passwd)
opener_thru_proxy = urllib2.build_opener(proxy_handler, proxy_auth_handler)
# I filled in this part
conn = opener_thru_proxy.open('ftp://ftp.cal.com/hello.txt')
# I don't believe I need to change this, right?
print conn.read()
注意,我在SO上發現了一些類似的 問題 ,但是當OP請求一個詳細的,初學者級的答案時,我決定發布此問題。
為了澄清,這是我對要完成的工作的理解:
一種選擇是使用ftplib
軟件包。 諸如Python之類的流行語言的最大優點之一是提供了特定功能的良好實現的廣泛選擇軟件包。 在這種情況下,一個ftp客戶端:
import ftplib # 1
ftp = ftplib.FTP("officeproxy.com:8080") # 2
ftp.set_debuglevel(1) # 3
ftp.login("papa", "tango123") # 4
filename = "hello.txt"
f = open(filename, 'wb') # 5
ftp.retrbinary("RETR " + filename , f.write) # 6
f.close() # cleanup file handle
ftp.quit() # cleanup ftp client
這是代碼的作用:
ftplib
軟件包。
FTP.set_debuglevel(level)
:0
,不產生調試輸出...1
產生適中的調試輸出...2
或更高版本產生最大的調試輸出
"RETR" + filename
是發送到FTP服務器的命令,在本例中為RETR hello.txt
。 第二個參數f.write
是您希望ftp.retrbinary
函數在ftp.retrbinary
來自服務器的數據塊時調用的回調函數。 在其實現中,每當retrbinary
有數據時,它將調用f.write(data)
,其中data
是它擁有的最新數據塊。 要了解更多有關回調在Python中的工作方式的信息,請參見Python 中的異步API簡介。 我希望這對您有用,並且希望答案足夠詳細,以使您了解它的工作原理。 如果它不起作用,請發布堆棧跟蹤輸出以獲取錯誤信息。
這個問題有點過時了,但是我本人沒有找到任何最新的解決方案,因此我想我會提供找到的解決方案。 就我而言,辦公室代理需要憑據,因此這些憑據將包含在解決方案中。 我想如果您的代理不需要憑據,就可以刪除proxy_user和proxy_passwd。 我在Python 3.6中工作的代碼是:
from ftplib import FTP
ftp = FTP("officeproxy.com")
ftp.set_debuglevel(1)
ftp.login(user='ftp_user@ftp_host proxy_user', passwd='ftp_passwd', acct='proxy_passwd')
# Do whatever you need on the FTP server here
ftp.quit()
我希望這有幫助。
將其添加為最重要的結果之一,並努力尋找解決方案。
如果您的代理服務器是HTTP代理服務器,並且您需要對其進行身份驗證 ,則方法如下:
import socks
import socket
socks.set_default_proxy(socks.HTTP,
proxy_host,
proxy_port,
username=proxy_username,
password=proxy_password
)
socket.socket = socks.socksocket
ftp = FTP(ftp_host)
ftp.set_debuglevel(1)
ftp.login(
user=ftp_user,
passwd=ftp_password
)
否則,對於FTP代理,馬丁的答案有效。 您也可以在FileZilla中看到FTP代理的行為,這將有助於為您的要求編碼
希望這對某人有幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.