Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何通过编程区分普通url和图像url_Python_Http_Url_Web - Fatal编程技术网

Python 如何通过编程区分普通url和图像url

Python 如何通过编程区分普通url和图像url,python,http,url,web,Python,Http,Url,Web,如何区分普通url和图像url(只有图像的url) 普通url: 图像url:仅通过查看url无法确定url的内容 您最好的选择是获取页面并检查检索到的内容。几乎总是HTTP服务器在响应GET或HEADurl请求时返回内容类型头: 处理大量URL的最快方法是只检索头,而不下载整个文件,并在content type响应头上检查其mime类型(以下是您必须检查的列表。它们都以image/开头,这就是您要查找的内容) 例如,使用pycurl(您可以使用pip或如果您在windows上;对于64位wi

如何区分普通url和图像url(只有图像的url)

普通url:
图像url:

仅通过查看url无法确定url的内容


您最好的选择是获取页面并检查检索到的内容。

几乎总是HTTP服务器在响应
GET
HEAD
url请求时返回内容类型头:

处理大量URL的最快方法是只检索头,而不下载整个文件,并在content type响应头上检查其mime类型(以下是您必须检查的列表。它们都以image/开头,这就是您要查找的内容)

例如,使用pycurl(您可以使用pip或如果您在windows上;对于64位windows),类似的内容将检查响应头(我对python不太熟悉,因此建议您搜索如何解析内容类型头,以找到更好的方法来检查图像mime类型,并在函数上正确封装它):


如果您想在下载前获取as URL的内容类型,这就是HTTP命令
HEAD
的作用。如果您使用
HEAD
而不是
GET
,您将获得与
GET
返回的头相同的头,但没有正文(这意味着您和服务器的开销会减少)

其中一个标题应该是
内容类型
,这将告诉您它是否是图像

如果您想更进一步,您可以从disposition标头猜测文件名,如果猜不到,则猜测最终重定向URL的basename的扩展名,这是浏览器通常在服务器损坏的情况下向您显示图像的操作,但这很少需要


如果由于某种原因,您根本无法发出任何网络请求,那么您所能做的最好的事情就是试探性地猜测。如果您只是从一个特定的服务器(如Wikipedia)上抓取,您可以获得一个URL列表,并尝试查找服务器使用的模式—例如,URL的某个部分中的
图像
,这可能适用于许多图像,但可能不适用于所有图像,并且在下次进行重大服务升级时可能会中断,因此,您必须继续关注并定期改进启发式代码。

您可以发出
head
请求,检查
url
的内容类型。HEAD请求不会下载正文内容。 使用python模块的示例:


按照url阅读内容类型。如果服务器很好,最好使用HEAD而不是GET。这个请求库非常酷。开始从php迁移到python的另一个原因;-)
#!/usr/bin/python
import pycurl
from StringIO import StringIO
import re

def check_image(url):

    headers = StringIO()

    c = pycurl.Curl()
    c.setopt(c.URL, url)
    c.setopt(c.HEADER, 1)
    c.setopt(pycurl.SSL_VERIFYPEER, 0)
    c.setopt(pycurl.SSL_VERIFYHOST, 0) # do not verify ssl certificate
    c.setopt(c.NOBODY, 1) # header only, no body
    c.setopt(c.HEADERFUNCTION, headers.write)
    c.setopt(pycurl.WRITEFUNCTION, lambda x: None)
    c.perform()
    c.close()
    a = re.compile("^.*?Content-Type:( )*image/.*?$", re.IGNORECASE | re.MULTILINE | re.DOTALL)
    if a.match(headers.getvalue()) is None:
        return False
    else:
        return True

if check_image('http://www.wikipedia.org/') is False:
    print 'The resource in http://www.wikipedia.org/ is not an image'

if check_image('https://encrypted-tbn1.gstatic.com/images?q=tbn%3AANd9GcTwC6cNpAen5dgGgTmmH2SG75xhvTN-oRliaOgG-3meNQVm-GdpUu7SQX5wpA') is True:
    print 'The resource in https://encrypted-tbn1.gstatic.com/images?q=tbn%3AANd9GcTwC6cNpAen5dgGgTmmH2SG75xhvTN-oRliaOgG-3meNQVm-GdpUu7SQX5wpA is an image'
>>> import requests
>>> url = "https://encrypted-tbn1.gstatic.com/images?q=tbn%3AANd9GcTwC6cNpAen5dgGgTmmH2SG75xhvTN-oRliaOgG-3meNQVm-GdpUu7SQX5wpA"
>>> h = requests.head(url)
>>> print h.headers.get('content-type')
image/jpeg