web-dev-qa-db-fra.com

Recherche Google à partir d'une application Python

J'essaie d'exécuter une requête de recherche Google à partir d'une application Python. Existe-t-il une interface python permettant de le faire? S'il n'y en a pas, personne ne sait quelle API Google me permettra de le faire. Merci.

51
Res

Il y a un exemple simple ici (il manque particulièrement quelques citations ;-). La plupart de ce que vous verrez sur le Web sont des interfaces Python avec l'ancienne API SOAP abandonnée. L'exemple que je cite utilise l'API AJAX la plus récente et la plus prise en charge. vouloir!-)

Edit: voici un exemple plus complet de Python 2.6 avec toutes les citations nécessaires & 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')
70
Alex Martelli

Voici la réponse d'Alex portée sur 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')
17
John La Rooy

Voici mon approche à ce sujet: http://breakingcode.wordpress.com/2010/06/29/google-search-python/

Quelques exemples de code:

    # 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)

Notez que ce code n'utilise PAS l'API Google et fonctionne toujours à ce jour (janvier 2012).

11
Mario Vilas

Je suis nouveau en python et je cherchais comment faire cela. Aucun des exemples fournis ne fonctionne correctement pour moi. Certaines sont bloquées par Google si vous faites beaucoup (peu) de requêtes, d'autres sont obsolètes. L'analyse de la recherche Google au format HTML (ajout de l'en-tête dans la demande) fonctionnera jusqu'à ce que Google modifie à nouveau la structure html. Vous pouvez utiliser la même logique pour rechercher dans tout autre moteur de recherche, en regardant dans le code HTML (view-source). 

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

Usage:

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

(Éditer 1: Ajouter un paramètre pour limiter la recherche Google à un site spécifique)

(Edit 2: Lorsque j'ai ajouté cette réponse, je codais un script Python pour rechercher des sous-titres. Je l'ai récemment chargé sur Github: Subseek )

6

Comme l'API AJAX est morte, vous pouvez utiliser un service tiers tel que API Serp qui est un wrapper de résultats de moteur de recherche Google.

Il est facile d'intégrer Python:

from lib.google_search_results import GoogleSearchResults

params = {
    "q" : "Coffee",
    "location" : "Austin, Texas, United States",
    "hl" : "en",
    "gl" : "us",
    "google_domain" : "google.com",
    "api_key" : "demo",
}

query = GoogleSearchResults(params)
dictionary_results = query.get_dictionary()

GitHub: https://github.com/serpapi/google-search-results-python

0
Hartator