いくつかの公開データファイルをダウンロードしようとしています。スクリーンスクレイプしてファイルへのリンクを取得します。ファイルはすべて次のようになります。
ftp://ftp.cdc.gov/pub/Health_Statistics/NCHS/nhanes/2001-2002/L28POC_B.xpt
RequestsライブラリのWebサイトにドキュメントが見つかりません。
いくつかの公開データファイルをダウンロードしようとしています。スクリーンスクレイプしてファイルへのリンクを取得します。ファイルはすべて次のようになります。
ftp://ftp.cdc.gov/pub/Health_Statistics/NCHS/nhanes/2001-2002/L28POC_B.xpt
RequestsライブラリのWebサイトにドキュメントが見つかりません。
requests
library doesn't support ftp links.
To download a file from FTP server you could:
import urllib
urllib.urlretrieve('ftp://server/path/to/file', 'file')
# if you need to pass credentials:
# urllib.urlretrieve('ftp://username:password@server/path/to/file', 'file')
Or:
import shutil
import urllib2
from contextlib import closing
with closing(urllib2.urlopen('ftp://server/path/to/file')) as r:
with open('file', 'wb') as f:
shutil.copyfileobj(r, f)
Python3:
import shutil
import urllib.request as request
from contextlib import closing
with closing(request.urlopen('ftp://server/path/to/file')) as r:
with open('file', 'wb') as f:
shutil.copyfileobj(r, f)
あなたはこれを試すことができます
import ftplib
path = 'pub/Health_Statistics/NCHS/nhanes/2001-2002/'
filename = 'L28POC_B.xpt'
ftp = ftplib.FTP("Server IP")
ftp.login("UserName", "Password")
ftp.cwd(path)
ftp.retrbinary("RETR " + filename, open(filename, 'wb').write)
ftp.quit()
urllib2を使用します。詳細については、doc.python.org の次の例を確認してください。
役立つチュートリアルのスニペットを次に示します。
import urllib2
req = urllib2.Request('ftp://example.com')
response = urllib2.urlopen(req)
the_page = response.read()
何人かの人々が指摘しているように、リクエストは FTP をサポートしていませんが、Python には FTP をサポートする他のライブラリがあります。requests ライブラリーを引き続き使用したい場合は、要求に FTP 機能を追加するrequests-ftpパッケージがあります。私はこのライブラリを少し使用しましたが、うまくいきます。ただし、ドキュメントにはコードの品質に関する警告がたくさんあります。0.2.0 の時点で、ドキュメントには、「このライブラリは、合計約 4 時間の作業でまとめられ、テストがなく、いくつかの醜いハックに依存しています」と記載されています。
import requests, requests_ftp
requests_ftp.monkeypatch_session()
response = requests.get('ftp://example.com/foo.txt')
最近の Python バージョンの非同期機能を利用したい場合は、aiftpを使用できます(より一般的な aiohttp ライブラリと同じライブラリおよび開発者のファミリから)。以下は、クライアント チュートリアルから抜粋したコード例です。
client = aioftp.Client()
await client.connect("ftp.server.com")
await client.login("user", "pass")
await client.download("tmp/test.py", "foo.py", write_into=True)
urllib2.urlopen
ftp リンクを処理します。