2

大きなURLリストがあります。これを並行してダウンロードし、各応答で返されるヘッダーの1つを確認する必要があります。

並列化にはCurlMultiを使用できます。私は/dev/null本文には興味がなく、ヘッダーだけに興味があるので、fbとして使用できます。

しかし、どうすれば各ヘッダーを確認できますか?

ヘッダーを受け取るには、HEADERFUNCTIONコールバックを設定する必要があります。わかりました。

しかし、このコールバック関数では、ヘッダー付きのバッファーのみを取得します。あるリクエストを別のリクエストと区別するにはどうすればよいですか?

URLと同じくらい多くのコールバック関数を作成するというアイデアは好きではありません。いくつかのクラスとそのクラスのインスタンスを作成する必要がありますか?また、あまり賢くありません。

4

3 に答える 3

1

Pythonに組み込まれているhttplibおよびスレッドモジュールを使用します。サードパーティのモジュールは必要ないと思います。

于 2010-03-04T16:51:04.927 に答える
0

あなたがpycurlについて質問していることは知っていますが、使用するには難しすぎて非Python的だと思います。APIがおかしい。

ねじれた例を次に示します。

from twisted.web.client import Agent
from twisted.internet import reactor, defer

def get_headers(response, url):
    '''Extract a dict of headers from the response'''
    return url, dict(response.headers.getAllRawHeaders())

def got_everything(all_headers):
    '''print results and end program'''
    print dict(all_headers)
    reactor.stop()

agent = Agent(reactor)
urls = (line.strip() for line in open('urls.txt'))
reqs = [agent.request('HEAD', url).addCallback(get_headers, url) for url in urls if url]
defer.gatherResults(reqs).addCallback(got_everything)
reactor.run()

この例では、すべてのリクエストを非同期で開始し、すべての結果を収集します。3つのURLを持つファイルの出力は次のとおりです。

{'http://debian.org': {'Content-Type': ['text/html; charset=iso-8859-1'],
                       'Date': ['Thu, 04 Mar 2010 13:27:25 GMT'],
                       'Location': ['http://www.debian.org/'],
                       'Server': ['Apache'],
                       'Vary': ['Accept-Encoding']},
 'http://google.com': {'Cache-Control': ['public, max-age=2592000'],
                       'Content-Type': ['text/html; charset=UTF-8'],
                       'Date': ['Thu, 04 Mar 2010 13:27:25 GMT'],
                       'Expires': ['Sat, 03 Apr 2010 13:27:25 GMT'],
                       'Location': ['http://www.google.com/'],
                       'Server': ['gws'],
                       'X-Xss-Protection': ['0']},
 'http://stackoverflow.com': {'Cache-Control': ['private'],
                              'Content-Type': ['text/html; charset=utf-8'],
                              'Date': ['Thu, 04 Mar 2010 13:27:24 GMT'],
                              'Expires': ['Thu, 04 Mar 2010 13:27:25 GMT'],
                              'Server': ['Microsoft-IIS/7.5']}}
于 2010-03-04T13:34:15.533 に答える
0

解決策は、関数型プログラミングを少し使用して、コールバック関数にいくつかの追加情報を「貼り付ける」ことです。

functools.partial

于 2010-03-05T06:03:34.267 に答える