web-dev-qa-db-de.com

So laden Sie Google Bildersuchergebnisse in Python herunter

Diese Frage wurde schon oft gestellt, aber alle Antworten sind mindestens ein paar Jahre alt und basieren derzeit auf der API ajax.googleapis.com, die nicht mehr unterstützt wird.

Kennt jemand einen anderen Weg? Ich versuche, etwa hundert Suchergebnisse herunterzuladen, und zusätzlich zu den Python-APIs habe ich zahlreiche Desktop-, Browser-basierte oder Browser-Addon-Programme ausprobiert, die alle fehlgeschlagen sind.

Vielen Dank!

10
xanderflood

Verwenden Sie die Google Custom Search , um zu erreichen, was Sie erreichen möchten. Siehe @ i08ins Antwort von " Python - Bilder von Google herunterladen Bildersuche? " Es hat eine großartige Beschreibung, Skriptbeispiele und Bibliotheksreferenzen.

Viel Glück!

6
Andriy Ivaneyko

So laden Sie beliebig viele Bilder von der Google-Bildersuche mit Selenium herunter

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()

Vollständiger Code ist hier

4
atif93

Wie wäre es mit diesem?

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

sie können Hunderte von Bildern herunterladen, und Sie können aus einer Vielzahl von Filtern wählen, um Ihre Suche anzupassen


Wenn Sie mehr als 100 Bilder pro Keyword herunterladen möchten, müssen Sie 'Selenium' zusammen mit 'Chromedriver' installieren.

Wenn Sie die Bibliothek mit pip installiert haben oder die Datei setup.py ausführen, hätte Selenium automatisch auf Ihrem Computer installiert. Sie benötigen außerdem einen Chrome-Browser auf Ihrem Computer. Für chromdriver:

Laden Sie den richtigen Chromdriver für Ihr Betriebssystem herunter.

Wenn Sie unter Windows oder MAC Probleme mit dem Chromedriver haben, laden Sie ihn unter dem aktuellen Verzeichnis herunter und führen Sie den Befehl aus.

Unter Windows muss jedoch der Pfad zum Chromreiber in folgendem Format angegeben werden:

C:\vollständiger\Pfad\zu\chromedriver.exe

Wenn Sie unter Linux Probleme bei der Installation des Google Chrome-Browsers haben, schlagen Sie in diesem CentOS- oder Amazon Linux-Handbuch oder Ubuntu-Handbuch nach

Für alle Betriebssysteme müssen Sie das Argument '--chromedriver' oder '-cd' verwenden, um den Pfad des Chromedrivers anzugeben, den Sie in Ihre Maschine heruntergeladen haben.

3
hnvasa

ich habe dieses Skript verwendet, um Bilder von der Google-Suche herunterzuladen, und ich habe sie für mein Training meiner Klassifizierer verwendet. Der Code unten kann 100 Bilder herunterladen, die sich auf die Abfrage beziehen 

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

Ein wenig an Ravi Hiranis Antwort zu verbessern, ist der einfachste Weg, dies zu tun: 

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)

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

2
Soumya Boral

Eine einfache Lösung für dieses Problem besteht darin, ein python Paket mit dem Namen google_images_download zu installieren.

pip install google_images_download

benutze diesen python code

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)

passen Sie das Limit an, um die Anzahl der herunterzuladenden Bilder zu steuern

einige Bilder lassen sich jedoch nicht öffnen, da sie möglicherweise beschädigt sind

ändern Sie den String keywords, um die gewünschte Ausgabe zu erhalten

0
Avin_ash

Ich habe viele Codes ausprobiert, aber keiner von ihnen arbeitet für mich. Ich poste hier meinen Arbeitscode. Hoffe, es wird anderen helfen. 

Ich verwende Python Version 3.6 und benutzte icrawler

Zuerst müssen Sie icrawler in Ihr System herunterladen.

Dann unter dem Code ausführen.

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

Ersetzen Sie keywordkrishna durch Ihren gewünschten Text.

Note: - Das heruntergeladene Bild benötigt einen Pfad. Jetzt habe ich dasselbe Verzeichnis verwendet, in dem das Skript abgelegt wurde. Sie können ein benutzerdefiniertes Verzeichnis mit dem folgenden Code festlegen.

google_crawler = GoogleImageCrawler('path_to_your_folder')
0
Ravi Hirani

Sie müssen die benutzerdefinierte Such-API verwenden. Es gibt einen praktischen Explorer hier. Ich benutze urllib2. Sie müssen auch einen API-Schlüssel für Ihre Anwendung von der Entwicklerkonsole aus erstellen.

0

Ich versuche diese Bibliothek die als beides verwendet werden kann: ein Befehlszeilentool oder eine Python-Bibliothek. Es gibt viele Argumente, um Bilder mit unterschiedlichen Kriterien zu finden.

Dies sind Beispiele aus der Dokumentation, um sie als Python-Bibliothek zu verwenden:

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

oder als Befehlszeilentool wie folgt:

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

Sie können dies mit pip install google_images_download installieren.

0
Rodrigo Laguna

Um das Beste aus googleimagedownload herauszuholen, verwenden Sie pip3 install, um es zu erhalten, und verwenden Sie dann den folgenden Wrapper, um es in eine API umzuwandeln. Grundsätzlich können Sie sehen, dass ich als Teil des Codes gesagt habe, 10 große Bilder herunterzuladen, die zur Wiederverwendung mit einem Label gekennzeichnet sind (von den Originalautoren falsch geschrieben). Wenn ich kein Argument mit dem Namen -k = "gelber Pfeffer" übergebe, werden standardmäßig 10 Bilder von rotem Pfeffer heruntergeladen. Sie können die Standardargumente im Wörterbuch googleImageDownloader, die ich zur Verfügung gestellt habe, ändern, sofern Sie den google_images_download.py des Entwicklers entsprechen.

#!/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 )

Also führe ich einfach die obige imagedownload.py aus und übergebe jedes Argument mit - oder -:

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

um folgendes Ergebnis zu erhalten:

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