如何使用Google自定义搜索API进行高级搜索查询?

15
我该如何使用Google Python客户端库编程地进行高级搜索,并使用Google自定义搜索API搜索引擎,以便根据某些高级搜索的术语和参数返回一个前n个链接列表?
我尝试查看文档(但没有找到任何示例),以及这个答案。然而,后者没有起作用,因为目前不支持AJAX API。到目前为止,我尝试了以下方法:
from googleapiclient.discovery import build
import pprint

my_cse_id = "test"

def google_search(search_term, api_key, cse_id, **kwargs):
    service = build("customsearch", "v1",developerKey="<My developer key>")
    res = service.cse().list(q=search_term, cx=cse_id, **kwargs).execute()
    return res['items']

results = google_search('dogs', my_api_key, my_cse_id, num=10)

for result in results:
    pprint.pprint(result)

还有这个:

import pprint

from googleapiclient.discovery import build


def main():
  service = build("customsearch", "v1",developerKey="<My developer key>")

  res = service.cse().list(q='dogs').execute()
  pprint.pprint(res)

if __name__ == '__main__':
  main()

因此,有没有关于如何使用谷歌搜索引擎API进行高级搜索的想法?这是我在谷歌控制台中的凭据:credentials

你得到了什么错误? - Eugene Lisitsky
@EugeneLisitsky,我没有收到任何错误信息。问题是我不知道如何使用Google的API进行高级搜索。例如,我该如何通过编程方式查询包含“英国”地区的所有包含“最佳狗粮”的urls,并且这些URL的语言为英语。 - J.Do
这里是文档,它是完整的:https://developers.google.com/custom-search/v1/reference/rest/v1/cse/list - undefined
3个回答

9

首先,您需要按照此处的说明定义一个自定义搜索,然后确保您的my_cse_id与Google API 自定义搜索(cs)id相匹配,例如:

cx='017576662512468239146:omuauf_lfve'

这是一个仅搜索以 .com 结尾域名的搜索引擎。

接下来,我们需要我们的 developerKey

from googleapiclient.discovery import build
service = build("customsearch", "v1", developerKey=dev_key)

现在我们可以执行搜索。
res = service.cse().list(q=search_term, cx=my_cse_id).execute()

我们可以使用此处描述的参数,例如语言或国家,添加额外的搜索参数,如此处所述。
res = service.cse().list(q="the best dog food", cx=my_cse_id, cr="countryUK", lr="lang_en").execute()

我要在英文中搜索“最好的狗粮”,并且网站需要来自英国。


下面的修改后的代码对我有效。由于从未使用,因此删除了api_key

from googleapiclient.discovery import build

my_cse_id = "012156694711735292392:rl7x1k3j0vy"
dev_key = "<Your developer key>"

def google_search(search_term, cse_id, **kwargs):
    service = build("customsearch", "v1", developerKey=dev_key)
    res = service.cse().list(q=search_term, cx=cse_id, **kwargs).execute()
    return res['items']

results = google_search('boxer dogs', my_cse_id, num=10, cr="countryCA", lr="lang_en")
for result in results:
    print(result.get('link'))

输出

http://www.aboxerworld.com/whiteboxerfaqs.htm
http://boxerrescueontario.com/?section=available_dogs
http://www.aboxerworld.com/abouttheboxerbreed.htm
http://m.huffpost.com/ca/entry/10992754
http://rawboxers.com/aboutraw.shtml
http://www.tanoakboxers.com/
http://www.mondlichtboxers.com/
http://www.tanoakboxers.com/puppies/
http://www.landosboxers.com/dogs/puppies/puppies.htm
http://www.boxerrescuequebec.com/

感谢您的帮助!不过,我的问题是关于如何制作一个高级搜索(即使用特定短语、单词、地区、域名、语言等进行Google查询)。我的主要目标是通过编程实现高级搜索。 - J.Do
另外,我不明白的是为什么你的代码示例只返回CS讲座链接而不是狗的链接。你能否向我们展示如何进行高级搜索,以获取西雅图所有拳击犬的URL链接(英语语言)? - J.Do
1
感谢澄清!请查看更新后的答案,加拿大的拳击犬说英语。 - Maximilian Peters
谢谢,这正是我想要做的。现在从上面的样例中出现了几个问题。为什么当我设置num=90时会得到:HttpError: <HttpError 400 when requesting https://www.googleapis.com/customsearch - J.Do
2
从文档中得知:有效值为1到10之间的整数(包括1和10)。所有参数均在此处提供:https://developers.google.com/custom-search/json-api/v1/reference/cse/list - Maximilian Peters
显示剩余5条评论

2
如果您不想使用Google Discovery API,可以使用Python requests库作为替代方案:
import requests, pprint
q='italy'
api_key='AIzaSyCs.....................'

q = requests.get('https://content.googleapis.com/customsearch/v1', 
    params={ 'cx': '013027958806940070381:dazyknr8pvm', 'q': q, 'key': api_key} )
pprint.pprint(q.json())

谢谢,它可以工作,但是当我们传递一个包含多个单词的查询时,比如“瓦伦西亚聚会”,为什么没有检索到任何内容呢? - Minions

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接