URL のセットがあります (http サーバーは同じですが、要求パラメーターは異なります)。私が達成したいのは、それらすべてを非同期または並行して要求し続けることです。
threading.Thread()URL ごとに 1 つのスレッドを作成while True:し、要求関数でループを実行することから始めました。もちろん、これはシングルスレッド/シングルリクエストよりも高速に機能しました。しかし、より良いパフォーマンスを達成したいと思います。
次に、ライブラリを試しaiohttpて、リクエストを非同期で実行しました。私のコードは次のようなものです (参考までに、各 URL は と で構成され、url_base各product.idURL には要求に使用される異なるプロキシがあります):
async def fetch(product, i, proxies, session):
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'}
while True:
try:
async with session.get(
url_base + product.id,
proxy = proxies[i],
headers=headers,
ssl = False)
) as response:
content = await response.read()
print(content)
except Exception as e:
print('ERROR ', str(e))
async def startQuery(proxies):
tasks = []
async with aiohttp.ClientSession() as session:
for [i, product] in enumerate(hermes_products):
task = asyncio.ensure_future(fetch(product, i, proxies, session))
tasks.append(task)
responses = asyncio.gather(*tasks)
await responses
loop = asyncio.get_event_loop()
loop.run_until_complete(startQuery(global_proxy))
観察結果は次のとおりです。1) 期待したほど高速ではありません。実際には、スレッドを使用するよりも遅くなります。2)さらに重要なことは、リクエストは実行の最初にのみ正常に返され、すぐにほとんどすべてのリクエストが次のようないくつかのエラーを返したことです。
ERROR Cannot connect to host PROXY_IP:PORT ssl:False [Connect call failed ('PROXY_IP', PORT)]
また
ERROR 503, message='Too many open connections'
また
ERROR [Errno 54] Connection reset by peer
ここで何か間違ったことをしていますか (特にwhile Trueループで? もしそうなら、どうすれば目標を適切に達成できますか?