在 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.status
或 resp
本身作为 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())
问题是关于 aiohttp
库的使用。
我的目标是通过发送一堆 HEAD
请求来检查 url 列表,可能是异步的,并最终创建 dict
url: status pairs
.
我是 asyncio
的新手,我发现很多例子,人们使用 GET
请求来获取 html,例如,他们使用 await resp.read()
或 await resp.text()
并且它工作正常但是 HEAD
请求我没有 body,我只有 header,就是这样。如果我尝试等待 resp.status
或 resp
本身作为 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())