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

标签 python web-scraping python-requests

我要下载大约 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然后在保存文件之前解压缩,例如与 gzipzlib .

为了强制尝试使用特定的 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/

相关文章:

python - 使用 BitNami 镜像在 EC2 上部署 Django 项目

python - PyCharm 输出错误消息散布在控制台输出中。如何解决这个问题?

python - Ghost.py 返回表单列表

python - 请求 - 在发出请求之前确定参数化 url,以包含在 Referer header 中

python-2.7 - 使用 Python 中的请求库测量 HTTP 响应时间。我做对了吗?

python - 使用 Python 将文件和数据发送到 API

python - 使用 Python SDK 时出现 Azure 存储错误

python - 带有 paramiko 的 SCP,使用不同的远程和本地目录

python - 如何使用 OCR 从低分辨率图像中获得更好/准确的结果

java - 未找到元素异常 : HTMLUnit - Search By ID