杰瑞科技汇

Python requests如何获取图片?

核心步骤

使用 requests 下载图片主要分为以下三个步骤:

Python requests如何获取图片?-图1
(图片来源网络,侵删)
  1. 发送 HTTP 请求:使用 requests.get() 方法向图片的 URL 发送一个 GET 请求。
  2. 检查请求是否成功:通过检查响应的状态码(response.status_code)来确保请求成功(通常是 200 OK)。
  3. 保存图片内容:从响应对象中获取图片的二进制数据(response.content),并将其写入到一个本地文件中。

基础示例:下载一张图片

这是最简单的用法,直接下载并保存图片。

import requests
# 1. 目标图片的URL
# 这里使用一个示例图片URL,你可以替换成任何你想要的图片地址
image_url = "https://www.python.org/static/community_logos/python-logo-master-v3-TM.png"
try:
    # 2. 发送GET请求
    # stream=True 可以在下载大文件时节省内存,因为它会分块下载
    response = requests.get(image_url, stream=True)
    # 3. 检查请求是否成功
    # response.raise_for_status() 会在请求失败(状态码不是2xx)时抛出异常
    response.raise_for_status() 
    # 4. 获取文件名(可选)
    # 从URL中提取文件名,如果没有则使用默认名
    filename = image_url.split("/")[-1]
    if not filename:
        filename = "downloaded_image.png"
    # 5. 保存图片
    with open(filename, 'wb') as f:
        # response.content 是图片的二进制数据
        f.write(response.content)
    print(f"图片已成功保存为 {filename}")
except requests.exceptions.RequestException as e:
    print(f"下载图片时发生错误: {e}")

代码解释:

  • import requests: 导入 requests 库。
  • image_url: 你想要下载的图片的 URL。
  • requests.get(image_url, stream=True): 发送 GET 请求。stream=True 是一个好习惯,特别是对于大文件,它不会立即将整个文件内容加载到内存中。
  • response.raise_for_status(): 这是一个非常实用的方法,如果请求返回的状态码表示错误(404 Not Found, 500 Server Error),它会抛出 HTTPError 异常。
  • with open(filename, 'wb') as f::
    • with 语句可以确保文件在操作完成后被正确关闭。
    • 'wb' 是文件打开模式,w 表示写入,b 表示二进制模式,这对于图片、视频等非文本文件至关重要。
  • f.write(response.content): 将响应中的二进制内容写入文件。

进阶示例:处理更复杂的情况

在实际应用中,你可能会遇到需要处理头部信息、设置超时、处理重定向等情况。

1 设置请求头和超时

有些网站会检查请求的 User-Agent,如果没有设置,可能会拒绝请求,设置超时可以防止程序因网络问题而无限等待。

Python requests如何获取图片?-图2
(图片来源网络,侵删)
import requests
image_url = "https://httpbin.org/image/png" # 一个提供测试图片的网站
# 设置请求头,模拟浏览器访问
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
# 设置超时(连接超时和读取超时,单位为秒)
timeout = 10
try:
    response = requests.get(image_url, headers=headers, timeout=timeout, stream=True)
    response.raise_for_status()
    filename = "image_with_headers.png"
    with open(filename, 'wb') as f:
        for chunk in response.iter_content(chunk_size=8192): # 分块写入
            f.write(chunk)
    print(f"图片已成功保存为 {filename}")
except requests.exceptions.RequestException as e:
    print(f"下载图片时发生错误: {e}")

新知识点:

  • headers: 一个字典,用于添加自定义的 HTTP 头部信息。User-Agent 是最常见的一个。
  • timeout: 设置请求的超时时间,可以防止长时间等待无响应的服务器。
  • response.iter_content(chunk_size=8192): 这是 stream=True 模式下的最佳实践,它以指定的大小(8192字节)分块返回内容,可以极大地节省内存,尤其是在下载大文件时,我们用一个循环来处理每一块数据。

2 处理需要认证的图片

如果图片在需要登录或 API Key 的保护下,你需要在请求中提供认证信息。

import requests
# 假设这是一个需要Bearer Token认证的API端点
image_url = "https://api.example.com/protected-image.jpg"
api_key = "YOUR_SECRET_API_KEY" # 替换成你的API Key
headers = {
    'Authorization': f'Bearer {api_key}'
}
try:
    response = requests.get(image_url, headers=headers, stream=True)
    response.raise_for_status()
    filename = "protected_image.jpg"
    with open(filename, 'wb') as f:
        for chunk in response.iter_content(chunk_size=8192):
            f.write(chunk)
    print(f"受保护的图片已成功保存为 {filename}")
except requests.exceptions.RequestException as e:
    print(f"下载图片时发生错误: {e}")

最佳实践和注意事项

  1. 始终使用 try...except:网络请求是不可靠的,可能会因为各种原因失败(如网络中断、URL错误、服务器宕机),使用 try...except 来捕获异常,让你的程序更健壮。
  2. 使用 stream=True:对于任何可能较大的文件(图片、视频、压缩包等),都应开启流式传输,并用 iter_content 分块处理,以避免内存溢出。
  3. 检查状态码:使用 response.raise_for_status() 是检查请求成功与否的简单有效方法。
  4. 设置合理的 User-Agent:很多网站会屏蔽默认的 requests User-Agent,设置一个常见的浏览器 User-Agent 可以提高请求成功率。
  5. 设置 timeout:为你的请求设置一个超时时间,防止你的程序卡死。
  6. 遵守 robots.txt:在爬取或下载网站内容前,请务必检查该网站的 robots.txt 文件(https://www.example.com/robots.txt),尊重网站的规则。
  7. 注意版权:下载和使用图片时,请务必遵守相关的版权法律和网站的使用条款。
功能 关键代码/方法 说明
发送请求 requests.get(url, stream=True) 获取图片URL,并开启流式下载。
检查成功 response.raise_for_status() 如果请求失败(非2xx状态码),则抛出异常。
response.content 获取图片的完整二进制数据。
分块获取 response.iter_content(chunk_size=...) 流式模式下,分块获取内容,节省内存。
保存文件 with open(filename, 'wb') as f: f.write(...) 以二进制写入模式打开文件并保存内容。
处理异常 try...except requests.exceptions.RequestException 捕获所有与 requests 相关的异常。
模拟浏览器 headers={'User-Agent': '...'} 设置请求头,避免被网站屏蔽。
防止卡死 timeout=10 设置请求超时时间。

掌握了这些,你就可以灵活地使用 requests 库来处理各种图片下载任务了。

分享:
扫描分享到社交APP
上一篇
下一篇