用Python编写自定义搜索程序来在Google上进行编程搜索

79

我有一段使用pygoogle Python模块的代码片段,可以让我简洁地以编程方式在Google中搜索某些术语:

 g = pygoogle(search_term)
 g.pages = 1
 results = g.get_urls()[0:10]

很不幸,我刚刚发现这个已经停用了,并被称为谷歌定制搜索的东西所取代。我查看了 SO 上的其他相关问题,但没有找到可以使用的内容。我的两个问题是:

1)谷歌定制搜索是否允许我做与我上面三行所做的完全相同的事情?

2)如果是的话-我在哪里可以找到示例代码来执行我上面所做的完全相同的操作?如果不是,则使用 pygoogle 所做的操作有什么替代方法?


看起来自定义搜索返回的缓存结果与最新的谷歌发现不同步? - Alex
3个回答

136

这是可以实现的。具体设置并不简单,但最终的结果是你可以用几行代码从Python搜索整个网络。

总共有三个主要步骤。

第一步:获取Google API密钥

pygoogle 的页面上写道:

不幸的是,Google不再支持SOAP API进行搜索,也不提供新的许可证密钥。 简而言之,PyGoogle在此时基本上已死。

您可以使用他们的AJAX API代替。请参阅这里的示例代码: http://dcortesi.com/2008/05/28/google-ajax-search-api-example-python-code/

...但实际上你也不能使用AJAX API。你必须获得一个Google API密钥。 https://developers.google.com/api-client-library/python/guide/aaa_apikeys 对于简单的实验性使用,建议使用"服务端密钥"。

第二步:设置自定义搜索引擎,以便您可以搜索整个网络

实际上,旧的API不再可用。现在最好的新API是Custom Search。它似乎只支持在特定域内进行搜索,但是,在遵循这个SO答案后,您可以搜索整个网络:

从Google自定义搜索主页(http://www.google.com/cse/)开始,单击“创建自定义搜索引擎”。 为您的搜索引擎输入名称和描述。 在“定义您的搜索引擎”下,在“要搜索的站点”框中输入至少一个有效的URL(现在只需放置www.anyurl.com以跳过此屏幕。稍后详细介绍)。 选择您想要的CSE版本并接受服务条款,然后单击“下一步”。选择所需的布局选项,然后单击“下一步”。 单击“下一步操作”部分下的任何链接以导航到您的控制面板。 在左侧菜单中,在“控制面板”下,单击“基本信息”。 在“搜索首选项”部分中,选择“搜索整个网络但强调包含的站点”。 单击“保存更改”。 在左侧菜单中,在“控制面板”下,单击“站点”。 删除您在初始设置过程中输入的站点。 Google还推荐采用这种方法:https://support.google.com/customsearch/answer/2631040

第三步:安装Python的Google API客户端

pip install google-api-python-client,更多信息请参考此处:

第四步(奖励):进行搜索

所以,在设置好之后,您可以从以下几个地方跟随代码示例:

最终结果如下:

from googleapiclient.discovery import build
import pprint

my_api_key = "Google API key"
my_cse_id = "Custom Search Engine ID"

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(
    'stackoverflow site:en.wikipedia.org', my_api_key, my_cse_id, num=10)
for result in results:
    pprint.pprint(result)

经过一些调整,您可以编写一些函数,其行为与您的代码片段完全相同,但我将在此跳过此步骤。

5
my_cse_id can be found from https://cse.google.com/cse/setup/basic?cx=<my_cse_id> and replace %3A with : - Hugo
@mimo 已被弃用,但是...还能用 :) 很好的发现,我不知道这个。你有关于它何时将被废弃的数据吗?我猜在那之前我得调整我的代码了。 - mbdevpl
@mbdevpl 我只有一封来自谷歌的电子邮件,日期为2017年3月,告诉我API 1.0已于2012年被弃用,不再维护,并且“可能会出现故障和失败,并可能完全停止工作”。 - mimo
@mbdevpl 如何迭代多个搜索查询字符串?假设我们有一个字符串列表,是否可以搜索每个元素并附加所有返回的结果? - AHK
该产品已更名为可编程搜索引擎。https://developers.google.com/custom-search/v1/introduction - William Entriken
显示剩余4条评论

