50

我正在尝试从 python 应用程序运行谷歌搜索查询。是否有任何 python 接口可以让我这样做?如果没有人知道哪个 Google API 将使我能够做到这一点。谢谢。

4

4 回答 4

72

这里有一个简单的例子(特别缺少一些引号;-)。您将在 Web 上看到的大部分内容是旧的、已停产的 SOAP API 的 Python 接口——我所指的示例使用了更新且受支持的 AJAX API,这绝对是您想要的!-)

编辑:这是一个更完整的 Python 2.6 示例,其中包含所有需要的引号 &c;-)...:

#!/usr/bin/python
import json
import urllib

def showsome(searchfor):
  query = urllib.urlencode({'q': searchfor})
  url = 'http://ajax.googleapis.com/ajax/services/search/web?v=1.0&%s' % query
  search_response = urllib.urlopen(url)
  search_results = search_response.read()
  results = json.loads(search_results)
  data = results['responseData']
  print 'Total results: %s' % data['cursor']['estimatedResultCount']
  hits = data['results']
  print 'Top %d hits:' % len(hits)
  for h in hits: print ' ', h['url']
  print 'For more results, see %s' % data['cursor']['moreResultsUrl']

showsome('ermanno olmi')
于 2009-11-01T16:30:16.670 回答
17

这是亚历克斯的答案移植到 Python3

#!/usr/bin/python3
import json
import urllib.request, urllib.parse

def showsome(searchfor):
  query = urllib.parse.urlencode({'q': searchfor})
  url = 'http://ajax.googleapis.com/ajax/services/search/web?v=1.0&%s' % query
  search_response = urllib.request.urlopen(url)
  search_results = search_response.read().decode("utf8")
  results = json.loads(search_results)
  data = results['responseData']
  print('Total results: %s' % data['cursor']['estimatedResultCount'])
  hits = data['results']
  print('Top %d hits:' % len(hits))
  for h in hits: print(' ', h['url'])
  print('For more results, see %s' % data['cursor']['moreResultsUrl'])

showsome('ermanno olmi')
于 2009-11-01T19:09:14.913 回答
11

这是我的方法: http: //breakcode.wordpress.com/2010/06/29/google-search-python/

几个代码示例:

    # Get the first 20 hits for: "Breaking Code" WordPress blog
    from google import search
    for url in search('"Breaking Code" WordPress blog', stop=20):
        print(url)

    # Get the first 20 hits for "Mariposa botnet" in Google Spain
    from google import search
    for url in search('Mariposa botnet', tld='es', lang='es', stop=20):
        print(url)

请注意,此代码不使用 Google API,并且至今仍在工作(2012 年 1 月)。

于 2012-01-10T10:57:45.337 回答
6

我是 python 新手,我正在研究如何做到这一点。提供的示例都不适用于我。如果您提出许多(很少)请求,有些会被谷歌阻止,有些已过时。解析 google 搜索 html(在请求中添加标头)将起作用,直到 google 再次更改 html 结构。您可以使用相同的逻辑在任何其他搜索引擎中搜索,查看 html(查看源代码)。

import urllib2

def getgoogleurl(search,siteurl=False):
    if siteurl==False:
        return 'http://www.google.com/search?q='+urllib2.quote(search)
    else:
        return 'http://www.google.com/search?q=site:'+urllib2.quote(siteurl)+'%20'+urllib2.quote(search)

def getgooglelinks(search,siteurl=False):
   #google returns 403 without user agent
   headers = {'User-agent':'Mozilla/11.0'}
   req = urllib2.Request(getgoogleurl(search,siteurl),None,headers)
   site = urllib2.urlopen(req)
   data = site.read()
   site.close()

   #no beatifulsoup because google html is generated with javascript
   start = data.find('<div id="res">')
   end = data.find('<div id="foot">')
   if data[start:end]=='':
      #error, no links to find
      return False
   else:
      links =[]
      data = data[start:end]
      start = 0
      end = 0        
      while start>-1 and end>-1:
          #get only results of the provided site
          if siteurl==False:
            start = data.find('<a href="/url?q=')
          else:
            start = data.find('<a href="/url?q='+str(siteurl))
          data = data[start+len('<a href="/url?q='):]
          end = data.find('&amp;sa=U&amp;ei=')
          if start>-1 and end>-1: 
              link =  urllib2.unquote(data[0:end])
              data = data[end:len(data)]
              if link.find('http')==0:
                  links.append(link)
      return links

用法:

links = getgooglelinks('python','http://www.stackoverflow.com/')
for link in links:
       print link

(编辑 1:添加参数以将 google 搜索范围缩小到特定站点)

(编辑 2:当我添加这个答案时,我正在编写一个 Python 脚本来搜索字幕。我最近将它上传到 Github:Subseek

于 2013-02-07T05:23:07.040 回答