【问题标题】:Google Search from a Python App来自 Python 应用的 Google 搜索
【发布时间】:2010-12-12 01:40:15
【问题描述】:

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

【问题讨论】:

    标签: python api google-search-api


    【解决方案1】:

    我是 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

    【讨论】:

    • 我很感兴趣,为什么没有一个例子对你有用,尤其是关于 BeautifulSoup 不起作用的那一点,因为 HTML 是由 JavaScript 生成的......我刚刚试过我的,它正在工作: breakingcode.wordpress.com/2010/06/29/google-search-python
    • 就我而言,我无法使用 BeautifulSoup。我对其进行了测试,似乎谷歌正在使用 javascript 块生成 html 响应,所以我没有找到一种方法来获取与 BS 类的链接。我只使用“查找”功能在响应中找到了链接。
    • 也许指向 Google 的 URL 指向使用 JavaScript 的较新 API,而不是使用纯 HTML 的旧 API。我相信在您的查询中添加“&btnG=Google+Search”会导致它使用 HTML API,或者至少这是我看到的唯一区别。
    • @MarioVilas 感谢您的提示。我将使用参数进行尝试。也许那样会更快?
    【解决方案2】:

    这是我的处理方法:http://breakingcode.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 月)。

    【讨论】:

    • 你好马里奥,我已经尝试使用你的脚本和它的精彩。我只面临一个问题 - 即使我使用 .COM 作为 TLD,我也得到了来自 .CO.IN 的结果。你能帮忙吗?
    • 请注意,这可能随时中断,因为它不使用官方 API,而是抓取 Google 结果页面,例如如果 Google 更改了返回结果的方式。
    【解决方案3】:

    这是 Alex 移植到 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')
    

    【讨论】:

    • 与 Alex 的答案相比,使用 Python 3 有什么优势?
    • @Phill,不确定您所说的“优势”是什么意思。如果您的项目使用 Python2,则使用 Alex 的答案。如果项目使用 Python3,您可以使用此答案。不幸的是,编写此函数以在两个版本的 Python 中使用相同的代码是不切实际的
    • 我想我的问题是为什么使用 Python3 而不是 Python2?有什么好处? Python 新手,来自 PHP 背景。事情更正式了吗?
    • @Phill,Python3 的设计比 Python2 更简洁、更一致,但并不完全向后兼容。通常,移植代码所需的更改非常小,正如您在此处看到的,但是许多 3rd 方库和框架仍然不支持 Python3,所以很多人仍在使用 Python2
    • 有没有办法获得超过 4 次点击?
    【解决方案4】:

    有一个简单的例子here(特别缺少一些引号;-)。您将在网络上看到的大部分内容是旧的、已停产的 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')
    

    【讨论】:

    • 在我的本地 Linux 机器上试过这个,然后谷歌认为我是一个机器人,从我的浏览器进行的任何搜索都是验证码!我不应该在工作中尝试这个,只是提醒使用它的人。添加用户代理和推荐人,使其看起来更像是一个真正的请求!
    • 不幸的是,它所依赖的 Google Web Search API 已于 2010 年 11 月弃用。自定义搜索 API 应该会取代它,但需要您配置要搜索的 URL 列表 - 而不是整个网络.
    • 截至今天(2014.06.10),这在我的 IPython/Python2.7.6 上工作......
    • 截至 2016 年 3 月,这不起作用。 Google 回复如下:{"responseData": null, "responseDetails": "Google Web Search API 不再可用。请迁移到 Google Custom Search API (developers.google.com/custom-search)", "responseStatus": 403}
    • 如上所述,这是一个已弃用的 API,不再有效。此外,谷歌对所有内容都使用 https,因此仅 http:// url 就弃用了它。与下面 John La Rooy 的回答相同。
    猜你喜欢
    • 1970-01-01
    • 2017-06-19
    • 2020-04-06
    • 2014-12-30
    • 1970-01-01
    • 2018-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多