2009-11-01 16 views
51

Estoy tratando de ejecutar una consulta de búsqueda de Google desde una aplicación de Python. ¿Hay alguna interfaz de Python que me permita hacer esto? Si no hay nadie sabe qué API de Google me permitirá hacer esto. Gracias.Búsqueda de Google desde una aplicación de Python

Respuesta

70

Hay un ejemplo simple here (curiosamente faltan algunas comillas ;-). La mayoría de lo que verás en la web son las interfaces de Python con la antigua API de SOAP discontinuada; el ejemplo que estoy señalando utiliza la API AJAX más nueva y compatible, ¡esa es definitivamente la que deseas! -)

Editar: aquí hay un más completo ejemplo de Python 2.6 con todas las citas necesarias y c; -) ...:

#!/usr/bin/python 
import json 
import urllib 

def showsome(searchfor): 
    query = urllib.urlencode({'q': searchfor}) 
    url = 'http://ajax.googleapis.com/ajax/services/search/web?v=1.0&%s' % query 
    search_response = urllib.urlopen(url) 
    search_results = search_response.read() 
    results = json.loads(search_results) 
    data = results['responseData'] 
    print 'Total results: %s' % data['cursor']['estimatedResultCount'] 
    hits = data['results'] 
    print 'Top %d hits:' % len(hits) 
    for h in hits: print ' ', h['url'] 
    print 'For more results, see %s' % data['cursor']['moreResultsUrl'] 

showsome('ermanno olmi') 
+3

Intenté esto en mi máquina Linux local y luego Google pensó que soy un bot y cualquier búsqueda de mi navegador es captcha ¡Ed! No debería haber intentado esto en el trabajo, solo un aviso para alguien que usa esto. ¡Agregue agente de usuario y referencia para que se vea más como una solicitud genuina! – ThinkCode

+11

