12.7. Búsqueda en Google

Volvamos finalmente al ejemplo de código que vio al comienzo de este capítulo, que hace algo más útil y excitante que obtener la temperatura.

Google proporciona un API de SOAP para acceder de forma programática a buscar resultados. Para usarla deberá suscribirse a los Google Web Services.

Procedimiento 12.4. Suscripción a los Google Web Services

  1. Vaya a http://www.google.com/apis/ y cree una cuenta en Google. Esto sólo precisa de una dirección de correo electrónico. Tras registrarse recibirá por correo la clave de licencia de la Google API. Necesitará esta clave para pasarla como parámetro cada vez que invoque las funciones de búsqueda de Google.

  2. Descargue también desde http://www.google.com/apis/ el kit de desarrollo de Google Web API. Incluye algo de código de ejemplo en varios lenguajes de programación (pero no Python), y lo más importante, incluye el fichero WSDL.

  3. Descomprima el fichero del kit de desarrolo y busque GoogleSearch.wsdl. Copie este fichero a algún sitio permanente en su disco duro. Lo necesitará más adelante en este capítulo.

Una vez tenga la clave de desarrollador y el fichero WSDL de Google en un sitio conocido, puede empezar a jugar con los Google Web Services.

Ejemplo 12.12. Introspección de los Google Web Services

>>> from SOAPpy import WSDL
>>> server = WSDL.Proxy('/path/to/your/GoogleSearch.wsdl') 1
>>> server.methods.keys()                                  2
[u'doGoogleSearch', u'doGetCachedPage', u'doSpellingSuggestion']
>>> callInfo = server.methods['doGoogleSearch']
>>> for arg in callInfo.inparams:                          3
...     print arg.name.ljust(15), arg.type
key             (u'http://www.w3.org/2001/XMLSchema', u'string')
q               (u'http://www.w3.org/2001/XMLSchema', u'string')
start           (u'http://www.w3.org/2001/XMLSchema', u'int')
maxResults      (u'http://www.w3.org/2001/XMLSchema', u'int')
filter          (u'http://www.w3.org/2001/XMLSchema', u'boolean')
restrict        (u'http://www.w3.org/2001/XMLSchema', u'string')
safeSearch      (u'http://www.w3.org/2001/XMLSchema', u'boolean')
lr              (u'http://www.w3.org/2001/XMLSchema', u'string')
ie              (u'http://www.w3.org/2001/XMLSchema', u'string')
oe              (u'http://www.w3.org/2001/XMLSchema', u'string')
1 Empezar con los servicios web de Google es sencillo: cree un objeto WSDL.Proxy y diríjalo a su copia local del fichero WSDL de Google.
2 De acuerdo con el fichero WSDL, Google ofrece tres funciones: doGoogleSearch, doGetCachedPage, y doSpellingSuggestion. Hacen exactamente lo que dicen: realizar una búsqueda y recoger los resultados programáticamente, obtener acceso a la versión en caché de una página de la última vez que la vio Google, y ofrecer sugerencias de deletro de palabras que se suelen escribir mal.
3 La función doGoogleSearch toma varios parámetros de diferentes tipos. Observe que aunque el fichero WSDL puede dcirnos cómo se llaman y de qué tipo son los argumentos, no puede decirnos lo que significan o cómo usarlos. Teóricamente podría decirnos el rango aceptable de valores de cada parámetro si se permitieran unos valores específicos, pero el fichero WSDL de Google no es tan detallado. WSDL.Proxy no puede hacer magia; sólo nos dará la información que proporcione el fichero WSDL.

Aquí tiene una breve sinopsis de todos los parámetros de la función doGoogleSearch:

Ejemplo 12.13. Búsqueda en Google

>>> from SOAPpy import WSDL
>>> server = WSDL.Proxy('/path/to/your/GoogleSearch.wsdl')
>>> key = 'YOUR_GOOGLE_API_KEY'
>>> results = server.doGoogleSearch(key, 'mark', 0, 10, False, "",
...     False, "", "utf-8", "utf-8")             1
>>> len(results.resultElements)                  2
10
>>> results.resultElements[0].URL                3
'http://diveintomark.org/'
>>> results.resultElements[0].title
'dive into <b>mark</b>'
1 Tras crear el objeto WSDL.Proxy, debemos llamar a server.doGoogleSearch con los diez parámetros. Recuerde usar su propia clave de la Google API que recibió cuando suscribió los servicios web de Google.
2 Se devuelve mucha información, pero miremos primero los resultados de la búsqueda. Están almacenados en results.resultElements, y podemos acceder a ellos como a una lista normal de Python.
3 Cada elemento de resultElements es un objeto que tiene URL, title, snippet y otros atributos útiles. En este momento puede usar técnicas normales de introspección de Python como dir(results.resultElements[0]) para ver los atributos disponibles. O puede hacer introspección mediante el objeto proxy WSDL y ver los outparams de la función. Cada técnica le dará la misma información.

El objeto results contiene más que los resultados de la búsqueda. También incluye información sobre la búsqueda en sí, como el tiempo que llevó y cuántos resultados se encontraron (aunque sólo se devolvieran 10). La interfaz web de Google muestra esta información, y también puede acceder a ella programáticamente.

Ejemplo 12.14. Acceso a información secundaria de Google

>>> results.searchTime                     1
0.224919
>>> results.estimatedTotalResultsCount     2
29800000
>>> results.directoryCategories            3
[<SOAPpy.Types.structType item at 14367400>:
 {'fullViewableName':
  'Top/Arts/Literature/World_Literature/American/19th_Century/Twain,_Mark',
  'specialEncoding': ''}]
>>> results.directoryCategories[0].fullViewableName
'Top/Arts/Literature/World_Literature/American/19th_Century/Twain,_Mark'
1 Esta búsqueda llevó 0.224919 segundos. Eso no incluye el tiempo que tardó el envío y recepción de documentos XML de SOAP. Sólo el tiempo que empleó Google procesando la consulta una vez que la recibió.
2 En total hubieron aproximadamente unos 30 millones de resultados. Puede acceder a ellos a 10 por vez cambiando el parámetro start e invocando server.doGoogleSearch de nuevo.
3 En algunas consultas Google también devuelve una lista de categorías del Google Directory relacionadas. Puede añadir estas URL a http://directory.google.com/ para construir el enlace a la página de categoría del directorio.