PythonでURLをN回ヒットしたい。現在、 を使用してこれを行っていますwebbrowser.open()
が、非常に遅く、多くのメモリを消費します。より効率的な方法はありますか?
4 に答える
FXの答えは、ほぼ確実にあなたが望むものです.
しかし、あなたは効率性について尋ねました。本当に可能な限り効率的になりたいのであれば、もっとうまくやれるはずです。ソケットを閉じるのが早ければ早いほど、マシンと Web サーバーの両方で、CPU、メモリ、および帯域幅の浪費が少なくなります。
また、複数のリクエストを並行して行うと、マシンやサーバーのリソースを節約することはできませんが (実際にはいくらか無駄になります)、おそらくより速く終了します。それはあなたが求めているものですか?
もちろん、「URL にヒットする」とは正確には何を意味するのかという疑問が生じます。リクエストを送信してすぐにシャットダウンしても問題ありませんか? または、少なくとも応答行を待つ必要がありますか? HEAD
さらに言えば、代わりに要求をすることは許容されGET
ますか? 現実的で便利なヘッダーが必要ですか?
とにかく、これを行うには、より低いレベルにドロップダウンする必要があります. ほとんどの高レベル ライブラリでは、たとえば、何かを読み取る前にソケットを閉じる方法はありません。しかし、HTTP リクエストを作成するのはそれほど難しくありません。*
例えば:
from contextlib import closing
from socket import create_connection
from concurrent.futures import ThreadPoolExecutor, wait
host, port = 'www.example.com', 80
path = '/path/to/resource.html'
def spam_it():
with closing(create_connection((host, port))) as sock:
sock.sendall('GET {} HTTP/1.0\n\n'.format(path))
with ThreadPoolExecutor(max_workers=16) as executor:
wait(executor.submit(spam_it) for _ in range(10000))
* まあ、手動で HTTP リクエストを作成するのは実際にはかなり複雑です...静的で簡単なものだけを作成する必要がある場合は、自分で作成してurllib
くださいrequests
。
urllib2を使用しますか? 標準的な経験則として、常に最初に標準ライブラリを調べてください。そこには便利なパッケージがたくさんあります。
import urllib2
url = "http://www.google.com"
n = 8
for i in range(n):
urllib.urlopen( url ).read()
最終的に HTTP リクエストでもっと些細なことをしたい場合は、このrequests
モジュールを調べることをお勧めします。