我正在构建一个网络爬虫,它的功能之一是下载图像。
问题是有时,由于某种原因,下载的图像中有错误,例如:图像的一半是纯灰色或白色,就像它在某个时候停止下载,然后用灰色填充空白。图像类型仍然被认为是有效的,因为我可以使用 getimagesize 获取它们,也可以打开并查看它们。但它们不像原件。
有任何想法吗?
我正在构建一个网络爬虫,它的功能之一是下载图像。
问题是有时,由于某种原因,下载的图像中有错误,例如:图像的一半是纯灰色或白色,就像它在某个时候停止下载,然后用灰色填充空白。图像类型仍然被认为是有效的,因为我可以使用 getimagesize 获取它们,也可以打开并查看它们。但它们不像原件。
有任何想法吗?
将响应标头Content-Length
与您收到的实际字节数进行比较。可能还有其他原因,但如果没有看到您下载该图像的代码,我什么也说不出来。
我认为这是传输中断。
我看到很多情况:要么您的连接已被重置,在这种情况下测试套接字信号应该使您能够诊断问题并重新启动下载。
或者在传输过程中存在未检测到的错误(但通常 TCP/IP 应该处理这个问题)和/或您没有正确写入所有下载的数据(您认为您读取了套接字上的所有数据,但 read 提供了一个最小值和您不检查返回的值来检查它的预期大小)然后您的图像不完整。
通常半灰色图像(尤其是 JPEG)是文件不完整的标志(标题没问题,所以你的 getimagesize 没有问题),但 JPEG 不以0xFF 0xD9
. 因此,通过与您必须阅读的大小进行比较来检查您是否阅读了所有数据。最终,您可以编写依赖于图像格式的函数来检查文件的完整性,例如通过检查 JPEG 中的标志。但它可能会消耗资源。
只需执行 imagecreatefromstring() 并检查是否返回不是资源