在刮取大图像期间如何减少/限制带宽?

时间:2019-01-02 17:33:38

标签: python web-scraping python-requests

我要下载约1000万张图片,并做了一个小实验,下载了前1000张图片,我发现每张图片需要约4.5秒的时间(使用multiprocessing.Pool可能会稍有加快),但最大的问题是是平均图片大小为〜2400x2400,约为2.2MB。下载它们后,我可以立即调整它们的大小,但主要的瓶颈(当前)是Internet带宽。是否可以直接以较低的分辨率下载图像?

示例伪代码:

import requests

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

1 个答案:

答案 0 :(得分:3)

减少

除非还有其他分辨率较低的文件可用→否。除非服务器上有某种API或基本上没有任何东西,否则您要从中下载文件(图像),然后在发送内容作为响应之前,先在服务器上修改文件(图像)。

您可以尝试检查网站是否支持gzip或其他压缩方式,并确保您首先下载压缩后的响应,例如使用this answer,然后在保存文件之前进行解压缩,例如与gzipzlib

要强制执行,请尝试使用特定的headers,例如Accept-Encoding

限制

为数据创建一个简单的计数器(您可以在处理或after you download时对字节进行计数),如果您不想达到例如每5分钟超过100MB左右,则只需为每个下载的100MB块放入time.sleep()

次要音符

Thread不会帮助您并行处理工作,使用multiprocessing.Pool或喜欢将消息真正地拆分为多个进程,以便从(随机数)中获取信息。每1分钟以每个进程100个文件为基础,通过4个进程同时下载400个文件,每个进程同时下载100个文件。