无法使用 asyncio/aiohttp 返回 404 响应
Having trouble returning 404 responses with asyncio/aiohttp
import time
import asyncio
import aiohttp
async def is_name_available(s, name):
async with s.get("https://twitter.com/%s" % name) as res:
if res.raise_for_status == 404:
print('%s is available!' % name)
return name
async def check_all_names(names):
async with aiohttp.ClientSession(raise_for_status=True) as s:
tasks = []
for name in names:
task = asyncio.create_task(is_name_available(s, name))
tasks.append(task)
return await asyncio.gather(*tasks)
def main():
with open('names.txt') as in_file, open('available.txt', 'w') as out_file:
names = [name.strip() for name in in_file]
start_time = time.time()
results = asyncio.get_event_loop().run_until_complete(check_all_names(names))
results = [i for i in results if i]
out_file.write('\n'.join(results))
print(f'[ <? ] Checked {len(names)} words in {round(time.time()-start_time, 2)} second(s)')
if __name__ == '__main__':
main()
我似乎无法弄清楚如何使用我在另一个项目中使用的 asyncio/aiohttp 结构来仅返回 is_name_available 中的 404 链接。我是 python 的初学者,非常感谢任何帮助。
此行不正确:
if res.raise_for_status == 404:
raise_for_status
是一个 方法 ,所以你应该调用它,而不是将它与数字进行比较(它总是 return 错误) .在你的情况下,你不想首先调用 raise_for_status
因为你不想在遇到 404 时引发异常,而是检测它。要检测404,你可以简单地写:
if res.status == 404:
另请注意,您不想指定 raise_for_status=True
,因为它会在 if
有机会 运行 之前引发 404 异常。
import time
import asyncio
import aiohttp
async def is_name_available(s, name):
async with s.get("https://twitter.com/%s" % name) as res:
if res.raise_for_status == 404:
print('%s is available!' % name)
return name
async def check_all_names(names):
async with aiohttp.ClientSession(raise_for_status=True) as s:
tasks = []
for name in names:
task = asyncio.create_task(is_name_available(s, name))
tasks.append(task)
return await asyncio.gather(*tasks)
def main():
with open('names.txt') as in_file, open('available.txt', 'w') as out_file:
names = [name.strip() for name in in_file]
start_time = time.time()
results = asyncio.get_event_loop().run_until_complete(check_all_names(names))
results = [i for i in results if i]
out_file.write('\n'.join(results))
print(f'[ <? ] Checked {len(names)} words in {round(time.time()-start_time, 2)} second(s)')
if __name__ == '__main__':
main()
我似乎无法弄清楚如何使用我在另一个项目中使用的 asyncio/aiohttp 结构来仅返回 is_name_available 中的 404 链接。我是 python 的初学者,非常感谢任何帮助。
此行不正确:
if res.raise_for_status == 404:
raise_for_status
是一个 方法 ,所以你应该调用它,而不是将它与数字进行比较(它总是 return 错误) .在你的情况下,你不想首先调用 raise_for_status
因为你不想在遇到 404 时引发异常,而是检测它。要检测404,你可以简单地写:
if res.status == 404:
另请注意,您不想指定 raise_for_status=True
,因为它会在 if
有机会 运行 之前引发 404 异常。