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

How to download google image search results in Python

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

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

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

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

我一直在使用这个脚本从 google 搜索下载图像,我一直在使用它们来训练我的分类器 下面的代码可以下载 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

要使用 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

这个怎么样?

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

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


如果您想为每个关键字下载超过 100 张图片,那么您需要安装 'selenium' 和 'chromedriver'。

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

根据您的操作系统下载正确的chrome驱动程序。

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

然而,在 windows 上,chrome驱动程序的路径必须按以下格式给出:

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

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

对于所有操作系统,您必须使用“--chromedriver”或“-cd”参数来指定您在计算机中下载的chrome驱动程序的路径。

我尝试了很多代码,但 none 对我有用。我在这里发布我的工作代码。希望它能帮助别人。

我正在使用 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')

对 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/

我正在尝试 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

安装它

解决此问题的一个简单方法是安装名为 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)

调整图片下载数量限制

but some images won't open as they might be corrupt

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

确保你先安装了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)