2011-01-03 8 views
3

urllib2を使用すると、Webサーバーからhttp応答を得ることができます。そのサーバーが単にファイルのリストを保持していれば、ファイルを解析して個別にダウンロードすることができます。しかし、私はファイルを解析する最も簡単で最も平凡な方法がどれくらいあるのかよくわかりません。httpサーバのファイルをPythonでダウンロードする

urllib2のurlopen()メソッドを使用して、汎用ファイルサーバーリストの全体的なHTTP応答を取得したら、どのように各ファイルをきれいにダウンロードできますか?

+0

この「ファイルのリスト」からサンプルソースを3行または4行分与えることになりますので、どのような余分な書式が関係するのか確認できますか? –

答えて

3

あなたがリクエストしているURLがディレクトリリストであることを保証できますか?もしそうなら、あなたはディレクトリリストの形式を保証できますか?

もしそうなら、lxmlを使用して、返されたドキュメントを解析し、ファイルへのパスを保持するすべての要素を見つけて、それらの要素を反復処理して各ファイルをダウンロードすることができます。

+3

+1。一部の人々はlxmlの代わりに美味しいスープを使用するのが好きです。 –

+1

そしていくつかはまだpyquery;を使っています) –

2

はここでテストされていないソリューションです:

import urllib2 

response = urllib2.urlopen('http://server.com/file.txt') 
urls = response.read().replace('\r', '').split('\n') 

for file in urls: 
    print 'Downloading ' + file 

    response = urllib2.urlopen(file) 

    handle = open(file, 'w') 
    handle.write(response.read()) 
    handle.close() 

それは未テストだし、それはおそらく動作しません。これは、実際のリストが別のファイルの中にあると仮定しています。がんばろう!

9

Urllib2でファイルのリストを取得できます。大量のバイナリファイルをダウンロードする場合は、PycURL http://pycurl.sourceforge.net/をお勧めします。これは私のIISベースのファイルサーバー用に動作します:

import re 
import urllib2 
import pycurl 

url = "http://server.domain/" 
path = "path/" 
pattern = '<A HREF="/%s.*?">(.*?)</A>' % path 

response = urllib2.urlopen(url+path).read() 

for filename in re.findall(pattern, response): 
    fp = open(filename, "wb") 
    curl = pycurl.Curl() 
    curl.setopt(pycurl.URL, url+path+filename) 
    curl.setopt(pycurl.WRITEDATA, fp) 
    curl.perform() 
    curl.close() 
    fp.close() 
+0

私はスピードテストをしませんでしたが、 'BeautifulSoup'を使って' 'と' .text'をすべて得ることもできます。 – boldnik

2
  1. それは本当に巨大だ場合

    は、それが一度にチャンクを読んで価値があるかもしれインデックスファイルをダウンロードしてください。 それ以外の場合は、全体をメモリに取り込むほうが簡単でしょう。

  2. リストはXMLまたはHTMLの場合

    を取得するためにファイルのリストを抽出し、適切なパーサを使用します。 else文字列処理が多い場合はregexを使います。 他の場合は単純な文字列メソッドを使用します。

    この場合も、すべて一括または段階的に解析できます。 インクリメンタルにいくらか効率的でエレガントな ですが、数万個の行を処理しない限り、おそらく重要ではありません。

  3. ファイルごとにダウンロードしてファイルに保存します。

    速度を上げようとする場合は、 複数のダウンロードスレッドを実行してみてください。

    別の(大幅に高速化)アプローチはAria2 http://aria2.sourceforge.net/のような専用ダウンローダ プログラムに作業を委任する かもしれない - http://sourceforge.net/apps/trac/aria2/wiki/XmlrpcInterface#InteractWitharia2UsingPython

を参照してください、Aria2がサービスとして実行され、XMLRPC経由 を制御できること ノート
2

私は、ファイルのリストのためにページを解析するために、BeautifulSoup(HTML/XMLパーサー)を使用することを提案します。その後、pycURLは間違いなく便利になるでしょう。

もう一つの方法は、ファイルのリストを取得した後で、単にファイルシステム上の場所にファイルをダウンロードするために、wgetに似た方法でurllib.urlretrieveを使用することです。

4

あなたは(:urllib.request.urlretrieveのPython 3.xの中で):urllib.urlretrieveを使用することができます

import urllib 
urllib.urlretrieve('http://site.com/', filename='filez.txt') 

これは仕事:)

すべきであり、これを行うことができますfnctionです(urllibはを使用して)同じこと:

def download(url): 
    webFile = urllib.urlopen(url) 
    localFile = open(url.split('/')[-1], 'w') 
    localFile.write(webFile.read()) 
    webFile.close() 
    localFile.close() 
2

これは、非convential方法ですが、それは

に動作しますが、
関連する問題