【发布时间】:2021-06-22 10:25:12
【问题描述】:
我正在尝试从 URL 列表中下载许多图像。很多,我的意思是在 10 000 附近。图像的大小从几百 KB 到 15 MB 不等。 我想知道完成这项任务的最佳策略是什么,尽量减少完成的总时间,并避免冻结。
我用这个函数来保存每张图片:
def save_image(name, base_dir, data):
with open(base_dir + name, "wb+") as destination:
for chunk in data:
destination.write(chunk)
我用这个函数从 URL 中获取文件扩展名:
def get_ext(url):
"""Return the filename extension from url, or ''."""
""" From : https://stackoverflow.com/questions/28288987/identify-the-file-extension-of-a-url """
parsed = urlparse(url)
root, ext = splitext(parsed.path)
return ext # or ext[1:] if you don't want the leading '.'
为了得到我刚刚做的图像:
for image in listofimages:
r = requests.get(image["url"], timeout=5)
extension = get_ext(image["url"])
name = str( int(image['ID']) ) + "AA" + extension
save_image( name, "images/", r )
现在把它们放在一起很慢。因此我的问题。
【问题讨论】:
-
慢是什么意思?你有证据应该更快吗?缓慢的事情和需要很长时间的事情是有区别的。你说的冻结是什么意思?很有可能对网络带宽、文件系统访问、工作内存、CPU 有限制。管理所有这些将为您的情况提供一些最佳性能。您可能可以相对轻松地使用
multiprocessing并行化您的代码,这将使用多个 CPU 和网络连接。 -
@PeterWood 考虑到涉及多少 I/O 和网络等待(释放全局解释器锁),我认为多线程会是更好的模型,你当然可以这样做 way 使用比您所提到的解决方案所拥有的 CPU 内核数更大的池大小更好。
-
@PeterWood 冻结,我的意思是我的代码在下载了大约 700 张图像后停止(即不会继续......)。我在控制台中没有收到任何错误,只是不再“继续”了。抱歉没有更准确。
标签: python web-scraping python-requests