0

我有一组 URL(相同的 http 服务器但不同的请求参数)。我想要实现的是继续异步或并行请求所有这些,直到我杀死它。

我开始使用threading.Thread()为每个 URL 创建一个线程,并while True:在请求函数中执行一个循环。当然,这已经比单线程/单请求更快了。但我想取得更好的成绩。

然后我尝试aiohttp了库来异步运行请求。我的代码是这样的(仅供参考,每个 URL 都由url_baseand组成product.id,每个 URL 都有一个不同的代理用于请求):

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