如何在 Python 中下载谷歌图片搜索结果

Posted

技术标签:

【中文标题】如何在 Python 中下载谷歌图片搜索结果【英文标题】:How to download google image search results in Python 【发布时间】:2016-06-18 23:38:53 【问题描述】:

这个问题之前已经被问过很多次了,但所有答案都至少有几年的历史,并且目前基于不再支持的 ajax.googleapis.com API。

有人知道另一种方法吗?我正在尝试下载大约一百个搜索结果,除了 Python API 之外,我还尝试了许多桌面、基于浏览器或浏览器插件的程序来执行此操作,但都失败了。

【问题讨论】:

你试过 Selenium 吗? Selenium 解决了它!我使用了代码simplypython.wordpress.com/2015/05/18/…,对滚动代码稍作改动。 (直接跳到页面底部不一定会导致延迟加载页面加载所有图像,所以我让它逐渐滚动。) github.com/hardikvasa/google-images-download 【参考方案1】:

使用Google Custom Search 来实现您想要实现的目标。 请参阅Python - Download Images from google Image search? 的@i08in 的 答案,它有很好的描述、脚本示例和库参考。

【讨论】:

我接受这一点,因为它肯定回答了问题!我还想指出,Google 的 API 有一些限制,旨在禁止人们使用它们,例如,像我一样自动收集搜索结果试图这样做,所以这种方法可能会遇到权限问题。 @Morgan G 使用 Selenium 的建议对我很有用!【参考方案2】:

要使用 Selenium 从 Google 图片搜索中下载任意数量的图片:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import os
import json
import urllib2
import sys
import time

# adding path to geckodriver to the OS environment variable
# assuming that it is stored at the same path as this script
os.environ["PATH"] += os.pathsep + os.getcwd()
download_path = "dataset/"

def main():
    searchtext = sys.argv[1] # the search query
    num_requested = int(sys.argv[2]) # number of images to download
    number_of_scrolls = num_requested / 400 + 1 
    # number_of_scrolls * 400 images will be opened in the browser

    if not os.path.exists(download_path + searchtext.replace(" ", "_")):
        os.makedirs(download_path + searchtext.replace(" ", "_"))

    url = "https://www.google.co.in/search?q="+searchtext+"&source=lnms&tbm=isch"
    driver = webdriver.Firefox()
    driver.get(url)

    headers = 
    headers['User-Agent'] = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/41.0.2228.0 Safari/537.36"
    extensions = "jpg", "jpeg", "png", "gif"
    img_count = 0
    downloaded_img_count = 0

    for _ in xrange(number_of_scrolls):
        for __ in xrange(10):
            # multiple scrolls needed to show all 400 images
            driver.execute_script("window.scrollBy(0, 1000000)")
            time.sleep(0.2)
        # to load next 400 images
        time.sleep(0.5)
        try:
            driver.find_element_by_xpath("//input[@value='Show more results']").click()
        except Exception as e:
            print "Less images found:", e
            break

    # imges = driver.find_elements_by_xpath('//div[@class="rg_meta"]') # not working anymore
    imges = driver.find_elements_by_xpath('//div[contains(@class,"rg_meta")]')
    print "Total images:", len(imges), "\n"
    for img in imges:
        img_count += 1
        img_url = json.loads(img.get_attribute('innerHTML'))["ou"]
        img_type = json.loads(img.get_attribute('innerHTML'))["ity"]
        print "Downloading image", img_count, ": ", img_url
        try:
            if img_type not in extensions:
                img_type = "jpg"
            req = urllib2.Request(img_url, headers=headers)
            raw_img = urllib2.urlopen(req).read()
            f = open(download_path+searchtext.replace(" ", "_")+"/"+str(downloaded_img_count)+"."+img_type, "wb")
            f.write(raw_img)
            f.close
            downloaded_img_count += 1
        except Exception as e:
            print "Download failed:", e
        finally:
            print
        if downloaded_img_count >= num_requested:
            break

    print "Total downloaded: ", downloaded_img_count, "/", img_count
    driver.quit()

if __name__ == "__main__":
    main()

完整代码是here。

【讨论】:

这适用于 18 年 12 月。我最多可以下载 1000 张图片【参考方案3】:

确保先安装 icrawler 库,然后使用。

pip install icrawler
from icrawler.builtin import GoogleImageCrawler
google_Crawler = GoogleImageCrawler(storage = 'root_dir': r'write the name of the directory you want to save to here')
google_Crawler.crawl(keyword = 'sad human faces', max_num = 800)

【讨论】:

【参考方案4】:

对 Ravi Hirani 的回答稍加改进,最简单的方法就是这样做:

from icrawler.builtin import GoogleImageCrawler

google_crawler = GoogleImageCrawler(storage='root_dir': 'D:\\projects\\data core\\helmet detection\\images')
google_crawler.crawl(keyword='cat', max_num=100)

来源:https://pypi.org/project/icrawler/

【讨论】:

【参考方案5】:

这个怎么样?

https://github.com/hardikvasa/google-images-download

它允许您下载数百张图片,并有大量过滤器可供选择以自定义您的搜索


如果您希望每个关键字下载 100 多张图片,则需要安装“selenium”和“chromedriver”。

如果您已经 pip 安装了库或运行 setup.py 文件,Selenium 会自动安装在您的机器上。您的机器上还需要 Chrome 浏览器。对于 chromedriver:

根据您的操作系统下载正确的 chromedriver。

在 Windows 或 MAC 上,如果由于某种原因 chromedriver 给您带来麻烦,请在当前目录下下载并运行命令。

然而,在 windows 上,chromedriver 的路径必须以以下格式给出:

