2012-02-16 17 views
6

Estoy intentando obtener imágenes de Google Búsqueda de imágenes para una consulta específica. Pero la página que descargo no tiene imágenes y me redirecciona a la original de Google. Aquí está mi código:Python: la URL correcta para descargar imágenes desde la Búsqueda de imágenes de Google

AGENT_ID = "Mozilla/5.0 (X11; Linux x86_64; rv:7.0.1) Gecko/20100101 Firefox/7.0.1" 

GOOGLE_URL = "https://www.google.com/images?source=hp&q={0}" 

_myGooglePage = "" 

def scrape(self, theQuery) : 
    self._myGooglePage = subprocess.check_output(["curl", "-L", "-A", self.AGENT_ID, self.GOOGLE_URL.format(urllib.quote(theQuery))], stderr=subprocess.STDOUT) 
    print self.GOOGLE_URL.format(urllib.quote(theQuery)) 
    print self._myGooglePage 
    f = open('./../../googleimages.html', 'w') 
    f.write(self._myGooglePage) 

¿Qué estoy haciendo mal?

Gracias

+1

al menos tiene que cerrar el identificador de archivo –

+0

funcionó! gracias – lorussian

+0

@silviolor: Sé que no ayuda a su problema, pero ¿por qué no utilizar el módulo 'urllib2' incorporado de python en lugar de' curl'. – RanRag

Respuesta

3

te voy a dar una pista ... Comience aquí:

https://ajax.googleapis.com/ajax/services/search/images?v=1.0&q=JULIE%20NEWMAR

Cuando Julie y Newmar son los términos de búsqueda.

que devolverá los datos JSON que necesita ... Tendrá que analizar que el uso de json.load o simplejson.load para volver un diccionario ... seguido de buceo en ella para encontrar primero el responseData, luego el lista de resultados que contiene los elementos individuales cuyo url que luego desea descargar.

Aunque no sugiero de ninguna manera hacer raspado automático de Google, ya que su (deprecated) API específicamente dice que no.

+0

gracias, de esta manera se ve realmente más fácil. – lorussian

+0

Tenga en cuenta que esta API ya no está disponible. – prooffreader

3
+0

Hola, su script parece estar usando PIL. Lamentablemente, parece que tengo GRANDES problemas para instalar PIL en esta máquina. Ya que solo necesito las imágenes, sin transformarlas de ninguna manera, ¿hay alguna manera de escapar sin ella? –

+0

No estoy seguro de cómo evitar PIL, pero recomiendo MacPorts si está utilizando una Mac para simplificar la instalación del paquete e instalar PIL por usted. – crizCraig

+0

O mejor, Homebrew: http://brew.sh/ –

6

Este es el código en Python que utilizo para buscar y descargar imágenes de Google, creo que sirve:

import os 
import sys 
import time 
from urllib import FancyURLopener 
import urllib2 
import simplejson 

# Define search term 
searchTerm = "hello world" 

# Replace spaces ' ' in search term for '%20' in order to comply with request 
searchTerm = searchTerm.replace(' ','%20') 


# Start FancyURLopener with defined version 
class MyOpener(FancyURLopener): 
    version = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11' 
myopener = MyOpener() 

# Set count to 0 
count= 0 

for i in range(0,10): 
    # Notice that the start changes for each iteration in order to request a new set of images for each loop 
    url = ('https://ajax.googleapis.com/ajax/services/search/images?' + 'v=1.0&q='+searchTerm+'&start='+str(i*4)+'&userip=MyIP') 
    print url 
    request = urllib2.Request(url, None, {'Referer': 'testing'}) 
    response = urllib2.urlopen(request) 

    # Get results using JSON 
    results = simplejson.load(response) 
    data = results['responseData'] 
    dataInfo = data['results'] 

    # Iterate for each result and get unescaped url 
    for myUrl in dataInfo: 
     count = count + 1 
     print myUrl['unescapedUrl'] 

     myopener.retrieve(myUrl['unescapedUrl'],str(count)+'.jpg') 

    # Sleep for one second to prevent IP blocking from Google 
    time.sleep(1) 

También puede encontrar información muy útil here.

+0

¿Es posible definir el tipo de imagen en la url dada a Google – erogol

+0

? No lo he visto por un tiempo, pero consulte la última API de Google. Creo que la respuesta es sí, puedes refinar tu búsqueda a ".png", ".jpg" e incluso al formato basado en vectores ".svg". –

0

me acabo de unir para responder a esto, a pesar de que es viejo. hay una forma mucho más simple de hacer esto.

def google_image(x): 
     search = x.split() 
     search = '%20'.join(map(str, search)) 
     url = 'http://ajax.googleapis.com/ajax/services/search/images?v=1.0&q=%s&safe=off' % search 
     search_results = urllib.request.urlopen(url) 
     js = json.loads(search_results.read().decode()) 
     results = js['responseData']['results'] 
     for i in results: rest = i['unescapedUrl'] 
     return rest 

eso es todo.

+0

esto está en 3.x, así que reemplace urllib.request con urllib2 en 2.x obviamente. – riyoken

Cuestiones relacionadas