使用自定义搜索以编程方式在 Python 中搜索 google

Programmatically searching google in Python using custom search

我有一段使用 pygoogle python 模块的代码,它允许我以编程方式简洁地在 google 中搜索某个术语:

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

我刚发现这个功能已经停产,取而代之的是 google 自定义搜索。我查看了 SO 上的其他相关问题,但没有找到任何我可以使用的东西。我有两个问题:

1) google 自定义搜索是否允许我完全按照上面三行中的内容进行操作?

2) 如果是 - 我在哪里可以找到示例代码来完成我上面所做的事情?如果不是,那么用 pygoogle?

做我所做的事情的替代方法是什么?

这是可以做到的。设置不是很简单,但最终结果是您可以用几行代码从 python 搜索整个网络。

总共有3个主要步骤。

第一步:获取GoogleAPI密钥

pygoogle 的页面声明:

Unfortunately, Google no longer supports the SOAP API for search, nor do they provide new license keys. In a nutshell, PyGoogle is pretty much dead at this point.

You can use their AJAX API instead. Take a look here for sample code: 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 对于简单的实验使用,我建议 "server key"。

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

的确,旧的API不可用。可用的最佳新 API 是自定义搜索。它似乎只支持在特定域内搜索,但是,在关注 this SO answer 之后,您可以搜索整个网络:

  1. From the Google Custom Search homepage ( http://www.google.com/cse/ ), click Create a Custom Search Engine.
  2. Type a name and description for your search engine.
  3. Under Define your search engine, in the Sites to Search box, enter at least one valid URL (For now, just put www.anyurl.com to get past this screen. More on this later ).
  4. Select the CSE edition you want and accept the Terms of Service, then click Next. Select the layout option you want, and then click Next.
  5. Click any of the links under the Next steps section to navigate to your Control panel.
  6. In the left-hand menu, under Control Panel, click Basics.
  7. In the Search Preferences section, select Search the entire web but emphasize included sites.
  8. Click Save Changes.
  9. In the left-hand menu, under Control Panel, click Sites.
  10. Delete the site you entered during the initial setup process.

Google也推荐这种方法:https://support.google.com/customsearch/answer/2631040

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

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

@mbdevpl 的回复对我帮助很大,所以所有的功劳都归功于他们。 但是 UI 中发生了一些变化,所以这里有一个更新:

一个。安装google-api-python-客户端

  1. 如果您还没有 Google 帐户,sign up
  2. 如果您从未创建过 Google APIs 控制台项目,请阅读 Managing Projects page and create a project in the Google API Console
  3. Install图书馆。

乙。要创建 API 密钥:

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

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

  1. this link 中创建自定义搜索引擎。
  2. 在要搜索的站点中,添加任何有效的 URL(即 www.whosebug.com)。
  3. 填完这些就够了,其他的都无所谓。在左侧菜单中,点击编辑搜索引擎{您的搜索引擎名称}设置
  4. 搜索整个网络设置为开启
  5. 从要搜索的站点列表中删除您添加的URL
  6. 搜索引擎 ID 下,您会找到 搜索引擎 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。错误消息应包含 link 以启用 API。它将类似于: https://console.developers.google.com/apis/api/customsearch.googleapis.com/overview?project={你的项目名称}.

你会被要求创建一个服务名称(不管它是什么),并赋予它角色。 我给它 Role ViewerService Usage Admin 并且它有效。

2020 年的答案

Google 出于某种原因不再提供任何 API,但是 https://github.com/bisoncorps/search-engine-parser 正在开发一个 python 包用于抓取 Google。

安装

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?