【问题标题】:get more than 10 results Google custom search API获得超过 10 个结果 Google 自定义搜索 API
【发布时间】:2019-04-26 11:01:14
【问题描述】:

我正在尝试使用 Google 自定义搜索 API,我想要搜索前 20 个结果,我尝试将 URL 中的 num=10 更改为 20,但出现 400 错误,我该如何修复或请求第二页结果?(注意我正在使用搜索整个网络)

这是我正在使用的代码

import requests,json
url="https://www.googleapis.com/customsearch/v1?q=SmartyKat+Catnip+Cat+Toys&cx=012572433248785697579%3A1mazi7ctlvm&num=10&fields=items(link%2Cpagemap%2Ctitle)&key={YOUR_API_KEY}"
res=requests.get(url)
di=json.loads(res.text)

【问题讨论】:

标签: python google-custom-search


【解决方案1】:

很遗憾,从 Google 自定义搜索 API 接收的结果不能超过 10 个。但是,如果您确实想要更多结果,您可以通过将 start 参数增加 10 来进行多次调用。

查看此链接:https://developers.google.com/custom-search/v1/using_rest#query-params

【讨论】:

  • 所以发出两个请求,第一个是我正在使用的,第二个从 10 开始,到 20 结束?
  • 完全正确 - 您可以更改第二次通话的“开始”参数,以便收到搜索结果 11-20。
【解决方案2】:

接受的答案https://*.com/a/55866268/42346中的信息是准确的。

下面是我在此答案https://*.com/a/37084643/42346 的第 4 步中编写的作为函数扩展的 Python 函数,用于从 Google 搜索 API 返回多达 100 个结果。它为每个 API 调用增加 10 的 start 参数,处理自动返回的结果数量。例如,如果您请求 25 个结果,该函数将引发 3 个 API 调用:10 个结果、10 个结果和 5 个结果。

背景资料:
有关如何设置 Google 自定义搜索引擎的说明:https://*.com/a/37084643/42346
有关如何指定它在此处搜索整个网络的更多详细信息: https://*.com/a/11206266/42346

from googleapiclient.discovery import build
from pprint import pprint as pp
import math

def google_search(search_term, api_key, cse_id, **kwargs):
    service = build("customsearch", "v1", developerKey=api_key)
    
    num_search_results = kwargs['num']
    if num_search_results > 100:
        raise NotImplementedError('Google Custom Search API supports max of 100 results')
    elif num_search_results > 10:
        kwargs['num'] = 10 # this cannot be > 10 in API call 
        calls_to_make = math.ceil(num_search_results / 10)
    else:
        calls_to_make = 1
        
    kwargs['start'] = start_item = 1
    items_to_return = []
    while calls_to_make > 0:
        res = service.cse().list(q=search_term, cx=cse_id, **kwargs).execute()
        items_to_return.extend(res['items'])
        calls_to_make -= 1
        start_item += 10
        kwargs['start'] = start_item
        leftover = num_search_results - start_item + 1
        if 0 < leftover < 10:
            kwargs['num'] = leftover
        
    return items_to_return 

下面是一个你如何称呼它的例子:

NUM_RESULTS = 25
MY_SEARCH = 'why do cats chase their own tails'
MY_API_KEY = 'Google API key'
MY_CSE_ID = 'Custom Search Engine ID'

results = google_search(MY_SEARCH, MY_API_KEY, MY_CSE_ID, num=NUM_RESULTS)
    
for result in results:
    pp(result)

【讨论】: