2011-01-31 15 views
0

HTTP Webサイトから画像をダウンロードするためのPythonスクリプトをいくつか作成しましたが、urllib2を使用しているため、既存の接続を閉じて別のファイルを開く前に開きます。私はそれほどネットワーキングを理解していませんが、これはおそらくかなり遅くなり、一度に100枚の画像を取得するにはかなりの時間がかかります。Python:HTTPサーバーからファイルをダウンロードする

私はpycurlやhttplibのような他の選択肢を見ていましたが、urllib2と比較すると複雑であり、ちょっとしたコードスニペットを見つけていないと思います。

ウェブサイトへの永続的な接続を確立し、いくつかのファイルをダウンロードして、接続が完了したときに接続を閉じるにはどうすればいいですか? (おそらく、明示的な呼び出し、それを閉じます)

+0

私は一般的に画像のサイズと比較して、ネットワークオーバーヘッドの数バイトはあまりないと思います。あなたが反対の証拠を持っていない限り、おそらく問題の価値はありません。 – Thomas

+0

[Dive into Python](http://diveintopython.org/http_web_services/index.html)でも同様の作業が行われました。 –

+1

私は、ネットワークのオーバーヘッドが大きな違いにはならないと考えています。 TCPスロースタート(http://en.wikipedia.org/wiki/Slow-start)のために、新しく作成されたすべての接続が最初は遅くなるためです。したがって、同じTCP接続を再利用すると、データが十分に大きい場合に違いが生じます(100枚の写真は10〜100MBになります) –

答えて

2

からのコードサンプルです:

import httplib 

images = ['img1.png', 'img2.png', 'img3.png'] 

conn = httplib.HTTPConnection('www.example.com') 

for image in images: 
    conn.request('GET', '/images/%s' % image) 
    resp = conn.getresponse() 
    data = resp.read() 
    with open(image, 'wb') as f: 
     f.write(data) 

conn.close() 

を、これは複数の(シーケンシャル)を発行し、リスト内の画像へのリクエストをGETし、接続を閉じます。

+0

ありがとう、私はイメージの場所のリストを作成することは考えていませんでした。 – MxyL

+0

けいこう、upvoteあなたのように答えます –

+0

試してみました。そうする評判は十分ではありません。 – MxyL

0

あなたがsocketを開くなどのリクエストあなたの自己作ることができ、複雑な要求をするつもりされていない場合は、次の

import sockets 

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
sock.connect((server_name, server_port)) 

for url in urls: 
    sock.write('get %s\r\nhost: %s\r\n\r\n' % (url, server_name)) 
    # Parse HTTP header 
    # Download picture (Size should be in the HTTP header) 

sock.close() 

をしかし、私は100 TCPを確立するとは思いませんセッションは一般的にオーバーヘッドが大きくなります。

1

私はurllib3を見つけ、既存のTCP接続を再利用すると主張しています。

私はこの主張に同意しないと主張しましたが、これは大きな違いはありません:TCP Slow Startアルゴリズムが新しく作成されるたびに遅くなります。したがって、同じTCPソケットを再利用すると、データが大きい場合に違いが生じます。そして、私は100のためのデータが10と100 MBの間にあると思う。あなたはhttplibスニペットを求めたので、ここで

http://code.google.com/p/urllib3/source/browse/test/benchmark.py

TO_DOWNLOAD = [ 
'http://code.google.com/apis/apps/', 
'http://code.google.com/apis/base/', 
'http://code.google.com/apis/blogger/', 
'http://code.google.com/apis/calendar/', 
'http://code.google.com/apis/codesearch/', 
'http://code.google.com/apis/contact/', 
'http://code.google.com/apis/books/', 
'http://code.google.com/apis/documents/', 
'http://code.google.com/apis/finance/', 
'http://code.google.com/apis/health/', 
'http://code.google.com/apis/notebook/', 
'http://code.google.com/apis/picasaweb/', 
'http://code.google.com/apis/spreadsheets/', 
'http://code.google.com/apis/webmastertools/', 
'http://code.google.com/apis/youtube/', 
] 

from urllib3 import HTTPConnectionPool 
import urllib 

pool = HTTPConnectionPool.from_url(url_list[0]) 
for url in url_list: 
    r = pool.get_url(url) 
+0

私はurllib3を見て、私ができることを見ていきます。私は最近pycurlをインストールし、接続を確立するために複数のスレッドを実行するように見えるサンプルコードを使用しましたが、コードを理解できず、これまでコピー/ペーストしかできません。 – MxyL

関連する問題