使用 asyncio/aiohttp 返回 404 响应时遇到问题

hum*_*mid -3 python-3.x python-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()
Run Code Online (Sandbox Code Playgroud)

我似乎无法弄清楚如何使用我在另一个项目中使用的 asyncio/aiohttp 结构仅返回 is_name_available 中的 404 链接。我是 python 的初学者,非常感谢任何帮助。

use*_*342 5

这行是不正确的:

        if res.raise_for_status == 404:
Run Code Online (Sandbox Code Playgroud)

raise_for_status是一个方法,所以你应该调用它,而不是将它与数字进行比较(它总是返回 false)。在您的情况下,您不想raise_for_status首先调用,因为您不想在遇到 404 时引发异常,而是检测它。要检测 404,您可以简单地编写:

        if res.status == 404:
Run Code Online (Sandbox Code Playgroud)

另请注意,您不想指定,因为它会在有机会运行raise_for_status=True之前引发 404 异常。if