C:\complete\path\to\chromedriver.exe

在 Linux 上,如果您在安装 google chrome 浏览器时遇到问题,请参阅此 CentOS 或 Amazon Linux 指南或 Ubuntu 指南

对于所有操作系统,您都必须使用“--chromedriver”或“-cd”参数来指定已下载到机器中的 chromedriver 的路径。

【讨论】:

这只允许下载最多 100 张图片 使用 chromedriver,您可以从上述库中下载数百张图片...不仅限于 100 张。说明在 README 文件中。 :) 有没有办法让它停止跳过没有图像格式的图像? (例如partycity6.scene7.com/is/image/PartyCity/…),而是以其他方式下载它们?【参考方案6】:

我一直在使用这个脚本从谷歌搜索中下载图像,我一直在使用它们来训练我的分类器 下面的代码可以下载100张与查询相关的图片

from bs4 import BeautifulSoup
import requests
import re
import urllib2
import os
import cookielib
import json

def get_soup(url,header):
    return BeautifulSoup(urllib2.urlopen(urllib2.Request(url,headers=header)),'html.parser')


query = raw_input("query image")# you can change the query for the image  here
image_type="ActiOn"
query= query.split()
query='+'.join(query)
url="https://www.google.co.in/search?q="+query+"&source=lnms&tbm=isch"
print url
#add the directory for your image here
DIR="Pictures"
header='User-Agent':"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.134 Safari/537.36"

soup = get_soup(url,header)


ActualImages=[]# contains the link for Large original images, type of  image
for a in soup.find_all("div","class":"rg_meta"):
    link , Type =json.loads(a.text)["ou"]  ,json.loads(a.text)["ity"]
    ActualImages.append((link,Type))

print  "there are total" , len(ActualImages),"images"

if not os.path.exists(DIR):
            os.mkdir(DIR)
DIR = os.path.join(DIR, query.split()[0])

if not os.path.exists(DIR):
            os.mkdir(DIR)
###print images
for i , (img , Type) in enumerate( ActualImages):
    try:
        req = urllib2.Request(img, headers='User-Agent' : header)
        raw_img = urllib2.urlopen(req).read()

        cntr = len([i for i in os.listdir(DIR) if image_type in i]) + 1
        print cntr
        if len(Type)==0:
            f = open(os.path.join(DIR , image_type + "_"+ str(cntr)+".jpg"), 'wb')
        else :
            f = open(os.path.join(DIR , image_type + "_"+ str(cntr)+"."+Type), 'wb')


        f.write(raw_img)
        f.close()
    except Exception as e:
        print "could not load : "+img
        print e

【讨论】:

【参考方案7】:

我正在尝试this library,它可以同时用作命令行工具或 python 库。它有很多论据来查找具有不同标准的图像。

这些是从其文档中提取的示例,将其用作 python 库:

from google_images_download import google_images_download   #importing the library

response = google_images_download.googleimagesdownload()   #class instantiation

arguments = "keywords":"Polar bears,baloons,Beaches","limit":20,"print_urls":True   #creating list of arguments
paths = response.download(arguments)   #passing the arguments to the function
print(paths)   #printing absolute paths of the downloaded images

或者作为命令行工具,如下:

$ googleimagesdownload --k "car" -sk 'red,blue,white' -l 10

您可以使用pip install google_images_download 安装它

【讨论】:

【参考方案8】:

解决这个问题的一个简单方法是安装一个名为google_images_download的python包

pip install google_images_download

使用这个 python 代码

from google_images_download import google_images_download  

response = google_images_download.googleimagesdownload()
keywords = "apple fruit"
arguments = "keywords":keywords,"limit":20,"print_urls":True
paths = response.download(arguments)
print(paths)

调整限制以控制要下载的图像数量

但有些图片可能已损坏,因此无法打开

更改 keywords 字符串以获得您需要的输出

【讨论】:

【参考方案9】:

您需要使用自定义搜索 API。这里有一个方便的explorer。我使用 urllib2。您还需要从开发者控制台为您的应用程序创建一个 API 密钥。

【讨论】:

更好的解决方案是通过更改要从类而不是独立 python 脚本运行的代码,将 hardikvasa 代码包装在 API 中。这样就不需要 API 密钥。 API 密钥都很好,但它们只是测试的另一个障碍。【参考方案10】:

我尝试了很多代码,但没有一个适合我。我在这里发布我的工作代码。希望它会帮助别人。

我正在使用 Python 3.6 版并使用 icrawler

首先,您需要在系统中下载icrawler

然后运行下面的代码。

from icrawler.examples import GoogleImageCrawler
google_crawler = GoogleImageCrawler()
google_crawler.crawl(keyword='krishna', max_num=100)

keyword krishna 替换为您想要的文本。

注意:- 下载的图片需要路径。现在我使用放置脚本的相同目录。您可以通过以下代码设置自定义目录。

google_crawler = GoogleImageCrawler('path_to_your_folder')

【讨论】:

什么是icrawler.examples? 我写代码的时候,icrawler的版本是0.1.5。 pypi.org/project/icrawler/0.1.5 我已经修改了该代码行。感谢您指出。 @SoumyaBoral :安装pip install icrawler==0.1.5 应该是from icrawler.builtin import GoogleImageCrawler

以上是关于如何在 Python 中下载谷歌图片搜索结果的主要内容,如果未能解决你的问题,请参考以下文章

图片哈希概论及python中如何实现对比两张相似的图片

从Google搜索中获取某些图片的网址

Python 爬取美女图片,分目录多级存储

从 Google 选择并下载随机图片

通过百度大家都在搜进去的网页会有病毒吗?

python爬取百度搜索图片