首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >检查图像URL是否指向Python中的真实图像

检查图像URL是否指向Python中的真实图像
EN

Stack Overflow用户
提问于 2018-08-09 08:24:30
回答 1查看 3.5K关注 0票数 4

所以我正在构建一个脚本来从urls列表中下载图像。这个脚本在一定程度上是有效的。我不想让它下载那些urls不存在的图片。我使用了一些状态码来处理一些图像,但仍然得到了不好的图像。我仍然得到了许多我不想要的图片。如下:

这里是我的代码:

代码语言:javascript
复制
import os
import requests
import shutil
import random
import urllib.request

def sendRequest(url):
    try:
        page = requests.get(url, stream = True, timeout = 1)

    except Exception:
        print('error exception')
        pass

    else:
        #HERE IS WHERE I DO THE STATUS CODE
        print(page.status_code)
        if (page.status_code == 200):
            return page

    return False

def downloadImage(imageUrl: str, filePath: str):
    img = sendRequest(imageUrl)

    if (img == False):
        return False

    with open(filePath, "wb") as f:
        img.raw.decode_content = True

        try:
            shutil.copyfileobj(img.raw, f)
        except Exception:
            return False

    return True

os.chdir('/Users/nikolasioannou/Desktop')
os.mkdir('folder')

fileURL = 'http://www.image-net.org/api/text/imagenet.synset.geturls?wnid=n04122825'
data = urllib.request.urlopen(fileURL)

output_directory = '/Users/nikolasioannou/Desktop/folder'

line_count = 0

for line in data:
    img_name = str(random.randrange(0, 10000)) + '.jpg'
    image_path = os.path.join(output_directory, img_name)
    downloadImage(line.decode('utf-8'), image_path)
    line_count = line_count + 1
#print(line_count)

耽误您时间,实在对不起。任何想法都是值得感谢的。

诚心的,尼古拉斯

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-09 08:29:09

您可以检查jpeg或png头文件以及它们各自的魔术序列,这始终是有效图像的一个很好的指示器。请看this上的问题。

你可以看看文件签名(又称魔术数字) here。然后,您只需检查response.raw的第一个n字节

我稍微修改了你的sendRequest/download函数,你应该能够硬编码更多有效的图像文件扩展名,而不仅仅是JPG魔术数字。我最终测试了代码,它(在我的机器上)正常工作。仅保存了有效的JPG图像。请注意,我删除了stream=True标志,因为图像非常小,不需要流。省下的钱变得不那么神秘了。看一看:

代码语言:javascript
复制
def sendRequest(url):
    try:
        page = requests.get(url)

    except Exception as e:
        print("error:", e)
        return False

    # check status code
    if (page.status_code != 200):
        return False

    return page

def downloadImage(imageUrl: str, filePath: str):
    img = sendRequest(imageUrl)

    if (img == False):
        return False

    if not img.content[:4] == b'\xff\xd8\xff\xe0': return False

    with open(filePath, "wb") as f:
        f.write(img.content)

    return True

您也可以尝试使用Pillow和BytesIO打开图像

代码语言:javascript
复制
>>> from PIL import Image
>>> from io import BytesIO

>>> i = Image.open(BytesIO(img.content))

看看它是否抛出一个错误。但是第一个解决方案看起来更轻量级--你应该不会得到任何误报。您还可以在im.content中检查字符串"<html>",如果找到则中止-这非常简单,而且可能也非常有效。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51757305

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档