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!
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!
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 .
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.
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
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)
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
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 keyword
krishna
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')
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.
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.
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