0

URL のセットがあります (http サーバーは同じですが、要求パラメーターは異なります)。私が達成したいのは、それらすべてを非同期または並行して要求し続けることです。

threading.Thread()URL ごとに 1 つのスレッドを作成while True:し、要求関数でループを実行することから始めました。もちろん、これはシングルスレッド/シングルリクエストよりも高速に機能しました。しかし、より良いパフォーマンスを達成したいと思います。

次に、ライブラリを試しaiohttpて、リクエストを非同期で実行しました。私のコードは次のようなものです (参考までに、各 URL は と で構成され、url_baseproduct.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ループで? もしそうなら、どうすれば目標を適切に達成できますか?

4

0 に答える 0