12.7. 搜索谷歌

让我们最终转向本章开头看到的示例代码,它做了一些比获取当前温度更有用和令人兴奋的事情。

谷歌提供了一个 SOAP API,用于以编程方式访问谷歌搜索结果。要使用它,您需要注册 Google Web 服务。

步骤 12.4. 注册 Google Web 服务

  1. 访问 http://www.google.com/apis/ 并创建一个谷歌帐户。这只需要一个电子邮件地址。注册后,您将通过电子邮件收到您的 Google API 密钥。每当您调用谷歌的搜索功能时,都需要将此密钥作为参数传递。

  2. 同样在 http://www.google.com/apis/ 上,下载 Google Web APIs 开发者工具包。这包括几种编程语言(但不包括 Python)的一些示例代码,更重要的是,它包括 WSDL 文件。

  3. 解压缩开发者工具包文件并找到 GoogleSearch.wsdl。将此文件复制到本地驱动器上的某个永久位置。您将在本章稍后用到它。

一旦您拥有了开发者密钥并将 Google WSDL 文件放在了已知位置,就可以开始摆弄 Google Web 服务了。

示例 12.12. 自省 Google Web 服务

>>> 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 开始使用 Google Web 服务很容易:只需创建一个 WSDL.Proxy 对象并将其指向您本地副本的 Google WSDL 文件。
2 根据 WSDL 文件,谷歌提供了三个函数:doGoogleSearchdoGetCachedPagedoSpellingSuggestion。它们的功能与其名称完全一致:执行谷歌搜索并以编程方式返回结果,访问上次谷歌看到某个页面的缓存版本,并为常见的拼写错误搜索词提供拼写建议。
3 doGoogleSearch 函数接受许多不同类型的参数。请注意,虽然 WSDL 文件可以告诉您参数的名称和数据类型,但它不能告诉您它们的含义或如何使用它们。理论上,如果只允许使用特定值,它可以告诉您每个参数的可接受值范围,但谷歌的 WSDL 文件没有那么详细。 WSDL.Proxy 不能创造奇迹;它只能为您提供 WSDL 文件中提供的信息。

以下是 doGoogleSearch 函数所有参数的简要说明

示例 12.13. 搜索谷歌

>>> 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 设置 WSDL.Proxy 对象后,您可以使用所有十个参数调用 server.doGoogleSearch。请记住使用您在注册 Google Web 服务时收到的自己的 Google API 密钥。
2 返回的信息很多,但让我们先看看实际的搜索结果。它们存储在 results.resultElements 中,您可以像访问普通的 Python 列表一样访问它们。
3 resultElements 中的每个元素都是一个具有 URLtitlesnippet 和其他有用属性的对象。此时,您可以使用普通的 Python 自省技术,例如 dir(results.resultElements[0]) 来查看可用的属性。或者,您可以通过 WSDL 代理对象进行自省,并查看函数的 outparams。每种技术都将为您提供相同的信息。

results 对象包含的信息不仅仅是实际的搜索结果。它还包含有关搜索本身的信息,例如搜索花费的时间以及找到的结果数量(即使只返回了 10 个)。谷歌网页界面会显示此信息,您也可以通过编程方式访问它。

示例 12.14. 访问谷歌的辅助信息

>>> 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 此搜索花费了 0.224919 秒。这还不包括发送和接收实际 SOAP XML 文档所花费的时间。这只是谷歌在收到您的请求后处理它所花费的时间。
2 总共有大约 3000 万个结果。您可以通过更改 start 参数并再次调用 server.doGoogleSearch 来一次访问 10 个结果。
3 对于某些查询,谷歌还会在 谷歌目录 中返回相关类别的列表。您可以将这些网址附加到 http://directory.google.com/ 以构建指向目录类别页面的链接。