使用自定义搜索以Python编程方式在Google中搜索谷歌

时间:2016-05-07 00:04:53

标签: python google-custom-search

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

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

我刚刚发现这已经停止了,并被谷歌自定义搜索所取代。我查看了SO上的其他相关问题,但没有发现任何我可以使用的问题。我有两个问题:

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

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

3 个答案:

答案 0 :(得分:79)

可以这样做。设置......不是很简单,但最终结果是你可以用几行代码从python中搜索整个web。

总共有3个主要步骤。

第一步:获取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是自定义搜索。它似乎只支持在特定域内搜索,但是,在关注this SO answer后,您可以搜索整个网络:

  
      
  1. 在Google自定义搜索主页(http://www.google.com/cse/)中,点击创建自定义搜索引擎。
  2.   
  3. 键入搜索引擎的名称和说明。
  4.   
  5. 在“定义您的搜索引擎”下的“要搜索的站点”框中,输入至少一个有效的URL(现在,只需输入www.anyurl.com即可获取   过了这个画面。稍后会详细介绍。)
  6.   
  7. 选择所需的CSE版本并接受服务条款,然后单击“下一步”。选择所需的布局选项,然后单击“确定”   下一步。
  8.   
  9. 点击“后续步骤”部分下的任意链接,以导航至“控制台”。
  10.   
  11. 在左侧菜单中的“控制面板”下,单击“基本”。
  12.   
  13. 在“搜索首选项”部分,选择“搜索整个网络,但强调包含的网站。”
  14.   
  15. 点击保存更改。
  16.   
  17. 在左侧菜单中的“控制面板”下,单击“站点”。
  18.   
  19. 删除您在初始设置过程中输入的网站。
  20.   

Google也建议采用此方法:https://support.google.com/customsearch/answer/2631040

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

pip install google-api-python-client,更多信息:

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

因此,在设置之后,您可以从几个地方跟踪代码示例:

并以此结束:

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)

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

答案 1 :(得分:6)

2020年的答案

Google由于某种原因不再提供任何API,但是https://github.com/bisoncorps/search-engine-parser正在开发用于抓取Google的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?

答案 2 :(得分:3)

@mbdevpl的回复对我有很大帮助,因此所有荣誉归功于他们。 但是UI进行了一些更改,因此有一个更新:

A。安装google-api-python-client

  1. 如果您还没有Google帐户,请sign up
  2. 如果您从未创建过Google API控制台项目,请阅读Managing Projects page并在Google API Console中创建一个项目。
  3. Install库。

B。要创建API密钥:

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

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

  1. this link中创建一个自定义搜索引擎。
  2. 在要搜索的网站中,添加任何有效的URL(即www.stackoverflow.com)。
  3. 这就是您所要做的,其余的都无所谓。在左侧菜单中,点击编辑搜索引擎 {您的搜索引擎名称} 设置
  4. 搜索整个网络设置为 ON
  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。错误消息应包含用于启用API的链接。它将类似于: https://console.developers.google.com/apis/api/customsearch.googleapis.com/overview?project= {您的项目名称}。

系统会要求您创建一个服务名称(无关紧要),并为其指定角色。 我给了它 Role Viewer Service Usage Admin ,它可以正常工作。