【问题标题】:Fetching image via Requests in simple way以简单的方式通过请求获取图像
【发布时间】:2015-09-13 18:21:17
【问题描述】:

我发现urlliba handy way 从网址获取图片:

urllib.urlretrieve( url, localName )

不过the requests way 似乎有点棘手。甚至答案也建议urllib 完成这项工作。

requests 真的不能像urllib 那样做事对吗? 或者,有没有类似urllib.urlretrieve()requests接口?

我的项目目前只使用requests。 我不想只为一个功能导入另一个工具。

【问题讨论】:

    标签: python python-requests


    【解决方案1】:

    请注意 urllib.urlretrieve() 对于现代不可靠的服务是无用的。如果服务器以状态码 500(内部服务器错误)回答,则您无法检测到它:该函数只是记下服务器的回答(空一个或“500 内部服务器错误”或其他)。

    通过请求,您可以检查状态代码。

    【讨论】:

      【解决方案2】:

      只需将响应的响应content保存到二进制文件,例如:

      In [1]: import requests
      In [2]: r = requests.get('https://lh3.googleusercontent.com/-NwXieow8Dac/VfWsN9Gnc4I/AAAAAAAATB8/dbaO0RKfIhE/w426-h538/PP_%2B1944wm.jpg')
      In [3]: with open('fred.jpg', 'wb') as outfile:
         ...:     outfile.write(r.content)
      In [4]: exit()
      

      保存图片就好了。

      【讨论】:

        【解决方案3】:

        您始终可以发出 GET 请求,读取响应,然后将其保存到文件中。

        f=open("filename.jpeg","w")
        data=requests.get("http://example.com/img.jpeg");
        f.write(data.content)
        f.close()
        

        【讨论】:

          【解决方案4】:

          The requests way你指的是,也适用于大文件的解决方案。正如已经指出的,小文件,您可以随时通过requst.get下载:

          import requests
          with open("destination.jpg", "wb") as dst_file:
              dst_file.write(request.get("http://example.com/img.jpeg").content)
          

          如果您想要使用requests 的适合大文件的解决方案,那一点也不难。

          实际上,当您查看urllib.retrieve code 时,您会发现它在底层执行的操作与您需要为requests.getstream=True 执行的操作基本相同,除了(如@y0prst 中所指出的)回答)它不检查响应状态代码,所以它会写入本地文件以及错误响应的内容(HTTP 500代码)。

          你可以定义如下函数:

          def requests_retrieve(url, filename, chunk_size=1024):
              with open(filename, "wb") as dst_file:
                  resp = request.get(url, stream=True)
                  resp.raise_for_status()
                  for chunk in resp.iter_content(chunk_size)
                      dst_file.write(chunk)
          

          并称它为urllib.urlretrieve

          request_retrieve(url, localName)
          

          【讨论】:

            猜你喜欢
            • 2013-08-13
            • 2021-10-26
            • 1970-01-01
            • 2017-10-22
            • 2013-05-22
            • 1970-01-01
            • 1970-01-01
            • 2012-03-05
            • 2014-02-01
            相关资源
            最近更新 更多