在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
。
在Basic
,可以找到一些基本数据,如搜索引擎ID,它将被用来发送搜索请求。复制搜索引擎的ID,并将其储存起来。
向下滚动到Search Features
,并打开Search the entire web
选项。
在Sites to search
部分,勾选添加的URL的复选框并删除它。这将使搜索引擎向整个网络开放。
一旦创建了自定义搜索引擎,就是在Python中使用Google Search API的时候了。
首先,我们需要为创建的搜索引擎获得一个API。
获得一个Google API密钥
谷歌的应用编程接口(API)是谷歌云的一个功能,可以将谷歌服务嵌入到第三方应用程序中。需要创建一个谷歌项目来获取一个自定义的搜索API密钥,然后将其作为Python中的谷歌搜索API。
有两种方法来获取自定义搜索引擎的API密钥:
- 在谷歌云中创建一个项目,获得谷歌自定义搜索API。
- 获取一个JSON API密钥。
这两个步骤都需要一个谷歌云项目。
在谷歌云中创建一个项目并获取谷歌自定义搜索API
前往谷歌云的证书页面。然后,点击New Project
。
命名它,并让组织框保持原样。然后,点击Create
。
创建项目后,我们需要在这个项目上附加一个自定义搜索API。在左侧面板中,选择Credentials
,然后点击顶部的Create Credentials
按钮。
在Create Credentials
,选择API key
。
选择API key
选项将为该项目创建一个API密钥。点击Show key
,复制API密钥。
从这个方法获取的API密钥是不活跃的。当运行带有这个API密钥的Python脚本时,可以手动激活它。
当脚本第一次运行时,Python会抛出激活的提示。激活API密钥后,可以使用自定义搜索引擎。
获取一个JSON API密钥
这个方法相对来说更简单,因为它不需要激活密钥。如果已经存在一个谷歌云项目,可以直接从这个方法中获取API密钥。
转到可编程搜索引擎网站的指南页。
点击Get a key
按钮,打开一个弹出窗口,要求选择项目。
点击项目,选择Next
,为项目创建一个API。
点击Show key
,获得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_key
和my_cse_id
,分别存储API密钥和自定义搜索引擎ID。
创建了一个有四个参数的方法google_search
:search_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)
输出:
例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_KEY
和SEARCH_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中的Google搜索API将搜索查询发送到一个自定义的搜索引擎。读者将能够创建一个自定义的搜索引擎,获取API密钥,并能够轻松地创建发送搜索请求的Python脚本。