使用 Python 从 url 下载图像时出现问题
Issue when downloading image from url with Python
我正在尝试使用请求和 shutil 库从 URL 和 Python 下载图像。我的代码如下:
import requests
import shutil
image_url = "https://www.metmuseum.org/-/media/images/visit/met-fifth-avenue/fifthave_teaser.jpg"
with open("image1.jpg", "wb") as file:
response = requests.get(image_url, stream=True)
response.raw.decode_content = True
shutil.copyfileobj(response.raw, file)
file.close()
此代码适用于我尝试过的大多数其他图像 url(例如:https://tinyjpg.com/images/social/website.jpg)。但是,对于代码中的 image_url,会创建一个 1kb 的文件,并显示错误消息“看起来我们不支持此文件格式。”
我也试过:
import urllib
urllib.request.urlretrieve(image_url, "image1.jpg)
可以使用 Seleniumwire 执行此操作 - 我使用 driver.requests 获取网站发出的所有请求的列表,然后遍历这些请求,直到我得到 request.response.header,其中包括文件类型 (.jpg)。似乎有两个具有相同 url 的请求(第一个具有内容类型 'text/html',第二个具有 'image/jpg')。
我想 运行 在不加载 WebDriver 的情况下执行此操作。有什么方法可以使用请求功能下载这样的图像吗?
如果您查看 response.text
,您会看到服务器不喜欢您的请求 header 并认为您是机器人:
'<html>\r\n<head>\r\n<META NAME="robots" CONTENT="noindex,nofollow">\r\n<script src="/_Incapsula_Resource?SWJIYLWA=5074a744e2e3d891814e9a2dace20bd4,719d34d31c8e3a6e6fffd425f7e032f3">\r\n</script>\r\n<body>\r\n</body></html>\r\n'
但如果您提供适当的 User-Agent header 它的响应会发生变化,您可以继续保存文件:
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.106 Safari/537.36'}
response = requests.get(image_url, stream=True, headers=headers)
with open("image1.jpg", "bw") as file:
file.write(response.content)
所以你必须在请求 header 中模拟一个 user-agent 来获取这张图片。
此外,with
是一个上下文管理器,它已经为您关闭了文件。
我正在尝试使用请求和 shutil 库从 URL 和 Python 下载图像。我的代码如下:
import requests
import shutil
image_url = "https://www.metmuseum.org/-/media/images/visit/met-fifth-avenue/fifthave_teaser.jpg"
with open("image1.jpg", "wb") as file:
response = requests.get(image_url, stream=True)
response.raw.decode_content = True
shutil.copyfileobj(response.raw, file)
file.close()
此代码适用于我尝试过的大多数其他图像 url(例如:https://tinyjpg.com/images/social/website.jpg)。但是,对于代码中的 image_url,会创建一个 1kb 的文件,并显示错误消息“看起来我们不支持此文件格式。”
我也试过:
import urllib
urllib.request.urlretrieve(image_url, "image1.jpg)
可以使用 Seleniumwire 执行此操作 - 我使用 driver.requests 获取网站发出的所有请求的列表,然后遍历这些请求,直到我得到 request.response.header,其中包括文件类型 (.jpg)。似乎有两个具有相同 url 的请求(第一个具有内容类型 'text/html',第二个具有 'image/jpg')。
我想 运行 在不加载 WebDriver 的情况下执行此操作。有什么方法可以使用请求功能下载这样的图像吗?
如果您查看 response.text
,您会看到服务器不喜欢您的请求 header 并认为您是机器人:
'<html>\r\n<head>\r\n<META NAME="robots" CONTENT="noindex,nofollow">\r\n<script src="/_Incapsula_Resource?SWJIYLWA=5074a744e2e3d891814e9a2dace20bd4,719d34d31c8e3a6e6fffd425f7e032f3">\r\n</script>\r\n<body>\r\n</body></html>\r\n'
但如果您提供适当的 User-Agent header 它的响应会发生变化,您可以继续保存文件:
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.106 Safari/537.36'}
response = requests.get(image_url, stream=True, headers=headers)
with open("image1.jpg", "bw") as file:
file.write(response.content)
所以你必须在请求 header 中模拟一个 user-agent 来获取这张图片。
此外,with
是一个上下文管理器,它已经为您关闭了文件。