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