web-dev-qa-db-fra.com

Comment télécharger les résultats de recherche d'images Google en Python

Cette question a déjà été posée à plusieurs reprises, mais toutes les réponses datent d'au moins deux ans et reposent actuellement sur l'API ajax.googleapis.com, qui n'est plus prise en charge.

Est-ce que quelqu'un sait d'une autre manière? J'essaie de télécharger une centaine de résultats de recherche et, en plus des API Python, j'ai essayé de nombreux programmes de bureau, de navigateur ou d'ajout de navigateur, qui ont tous échoué.

Merci!

10
xanderflood

Utilisez le Recherche personnalisée Google pour ce que vous voulez réaliser. Voir @ i08in's answer of " Python - Télécharger des images à partir de Google Recherche d'images? " il a une excellente description, des exemples de scripts et des références de bibliothèques.

Bonne chance!

6
Andriy Ivaneyko

Pour télécharger un nombre illimité d'images à partir de la recherche d'images Google à l'aide de Selenium:

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 __== "__main__":
    main()

Le code complet est ici

4
atif93

Celui-ci, ça va?

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

il vous permet de télécharger des centaines d’images et propose une multitude de filtres pour personnaliser votre recherche.


Si vous souhaitez télécharger plus de 100 images par mot clé, vous devez installer «Selenium» avec «chromedriver».

Si vous avez installé la bibliothèque pip ou exécutez le fichier setup.py, Selenium s’est automatiquement installé sur votre ordinateur. Vous aurez également besoin du navigateur Chrome sur votre ordinateur. Pour chromedriver:

Téléchargez le bon pilote chromed en fonction de votre système d'exploitation.

Sous Windows ou MAC, si pour une raison quelconque, chromedriver vous pose problème, téléchargez-le dans le répertoire actuel et exécutez la commande.

Cependant, sur Windows, le chemin d'accès à chromedriver doit être indiqué dans le format suivant:

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

Sous Linux, si vous rencontrez des problèmes pour installer Google Chrome Browser, reportez-vous à ce Guide CentOS, Amazon Linux ou Ubuntu.

Pour Tous les systèmes d'exploitation, vous devrez utiliser les arguments '--chromedriver' ou '-cd' pour spécifier le chemin de chromedriver que vous avez téléchargé sur votre ordinateur.

3
hnvasa

j'utilise ce script pour télécharger des images à partir de la recherche google et je les utilise pour mon classement mes classificateurs. 

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
2
rishabhr0y

Pour améliorer un peu la réponse de Ravi Hirani, le moyen le plus simple consiste à utiliser ceci: 

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)

Source: https://pypi.org/project/icrawler/

2
Soumya Boral

J'ai essayé beaucoup de codes mais aucun d'entre eux ne fonctionnait pour moi. Je poste mon code de travail ici. J'espère que cela aidera les autres. 

J'utilise Python version 3.6 et utilisé icrawler

Tout d’abord, vous devez télécharger icrawler sur votre système.

Puis lancez le code ci-dessous.

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

Remplacez keywordkrishna par le texte de votre choix.

Note: - L'image téléchargée nécessite un chemin. En ce moment, j'ai utilisé le même répertoire que le script. Vous pouvez définir un répertoire personnalisé via le code ci-dessous.

google_crawler = GoogleImageCrawler('path_to_your_folder')
0
Ravi Hirani

Vous devez utiliser l'API de recherche personnalisée. Il y a un pratique Explorer ici. J'utilise urllib2. Vous devez également créer une clé API pour votre application à partir de la console du développeur.

0

J'essaie cette bibliothèque qui peut être utilisé à la fois: un outil de ligne de commande ou une bibliothèque python. Il y a beaucoup d'arguments pour trouver des images avec différents critères.

Ce sont des exemples tirés de sa documentation, pour l’utiliser comme une bibliothèque 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

ou comme un outil en ligne de commande, comme suit:

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

Vous pouvez l'installer avec pip install google_images_download

0
Rodrigo Laguna

Pour tirer le meilleur parti de googleimagedownload, utilisez pip3 install pour l'obtenir, puis utilisez l'encapsuleur suivant pour le transformer en une API. En gros, vous pouvez voir que, dans le code, j'ai téléchargé 10 grandes images qui sont marquées avec une étiquette pour les réutiliser (mal orthographiées par les auteurs originaux). Si je ne passe pas un argument de -k = "poivron jaune", il téléchargera 10 images de poivron rouge par défaut. Vous pouvez modifier les arguments par défaut du dictionnaire googleImageDownloader que j'ai fourni, comme vous le souhaitez, à condition qu'ils soient conformes au google_images_download.py du développeur.

#!/usr/bin/env python3

import sys
import subprocess
import re

def main( arguments ):
  googleImageDownloader = {'s':'large', 'l':'10', 'r':'labled-for-reuse', 'k':'red pepper'}
  for argvitem in arguments[1:]:
    argumentName = re.sub( r'^-(.*)', r'\1', argvitem )
    argumentName = re.sub( r'^-(.*)', r'\1', argumentName )
    argumentName = re.sub( r'(.*)=(.*)', r'\1', argumentName )
    value        = re.sub( r'(.*)=(.*)', r'\2', argvitem )

    googleImageDownloader[argumentName] = value

  callingString = "googleimagesdownload"
  for key, value in googleImageDownloader.items():
    if " " in value:
      value = "\"" + value + "\""

    callingString+= " -" + key + " " + value

  print( callingString )
  statusAndOutputText = subprocess.getstatusoutput( callingString )
  print( statusAndOutputText[1] )

if "__main__" == __name__:
  main( sys.argv )

Donc, je viens de lancer imagedownload.py ci-dessus en passant n'importe quel argument avec - ou -:

$ python ./imagedownload.py -k="yellow pepper"

pour obtenir le résultat suivant:

googleimagesdownload -s large -l 10 -k "yellow pepper" -r labeled-for-reuse

Item no.: 1 --> Item name = yellow pepper
Evaluating...
Starting Download...
Completed Image ====> 1. paprika-vegetables-yellow-red-53008.jpe
Completed Image ====> 2. plant-fruit-orange-food-pepper-produce-vegetable-yellow-peppers-bell-pepper-flowering-plant-yellow-pepper-land-plant-bell-peppers-and-chili-peppers-pimiento-habanero-chili-137913.jpg
Completed Image ====> 3. yellow-bell-pepper.jpg
Completed Image ====> 4. yellow_bell_pepper_group_store.jpg
Completed Image ====> 5. plant-fruit-food-produce-vegetable-yellow-peppers-bell-pepper-persimmon-diospyros-flowering-plant-sweet-pepper-yellow-pepper-land-plant-bell-peppers-and-chili-peppers-pimiento-habanero-chili-958689.jpg
Completed Image ====> 6. 2017-06-28-10-23-21.jpg
Completed Image ====> 7. yellow_bell_pepper_2017_a3.jpg
Completed Image ====> 8. 2017-06-26-12-06-35.jpg
Completed Image ====> 9. yellow-bell-pepper-1312593087h9f.jpg
Completed Image ====> 10. plant-fruit-food-pepper-produce-vegetable-macro-yellow-background-vegetables-peppers-bell-pepper-vitamins-flowering-plant-chili-pepper-annex-yellow-pepper-land-plant-bell-peppers-and-chili-peppers-pimiento-habanero-chili-1358020.jpg

Everything downloaded!
Total Errors: 0
0
Eamonn Kenny