关于python:如何在抓取大图像时减少/限制带宽?

How can you reduce/limit bandwidth during scraping of large images?

我要下载大约1000万张图片,在下载前1000张图片的一个小实验之后,我注意到每一张图片需要大约4.5秒(这可能与multiprocessing.Pool的速度略有加快),但最大的问题是,平均图片大小在约2.2Mb时约为2400x2400。我可以在下载后立即调整它们的大小,但主要的瓶颈(目前)是互联网带宽。有没有办法以较低的分辨率直接下载图像?

示例伪代码:

1
2
3
4
5
import requests

resp = requests.get("some_url.jpg")
with open(fn, 'wb') as f:
    f.write(resp.content)

减少

除非有其他分辨率较低的文件可用→否。除非服务器上有某种API或基本上任何内容,您希望从中下载文件(映像),以便在将内容作为响应发送回服务器之前在服务器上对其进行修改。

不过,您可以尝试检查网站是否支持gzip或其他压缩,并确保先下载压缩的响应,例如使用此答案,然后在保存文件之前解压缩,例如使用gzipzlib

为了强制执行,尝试使用特定的头文件,如Accept-Encoding

限制

为数据制作一个简单的计数器(您可以在处理或下载后计算字节数),如果您不想达到每5分钟或其他时间超过100MB,则只需为下载的每100MB数据块设置time.sleep()

小音符

Thread不会帮助您并行工作,使用multiprocessing.Pool或喜欢真正将工作拆分为多个进程,这样您就可以从(随机数)中获得(例如,每进程每1分钟100个文件)到400个下载文件,4个进程同时下载100个文件。