在 aiohttp 中异步获取 HEAD 请求的状态

Fetch HEAD request's status asynchronously in aiohttp

问题是关于 aiohttp 库的使用。

我的目标是通过发送一堆 HEAD 请求来检查 url 列表,可能是异步的,并最终创建 dict url: status pairs.

我是 asyncio 的新手,我发现很多例子,人们使用 GET 请求来获取 html,例如,他们使用 await resp.read()await resp.text() 并且它工作正常但是 HEAD 请求我没有 body,我只有 header,就是这样。如果我尝试等待 resp.statusresp 本身作为 object – 它不起作用,因为它们不可等待。

下面的代码只能一步一步地同步工作,我不知道如何让它 运行 异步。似乎无论我对状态做什么,都会以某种方式将代码转换为同步模式...

我很高兴看到你的想法。

谢谢。

import asyncio
import aiohttp

urls_list = [url1,  url2,  url3, etc, etc, etc, ]
status_dict = {}


async def main():

    async with aiohttp.ClientSession() as session:
        for individual_url in urls_list:
            async with session.head(individual_url) as resp:
                status_dict.update({url: resp.status})

    
asyncio.run(main())

你可以吗asyncio.gather:

import asyncio
import aiohttp

urls_list = ["https://google.com", "https://yahoo.com", "http://hello123456789.com"]
status_dict = {}


async def head_status(session, url) -> dict:
    async with session.head(url) as resp:
        return {url: resp.status}


async def main():
    async with aiohttp.ClientSession() as session:
        statuses = await asyncio.gather(*[head_status(session, url) for url in urls_list], return_exceptions=True)
    for a in statuses:
        if not isinstance(a, Exception):
            status_dict.update(a)

asyncio.run(main())