我有一个列表,其中包含数千个指向远程服务器上的图像/视频的 URL。就像是:
urls = ['https://foo.bar/baz.jpeg', 'https://foo.bar/jaz.mp4', ...]
通过获取这些 url,某些响应会以404 Not Found形式出现,这没关系,因为服务器上的数据可能已过时并被删除。我想做的事情是以快速的方式识别哪些网址会给我404 。
当我打开浏览器并在地址栏上输入错误 URL 之一时,“未找到”错误大约需要 200 毫秒才能检索到。通过进行一些简单的计算,如果以异步方式进行,我预计大约 1.000 个调用将花费不超过 4 秒的时间完成。
但是,通过使用这段代码,我认为这是适当的:
def async_check(urls):
async def fetch(session, url):
async with session.get(url) as response:
if response.status != 200:
return False
else:
return True
async def run(urls):
async with ClientSession() as session:
return await asyncio.gather(*[fetch(session, url) for url in urls])
return asyncio.get_event_loop().run_until_complete(run(urls))
经过的时间就比较长了,有时甚至是超时了。
我相信这是由于列表中的非错误网址造成的,这些网址指向可能需要很长时间才能加载为响应对象的图像和视频,并最终消耗大量时间才能完成任务。
在思考了如何实现404的验证之后,我得出了一个或多或少像这样的流程:
对于每个 url,使用 get 方法异步获取它,并异步休眠相对较长的时间(例如 1 秒)。睡眠完成后,尝试查看响应是否“就绪”,如果是,则将状态代码 404(或与 200 不同)添加到我的错误 URL列表中。如果睡觉后,响应没有“准备好”,那么我会假设这是由于加载了大量图像/视频,并认为它没有错误。
由于每次调用的等待时间上限为 1 秒,因此我预计对于一堆 url 来说它会运行得相对较快。
这会被认为是解决这个问题的巧妙方法,还是有更聪明的方法?
白板的微信
相关分类