25

@mbdevpl的回复对我帮助很大,所以所有的功劳归于他们。 但是用户界面有一些变化,因此请参考以下更新:

A. 安装google-api-python-client

  1. 如果您没有Google账号,请注册一个。
  2. 如果您从未创建过Google APIs控制台项目,请阅读管理项目页面并在Google API Console中创建一个项目。
  3. 安装该库。

B. 创建API密钥:

  1. 导航到Cloud Console的APIs&Services→Credentials面板。
  2. 选择创建凭据,然后从下拉菜单中选择API密钥
  3. 已创建API密钥对话框将显示您新创建的密钥。
  4. 现在您拥有一个API_KEY

C. 设置自定义搜索引擎,以便可以搜索整个网络

  1. 此链接中创建自定义搜索引擎。
  2. 在要搜索的网站中添加任何有效的URL(即www.stackoverflow.com)。
  3. 那就是你需要填写的全部内容,其余部分都不重要。在左侧菜单中,单击编辑搜索引擎{your search engine name}设置
  4. 搜索整个网络设置为ON
  5. 要搜索的网站列表中删除您添加的URL。
  6. Search engine ID下,您将找到search-engine-ID

搜索示例

from googleapiclient.discovery import build

my_api_key = "AIbaSyAEY6egFSPeadgK7oS/54iQ_ejl24s4Ggc" #The API_KEY you acquired
my_cse_id = "012345678910111213141:abcdef10g2h" #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('"god is a woman" "thank you next" "7 rings"', my_api_key, my_cse_id, num=10)
for result in results:
    print(result)

重要提示!在第一次运行时,您可能需要在您的账户中启用API。错误信息应该包含启用API的链接。它将类似于: https://console.developers.google.com/apis/api/customsearch.googleapis.com/overview?project={您的项目名称}。

您将被要求创建一个服务名称(无论它是什么),并为其分配角色。 我给它分配了Role ViewerService Usage Admin,它就可以工作了。


这应该是新的被接受的答案。谢谢。 - Austin not from Boston
这里链接的 Python 库说明:“此库由 Google 正式支持。然而,该存储库的维护者建议在新代码开发时尽可能使用 Cloud 客户端库来获取支持。有关更多信息,请访问客户端库解释页面。” - Graham Hesketh
有人遇到数字大于10的问题吗?我甚至无法使用num=11。出现了错误:“googleapiclient.errors.HttpError:<HttpError 400 when requesting .... returned "Request contains an invalid argument."。详情:“[{'message': 'Request contains an invalid argument.', 'domain': 'global', 'reason': 'badRequest'}]”。 - hln
尝试激活浏览器时,它使用错误的账户登录并告诉我没有权限访问,无法更改账户。有没有其他方法可以激活引擎,而不使用链接? - Soerendip
嗨,我按照你的回答操作了一下,一切都正常,只是出现了一个“HTTP错误”,我通过访问https://developers.google.com/custom-search/v1/introduction并点击“创建API按钮”,选择与你在上面回答中相同的“项目”,问题已经解决了,现在一切都正常了。希望这对你有帮助,截至2023年9月4日。 - undefined

10

2020年的答案

由于某些原因,谷歌不再提供任何API,但是https://github.com/bisoncorps/search-engine-parser正在开发一个用于爬取谷歌的Python包。

安装

pip install search-engine-parser

使用方法

from search_engine_parser import GoogleSearch

def google(query):
    search_args = (query, 1)
    gsearch = GoogleSearch()
    gresults = gsearch.search(*search_args)
    return gresults['links']

google('Is it illegal to scrape google results')

我不知道这样是否合法,但只要您不将产品商业化,我认为您可以逃过法律的制裁。此外,Google并没有因为使用其产品而起诉任何人,他们只是禁止了IP地址。
更多信息请参见Is it ok to scrape data from Google results?


1
“谷歌不再提供API,原因不明”-- 有相关新闻链接吗?因为你是错的。 - Rutrus
@Rutrus,你能告诉我如何访问那个搜索API吗? - Marius Johan
搜索可用的API:https://developers.google.com/custom-search/docs/overview#available_apis - Rutrus

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