如何在不丢失信息的情况下从谷歌下载图像以及如何使用 Python 使用枕头模块阅读它们



从谷歌搜索页面下载图像然后将相同的图像保存到磁盘时,我遇到了一些问题。我在阅读同一图像时也遇到问题。

问题 1:(下载映像并保存到磁盘( 我使用"请求"模块下载图像。下载图像后,如果我尝试打开它,它会显示以下错误而不是实际的图像内容(尝试了所有图像格式,如 JPG、PNG 等...... "看起来我们不支持这种文件格式">

注意:我也使用了urllib.requests模块来下载图像,在这种情况下,我也面临着同样的问题。

以下是使用的代码:

image_url = "https://www.google.com/imgres?imgurl=https%3A%2F%2Fi.etsystatic.com%2F16576605%2Fr%2Fil%2Fab973a%2F1811762786%2Fil_570xN.1811762786_ni8d.jpg&imgrefurl=https%3A%2F%2Fwww.etsy.com%2Flisting%2F676777770%2F8-styles-wood-acrylic-leather-endless&docid=Knls-viNHmqhZM&tbnid=WF4mlYC28VcOKM%3A&vet=10ahUKEwiB8v3NnezmAhWmzjgGHaWDCtIQMwgrKAAwAA..i&w=570&h=571&itg=1&bih=710&biw=1536&q=676777770&ved=0ahUKEwiB8v3NnezmAhWmzjgGHaWDCtIQMwgrKAAwAA&iact=mrc&uact=8"
with open(temp_file_path, "wb") as fil:
response = requests.get(image_url, stream=True)
response.raw.decode_content = True
shutil.copyfileobj(response.raw, fil)
fil.close()

问题 2:(使用 PIL 模块打开下载的映像( 下一步是读取下载的图像,我使用"PIL"(枕头(模块来执行此操作。但我面临以下问题。 "哎呀。无法识别图像错误:无法识别图像文件<_io。BufferedReader name='path\1.jpg'>">

注意:如果我使用手动下载的图像或捕获的图像,我能够正确读取它们。

以下是我使用的代码:

from PIL import Image
img = Image.open(open(temp_file_path, "rb"))

我认为这是因为字节与字符串的转换问题,但我无法弄清楚

我正在使用请求模块附加通过脚本下载的图像以供参考。

有人帮助我真是太好了....

我看到的问题是该网址没有直接转到图像。我用image_url="https://i.etsystatic.com/16576605/r/il/ab973a/1811762786/il_794xN.1811762786_ni8d.jpg"尝试了您的代码,一切都运行良好。

您可以使用urllib.request.urlretrieve(URL, 'your_filename.mp3/jpeg/png/whatever'下载图像

import urllib.request
URL = "https://i.etsystatic.com/16576605/r/il/ab973a/1811762786/il_570xN.1811762786_ni8d.jpg"
urllib.request.urlretrieve(URL, "perfect_filename.png")

有时它不会下载任何东西,因为请求是通过脚本(bot(发送的,如果你想解析来自谷歌图片或其他搜索引擎的图像,你需要先传递user-agent来请求headers,然后下载图像,否则,请求将被阻止并抛出错误。

传递user-agent并下载图像:

opener=urllib.request.build_opener()
opener.addheaders=[('User-Agent','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582')]
urllib.request.install_opener(opener)
urllib.request.urlretrieve(URL, 'image_name.jpg')

在线 IDE 中用于抓取和下载图像的代码和示例。


或者,您可以使用SerpApi的Google Images API来实现这一点。这是一个带有免费计划的付费 API。

不同之处在于,您不必处理从<script>标签中抓取数据或弄清楚如何绕过Google或其他搜索引擎的阻止,因为它已经为最终用户完成了。

要集成的代码:

from serpapi import GoogleSearch
import os
params = {
"api_key": os.getenv("API_KEY"),
"engine": "google",
"q": "pexels cat",
"tbm": "isch"
}
search = GoogleSearch(params)
results = search.get_dict()
for index, image in enumerate(results['images_results']):
print(f'Downloading {index} image...')

opener=urllib.request.build_opener()
opener.addheaders=[('User-Agent','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582')]
urllib.request.install_opener(opener)
urllib.request.urlretrieve(image['original'], f'SerpApi_Images/original_size_img_{index}.jpg')

免责声明,我为 SerpApi 工作。

最新更新