在Python中使用谷歌API的自定义搜索引擎

这篇文章解释了在Python中使用谷歌搜索API创建一个自定义搜索引擎(CSE)。CSE是一个为开发者设计的搜索引擎,使他们能够将其纳入任何应用程序,包括网站、移动应用程序和其他东西。

对于网络搜刮,许多应用程序使用谷歌自定义搜索引擎。本文将解释如何在Python中设置CSE并使用其Google Search API。

非常不鼓励手动搜刮谷歌搜索,因为每隔几次请求,搜索就会受到限制。

使用谷歌CSE平台创建一个搜索引擎

在Python中使用谷歌搜索API来获得搜索结果是一个三层过程。与直接从Google搜索中返回结果的Web scrapping不同,这种方法创建了一个自定义搜索引擎,并使用它来获取结果。

这有助于获取与搜刮相同的结果,而没有任何发送请求的阈值。

要创建一个搜索引擎,请查阅programmable search engine 页面或点击这个链接。给搜索引擎起一个名字,并在What to search? 内添加一个样本URL。

记住,这个样本URL可以在以后更改,而这正是我们要做的。

确认reCAPTCHA,然后点击Create ,创建一个自定义搜索引擎。这个搜索引擎需要进行调整以访问整个网络。

在下一页上点击Customize

在Python中使用谷歌API的自定义搜索引擎

Basic ,可以找到一些基本数据,如搜索引擎ID,它将被用来发送搜索请求。复制搜索引擎的ID,并将其储存起来。

向下滚动到Search Features ,并打开Search the entire web 选项。

Sites to search 部分,勾选添加的URL的复选框并删除它。这将使搜索引擎向整个网络开放。

在Python中使用谷歌API的自定义搜索引擎

一旦创建了自定义搜索引擎,就是在Python中使用Google Search API的时候了。

首先,我们需要为创建的搜索引擎获得一个API。

获得一个Google API密钥

谷歌的应用编程接口(API)是谷歌云的一个功能,可以将谷歌服务嵌入到第三方应用程序中。需要创建一个谷歌项目来获取一个自定义的搜索API密钥,然后将其作为Python中的谷歌搜索API。

有两种方法来获取自定义搜索引擎的API密钥:

  1. 在谷歌云中创建一个项目,获得谷歌自定义搜索API。
  2. 获取一个JSON API密钥。

这两个步骤都需要一个谷歌云项目。

在谷歌云中创建一个项目并获取谷歌自定义搜索API

前往谷歌云的证书页面。然后,点击New Project

在Python中使用谷歌API的自定义搜索引擎

命名它,并让组织框保持原样。然后,点击Create

在Python中使用谷歌API的自定义搜索引擎

创建项目后,我们需要在这个项目上附加一个自定义搜索API。在左侧面板中,选择Credentials ,然后点击顶部的Create Credentials 按钮。

Create Credentials ,选择API key

在Python中使用谷歌API的自定义搜索引擎

选择API key 选项将为该项目创建一个API密钥。点击Show key ,复制API密钥。

在Python中使用谷歌API的自定义搜索引擎

从这个方法获取的API密钥是不活跃的。当运行带有这个API密钥的Python脚本时,可以手动激活它。

当脚本第一次运行时,Python会抛出激活的提示。激活API密钥后,可以使用自定义搜索引擎。

获取一个JSON API密钥

这个方法相对来说更简单,因为它不需要激活密钥。如果已经存在一个谷歌云项目,可以直接从这个方法中获取API密钥。

转到可编程搜索引擎网站的指南页。

点击Get a key 按钮,打开一个弹出窗口,要求选择项目。

在Python中使用谷歌API的自定义搜索引擎

点击项目,选择Next ,为项目创建一个API。

在Python中使用谷歌API的自定义搜索引擎

点击Show key ,获得API密钥。

在Python中使用谷歌API的自定义搜索引擎

这个JSON API密钥可以直接使用,而通过谷歌云的Credentials 标签手动获取的API密钥则需要激活。

在Python中实现自定义搜索API

在CSE ID和API密钥准备好后,Python中的谷歌搜索API可以在脚本中使用。下面有两个程序,将解释这个过程。

例1:

为了使Python中的Google搜索API发挥作用,我们需要一个Python库来解析API密钥。我们可以使用Google API Python客户端。

要安装它,进入CMD或任何运行Python的IDE,安装Google API Python客户端。

在CMD里面,写下这个命令:

pip install google-api-python-client

这将把Python包安装到系统中。

需要创建一个Python脚本,它将向自定义搜索引擎发送搜索查询并返回结果。

代码-custom_search_engine.py

from googleapiclient.discovery import build
my_api_key = "The API_KEY you acquired"
my_cse_id = "The search-engine-ID you created"
def google_search(search_term, api_key, cse_id, **kwargs):
    service = build("customsearch", "v1", developerKey=api_key)
    res = service.cse().list(q=search_term, cx=cse_id, **kwargs).execute()
    return res['items']
results = google_search('"How to code in Python"', my_api_key, my_cse_id, num=10)
for result in results:
    print(result)

让我们分解一下代码,了解它的作用。第一行代码从Python库包google api python client 中导入build 模块。

创建了两个对象变量,my_api_keymy_cse_id ,分别存储API密钥和自定义搜索引擎ID。

创建了一个有四个参数的方法google_searchsearch_term,存储搜索查询,api_key 用于传递API密钥,cse_id 用于传递自定义搜索引擎的ID,最后是关键字参数**kwargs

