2016-03-05 22 views
6

Questa domanda è stata posta numerose volte prima, ma tutte le risposte hanno almeno un paio di anni e attualmente si basano sull'API di ajax.googleapis.com, che non è più supportata.Come scaricare i risultati della ricerca di immagini google in Python

Qualcuno sa di un altro modo? Sto provando a scaricare un centinaio di risultati di ricerca, e oltre alle API Python ho provato numerosi programmi desktop, browser o add-on per il browser per fare ciò che non andava a buon fine.

Grazie!

+1

Hai provato selenio? –

+0

cosa intendi per "risultati della ricerca di immagini google"? – wong2

+0

Il selenio l'ha risolto! Ho usato il codice https://simplypython.wordpress.com/2015/05/18/saving-images-from-google-search-using-selenium-and-python/, con una leggera modifica al codice a scorrimento. (Saltare direttamente nella parte inferiore della pagina non * necessariamente * fa sì che una pagina caricata lentamente carichi tutte le immagini, quindi l'ho fatta scorrere gradualmente.) – xanderflood

risposta

4

Utilizzare lo Google Custom Search per ciò che si desidera ottenere. Vedere @ i08in's risposta di "Python - Download Images from google Image search?" ha un'ottima descrizione, esempi di script e riferimenti biblioteche.

Buona fortuna!

+0

Lo accetto perché sicuramente risponde alla domanda! voglio sottolineare che le API di Google hanno restrizioni progettate per inibire le persone che li utilizzano, ad esempio, per automatizzare la raccolta dei risultati di ricerca come sto cercando di fare, quindi questo approccio potrebbe incorrere in problemi di autorizzazione. Il suggerimento di @Morgan G di usare Selenium ha funzionato alla grande per me! – xanderflood

0

È necessario utilizzare l'API di ricerca personalizzata. C'è un comodo explorer qui. Io uso urllib2. Devi anche creare una chiave API per la tua applicazione dalla console per sviluppatori.

2

Ho utilizzato questo script per scaricare le immagini da Google Search e devo stato con loro per il mio trainig miei classificatori il codice qui sotto è possibile scaricare 100 immagini relative alla query

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

Per scaricare qualsiasi numero di immagini da Google ricerca immagini utilizzando Selenio:

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

codice completa è here.

+0

non funziona, potresti modificare? –

+0

Puoi dire per favore l'errore che stai ricevendo? – atif93

+1

Ho cambiato il codice, dovrebbe funzionare ora. – atif93