Lamentablemente, la [API de búsqueda web de Google] (http://code.google.com/apis/websearch/) en la que se basa esta tecnología estaba en desuso en noviembre de 2010. Se supone que la API de búsqueda personalizada debe reemplazarla, pero es necesario que configure una lista de URL para buscar, no toda la web. – Day

+3

a partir de hoy (2014.06.10), esto está funcionando ... en mi IPython/Python2.7.6 – kmonsoor

17

aquí está la respuesta de Alex portado a python3

#!/usr/bin/python3 
import json 
import urllib.request, urllib.parse 

def showsome(searchfor): 
    query = urllib.parse.urlencode({'q': searchfor}) 
    url = 'http://ajax.googleapis.com/ajax/services/search/web?v=1.0&%s' % query 
    search_response = urllib.request.urlopen(url) 
    search_results = search_response.read().decode("utf8") 
    results = json.loads(search_results) 
    data = results['responseData'] 
    print('Total results: %s' % data['cursor']['estimatedResultCount']) 
    hits = data['results'] 
    print('Top %d hits:' % len(hits)) 
    for h in hits: print(' ', h['url']) 
    print('For more results, see %s' % data['cursor']['moreResultsUrl']) 

showsome('ermanno olmi') 
+0

¿Cuál sería la ventaja de usar Python 3 sobre la respuesta de Alex? –

+1

@Phill, no estoy seguro de lo que quiere decir con "ventaja". Si su proyecto usa Python2, usa la respuesta de Alex. Si el proyecto usa Python3, puede usar esta respuesta.Desafortunadamente no es realmente práctico escribir esta función de tal manera que use el mismo código con las dos versiones de Python –

+0

. Supongo que mi pregunta es ¿por qué usar Python3 sobre Python2? ¿Cuales son los beneficios? Nuevo en Python, proveniente del fondo de PHP. ¿Están las cosas más formalizadas? –

11

aquí es mi acercamiento a este : http://breakingcode.wordpress.com/2010/06/29/google-search-python/

Un par de ejemplos de código:

# Get the first 20 hits for: "Breaking Code" WordPress blog 
    from google import search 
    for url in search('"Breaking Code" WordPress blog', stop=20): 
     print(url) 

    # Get the first 20 hits for "Mariposa botnet" in Google Spain 
    from google import search 
    for url in search('Mariposa botnet', tld='es', lang='es', stop=20): 
     print(url) 

Tenga en cuenta que este código no utiliza el API de Google, y sigue trabajando hasta la fecha (enero de 2012).

+0

HI Mario, he tratado de usar tu script y es fabuloso. Me enfrenta solo a un problema: incluso cuando uso .COM como TLD obtengo los resultados que aparecen en .CO.IN. ¿Puedes ayudarme? –

+0

Tenga en cuenta que esto puede romperse en cualquier momento, ya que no está utilizando una API oficial, sino que está raspando la página de resultados de Google, p. si Google cambia la forma en que se devuelven los resultados. – stracktracer

6

Soy nuevo en python y estaba investigando cómo hacer esto. Ninguno de los ejemplos proporcionados funciona correctamente para mí. Algunos están bloqueados por google si realiza muchas (pocas) solicitudes, algunas están desactualizadas. Analizando el html de búsqueda de google (agregando el encabezado en la solicitud) funcionará hasta que google cambie la estructura html nuevamente. Puede usar la misma lógica para buscar en cualquier otro motor de búsqueda, buscando en el html (view-source).

import urllib2 

def getgoogleurl(search,siteurl=False): 
    if siteurl==False: 
     return 'http://www.google.com/search?q='+urllib2.quote(search) 
    else: 
     return 'http://www.google.com/search?q=site:'+urllib2.quote(siteurl)+'%20'+urllib2.quote(search) 

def getgooglelinks(search,siteurl=False): 
    #google returns 403 without user agent 
    headers = {'User-agent':'Mozilla/11.0'} 
    req = urllib2.Request(getgoogleurl(search,siteurl),None,headers) 
    site = urllib2.urlopen(req) 
    data = site.read() 
    site.close() 

    #no beatifulsoup because google html is generated with javascript 
    start = data.find('<div id="res">') 
    end = data.find('<div id="foot">') 
    if data[start:end]=='': 
     #error, no links to find 
     return False 
    else: 
     links =[] 
     data = data[start:end] 
     start = 0 
     end = 0   
     while start>-1 and end>-1: 
      #get only results of the provided site 
      if siteurl==False: 
      start = data.find('<a href="/url?q=') 
      else: 
      start = data.find('<a href="/url?q='+str(siteurl)) 
      data = data[start+len('<a href="/url?q='):] 
      end = data.find('&amp;sa=U&amp;ei=') 
      if start>-1 and end>-1: 
       link = urllib2.unquote(data[0:end]) 
       data = data[end:len(data)] 
       if link.find('http')==0: 
        links.append(link) 
     return links 

Uso:

links = getgooglelinks('python','http://www.stackoverflow.com/') 
for link in links: 
     print link 

(Edición 1: Adición de un parámetro para limitar la búsqueda Google a un sitio específico)

(Edit 2: Cuando añadí esta respuesta fue la codificación de una Script de Python para buscar subtítulos. Hace poco lo cargué en Github: Subseek)

+0

Me interesa saber por qué ninguno de los ejemplos funcionó para usted, especialmente la parte sobre BeautifulSoup que no funciona porque el código HTML está generado por JavaScript ... Lo intenté ahora mismo y funciona: http: //breakingcode.wordpress .com/2010/06/29/google-search-python/ – MarioVilas

+0

En mi caso, no pude usar BeautifulSoup. Lo probé y parece que Google estaba generando la respuesta html con bloques de JavaScript, por lo que no encontré la forma de obtener los enlaces con la clase BS. Solo encontré los enlaces en la respuesta usando la función "buscar". –

+0

Tal vez la URL de Google apunta a la API más nueva que usa JavaScript en lugar de la API heredada que usó HTML desnudo. Creo que agregar "& btnG = Google + Search" en sus consultas hace que use la API HTML, o al menos esa es la única diferencia que veo. – MarioVilas

Cuestiones relacionadas