我要下载大约 1000 万张图片,在下载前 1000 张图片的小实验之后,我注意到每张图片大约需要 4.5 秒(使用 multiprocessing.Pool
可以稍微加快速度) 但最大的问题是平均图像大小为 ~2400x2400 ~ 2.2MB。下载后我可以立即调整它们的大小,但主要瓶颈(目前)是互联网带宽。有没有办法以较低的分辨率直接下载图像?
示例虚拟代码:
import requests
resp = requests.get("some_url.jpg")
with open(fn, 'wb') as f:
f.write(resp.content)
最佳答案
减少
除非有其他分辨率较低的文件可用 → 否。除非服务器上有某种 API 或基本上任何您想要从中下载文件(图像)的东西,否则在将内容作为响应发回之前,会在服务器上修改它。
不过,您可以尝试检查网站是否支持 gzip
或其他压缩,并确保先下载压缩后的响应,例如与 this answer然后在保存文件之前解压缩,例如与 gzip
或 zlib
.
为了强制尝试使用特定的 headers例如 Accept-Encoding
。
限制
为数据制作一个简单的计数器(您可以在处理时计算字节数或 after you download ),如果您不想达到,例如每 5 分钟超过 100MB,然后为每 100MB block 下载 time.sleep()
。
小笔记
Thread
不会帮助您并行化工作,请使用 multiprocessing.Pool
或喜欢真的将工作拆分为多个进程,以便您从(随机数)获得,例如每 1 分钟每个进程 100 个文件到 400 个文件同时下载 4 个进程,每个进程下载 100 个文件。
关于python - 在抓取大图像期间如何减少/限制带宽?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54010716/