【问题标题】:python save image from urlpython从url保存图像
【发布时间】:2015-07-25 14:11:26
【问题描述】:

当我使用 python 通过 urllib2 请求或 urllib.urlretrieve 从 url 保存图像时遇到问题。那就是图片的url是有效的。我可以使用资源管理器手动下载它。但是,当我使用python下载图像时,无法打开文件。我使用 Mac OS 预览来查看图像。谢谢!

更新:

代码如下

def downloadImage(self):
    request = urllib2.Request(self.url)
    pic = urllib2.urlopen(request)
    print "downloading: " + self.url
    print self.fileName
    filePath = localSaveRoot + self.catalog  + self.fileName + Picture.postfix
    # urllib.urlretrieve(self.url, filePath)
    with open(filePath, 'wb') as localFile:
        localFile.write(pic.read())

我要下载的图片网址是 http://site.meishij.net/r/58/25/3568808/a3568808_142682562777944.jpg

这个 URL 是有效的,我可以通过浏览器保存它,但是 python 代码会下载一个无法打开的文件。预览显示“它可能已损坏或使用了预览无法识别的文件格式。” 我比较了通过 Python 下载的图像和通过浏览器手动下载的图像。前者的大小要小几个字节。所以看起来文件是未完成的,但是不知道为什么python不能完全下载。

【问题讨论】:

  • 为什么打不开?你得到什么错误? file <filename> 告诉你什么?文件下载是否正确,或者您是否被User-AgentCookie 限制或类似限制?
  • 请在问题中包含您正在尝试的python代码
  • 很抱歉让您感到困惑。我提供了更多细节。非常感谢。不知道是不是因为python中的http请求和浏览器下载不一样,所以python不能给我带来完整的图片文件。
  • 看来requests是比urllib和urllib2好很多的模块

标签: python image download urllib


【解决方案1】:
import requests

img_data = requests.get(image_url).content
with open('image_name.jpg', 'wb') as handler:
    handler.write(img_data)

【讨论】:

  • @vlad 如果我们不知道来自 URL 的图像扩展名但我们知道它是图像怎么办?
  • @MonaJalal 你不必指定扩展名,只要你有有效的合格 URL 地址。
  • pip install requests 如果你没有
  • 在requests.get()之后使用'.content'是保存图片的关键
  • 以下网址无效;知道如何解决吗? genome.jp/pathway/ko02024+K07173
【解决方案2】:

适用于我的 Windows 示例代码:

import requests

with open('pic1.jpg', 'wb') as handle:
    response = requests.get(pic_url, stream=True)

    if not response.ok:
        print(response)

    for block in response.iter_content(1024):
        if not block:
            break

        handle.write(block)

【讨论】:

  • 太完美了!太感谢了!我不知道为什么 requests 模块可以完成,而 urllib 和 urllib2 不能这样做,但无论如何。
  • 以下网址无效;知道如何解决吗?基因组.jp/pathway/ko02024+K07173
  • @Cleb 这不是图片
【解决方案3】:

这是使用 urlib.request 包从 Internet 下载和保存图像的最简单方法。

在这里,您可以简单地传递图像 URL(您要从哪里下载并保存图像)和目录(您要在本地保存下载图像的位置,并以 .jpg 或 .png 命名图像名称)在这里我用这个替换了“local-filename.jpg”。

Python 3

import urllib.request
imgURL = "http://site.meishij.net/r/58/25/3568808/a3568808_142682562777944.jpg"

urllib.request.urlretrieve(imgURL, "D:/abc/image/local-filename.jpg")

如果您拥有来自 Internet 的所有图像 URL,您也可以下载多个图像。只需在 for 循环中传递这些图像 URL,代码就会自动从互联网上下载图像。

【讨论】:

  • 以下网址无效;知道如何解决吗?基因组.jp/pathway/ko02024+K07173
【解决方案4】:

Python 代码 sn-p 从 url 下载文件并使用其名称保存

import requests

url = 'http://google.com/favicon.ico'
filename = url.split('/')[-1]
r = requests.get(url, allow_redirects=True)
open(filename, 'wb').write(r.content)

【讨论】:

    【解决方案5】:
    import random
    import urllib.request
    
    def download_image(url):
        name = random.randrange(1,100)
        fullname = str(name)+".jpg"
        urllib.request.urlretrieve(url,fullname)     
    download_image("http://site.meishij.net/r/58/25/3568808/a3568808_142682562777944.jpg")
    

    【讨论】:

    • 欢迎来到 Stackoverflow 并感谢您的贡献!您能否为您的答案添加解释代码的作用及其工作原理?谢谢!
    • 如何在 urlretrieve 中添加 url 的标头?我在浏览器中打开图像时遇到问题,但不是通过使用 urlretrive 的代码。我试过 urlopen 但我不知道如何使用 urlopen 下载图像。
    【解决方案6】:

    任何想知道如何获取图像扩展名的人都可以尝试在图像 url 上使用字符串的拆分方法:

    str_arr = str(img_url).split('.')
    img_ext = '.' + str_arr[3] #www.bigbasket.com/patanjali-atta.jpg (jpg is after 3rd dot so)
    img_data = requests.get(img_url).content
    with open(img_name + img_ext, 'wb') as handler:
        handler.write(img_data)
    

    【讨论】:

      【解决方案7】:

      下载图片并保存到目录

      import requests
      
      headers = {"User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0",
                 "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
                 "Accept-Language": "en-US,en;q=0.9"
                 }
      
      img_data = requests.get(url=image_url, headers=headers).content
      with open(create_dir() + "/" + 'image_name' + '.png', 'wb') as handler:
          handler.write(img_data)
      

      用于创建目录

      def create_dir():
          # Directory
          dir_ = "CountryFlags"
          # Parent Directory path
          parent_dir = os.path.dirname(os.path.realpath(__file__))
          # Path
          path = os.path.join(parent_dir, dir_)
          os.mkdir(path)
          return path
      

      【讨论】:

        【解决方案8】:

        对于 linux 以防万一;你可以使用 wget 命令

        import os
        url1 = 'YOUR_URL_WHATEVER'
        os.system('wget {}'.format(url1))
        

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-30
        • 1970-01-01
        • 2010-10-17
        • 1970-01-01
        相关资源
        最近更新 更多