下面的代码创建了一个变量service ,使用build 函数来创建一个customsearch API服务,该服务将被装配到自定义搜索引擎上。

service = build("customsearch", "v1", developerKey=api_key)

下一行使用service.cse() 模块来创建一个客户端,该客户端将向自定义搜索引擎发送搜索查询,并将其存储在变量rex

list(q=search_term, cx=cse_id, **kwargs) 创建一个从搜索词中获取的结果列表,其中**kwargs 用来对从客户端返回的搜索词的数量进行限制。

res = service.cse().list(q=search_term, cx=cse_id, **kwargs).execute()

最后,变量rex ,以数组的形式返回搜索结果列表。

最后,创建一个变量result ,用于存储搜索结果。google_search 方法被调用,搜索查询作为第一个参数。然后,其API密钥、CSE ID和搜索迭代次数为以下参数。

返回的列表被存储在变量result 内。在for 循环内,它被打印出来,直至其长度。

results = google_search('"How to code in Python"', my_api_key, my_cse_id, num=10)
for result in results:
    print(result)

输出:

在Python中使用谷歌API的自定义搜索引擎

例2:

在这个例子中,我们将制作一个Python脚本,在不使用任何外部依赖的情况下发送搜索请求。这个程序将使用API密钥和CSE ID,并创建一个客户端,在Python中使用内置的Python库和谷歌搜索API。

代码:

import requests
API_KEY = "Your API Key"
SEARCH_ENGINE_ID = "Your CSE ID"
# the search query you want
query = "Starboy"
# using the first page
page = 1
# construct the URL
# doc: https://developers.google.com/custom-search/v1/using_rest
# calculating start, (page=2) => (start=11), (page=3) => (start=21)
start = (page - 1) * 10 + 1
url = f"https://www.googleapis.com/customsearch/v1?key={API_KEY}&cx={SEARCH_ENGINE_ID}&q={query}&start={start}"
# make the API request
data = requests.get(url).json()
# get the result
search_items = data.get("items")
# iterate over 10 results
for i, search_item in enumerate(search_items, start=1):
    try:
        long_description = search_item["pagemap"]["metatags"][0]["og:description"]
    except KeyError:
        long_description = "N/A"
    # get the title of the page
    title = search_item.get("title")
    # get the page snippet
    snippet = search_item.get("snippet")
    # alternatively, you also can get the HTML snippet (bolded keywords)
    html_snippet = search_item.get("htmlSnippet")
    # extract page url
    link = search_item.get("link")
    # print results
    print("="*10, f"Result #{i+start-1}", "="*10)
    print("Title:", title)
    print("Description:", snippet)
    print("Long description:", long_description)
    print("URL:", link, "n")

让我们了解一下上述代码的作用。

第一行导入Python HTTP库requests 。两个变量被初始化,API_KEYSEARCH_ENGINE_ID ,它们存储了先前创建的凭证。

import requests
API_KEY = "Your API Key"
SEARCH_ENGINE_ID = "Your CSE ID"

变量query ,用于存储应用程序要寻找的搜索词。变量page 显示某一特定页面的搜索结果,而变量start 表示该页面的结果序列。

例如,每个页面都有10个搜索结果。page = 1如果变量start ,它将显示前10个搜索结果,也就是第一页的搜索结果,而page = 2 将显示第10个结果之后的搜索结果,也就是从第11个结果开始的。

变量url 存储用于从自定义搜索引擎获得搜索结果的服务URL。它存储了API密钥、搜索查询和要显示的搜索结果的页数等凭证。

query = "Starboy"
page = 1
start = (page - 1) * 10 + 1
url = f"https://www.googleapis.com/customsearch/v1?key={API_KEY}&cx={SEARCH_ENGINE_ID}&q={query}&start={start}"

这个程序使用requests 函数向存储的URL发送API请求,并将从API调用返回的数据保存到变量data

变量search_items ,用来获取搜索项目。它被放在一个for 循环中,从第一个元素开始,一直到其长度。

被搜索的第一个元素是结果描述,它被放在一个异常处理块内。

如果程序找到了任何描述,它将被存储在变量long_description 。如果什么都没有返回,它就存储在N/A

data = requests.get(url).json()
search_items = data.get("items")
for i, search_item in enumerate(search_items, start=1):
    try:
        long_description = search_item["pagemap"]["metatags"][0]["og:description"]
    except KeyError:
        long_description = "N/A"

在下面的代码中,每个搜索结果的属性都存储在其名称的变量中。这个过程对每一个搜索结果都要重复10次。

title = search_item.get("title")
snippet = search_item.get("snippet")
html_snippet = search_item.get("htmlSnippet")
link = search_item.get("link")

最后,所有的结果都被打印出来–第一行打印出结果的编号,然后是标题、描述等属性。

print("="*10, f"Result #{i+start-1}", "="*10)
print("Title:", title)
print("Description:", snippet)
print("Long description:", long_description)
print("URL:", link, "n")

这些结果是在Python中使用谷歌搜索API打印的,不需要外部依赖。

输出:

在Python中使用谷歌API的自定义搜索引擎

结论

这篇文章解释了创建一个客户端,使用Python中的Google搜索API将搜索查询发送到一个自定义的搜索引擎。读者将能够创建一个自定义的搜索引擎,获取API密钥,并能够轻松地创建发送搜索请求的Python脚本。