1

現在、サイトをスクレイピングしようとしていますが、サイトは 1 つの TCP 接続に対して 100 を超えるリクエストを許可していませんでした。そこで、リクエスト用に複数の接続プールを作成しようとしました。次のコードを試しました。15個の接続プールを作成するべきではありませんか?

from urllib3 import HTTPConnectionPool
for i in range(15):
    pool = HTTPConnectionPool('ajax.googleapis.com', maxsize=15)
    for j in range(15):
        resp= pool.request('GET', '/ajax/services/search/web')
    pool.num_connections

pool.num_connection は常に 1 を出力します

4

2 に答える 2

-1

100 リクエストごとにソケットを閉じる必要がある場合は、手動で行う必要があります。5 つのリクエストごとにすべてのソケットを閉じる例を次に示します。

import urllib3
urllib3.add_stderr_logger() # This lets you see when new connections are made

http = urllib3.PoolManager()
url = 'http://ajax.googleapis.com/ajax/services/search/web'
for j in range(15):
    resp = http.request('GET', url)
    if j % 5 == 0:
        # Reset the PoolManager's connections.
        # This might be overkill if you need more granular control per-host.
        http.clear()

新しいものと交換する前に、同様のことをHTTPConnectionPool行うことができます。.close()可能な場合は PoolManager を使用することを好みます (通常、欠点はありません)。

接続を非常に細かくしたい場合は、接続をHTTPConnectionPool使用pool._get_conn()してから手動で取り出すことができます.close()

于 2015-03-26T04:27:30.457 に答える