50 votes

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? S'il n'y en a pas, personne ne sait quelle API Google me permettra de le faire. Merci

72voto

Alex Martelli Points 330805

Il y a un exemple simple ici (typiquement manque des guillemets;-). La plupart de ce que vous verrez sur le web Python interfaces à l'ancienne, abandonnée API SOAP -- l'exemple que je suis en pointant utilise la plus récente et pris en charge API AJAX, c'est certainement celui que vous voulez!-)

Edit: voici une information plus complète sur la version 2.6 de Python exemple les citations &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')

17voto

gnibbler Points 103484

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

11voto

Mario Vilas Points 71

Voici mon approche à cet égard: 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).

6voto

Je suis nouveau en python et j'enquêtais sur la façon de faire. Aucun des exemples fournis sont travail correctement pour moi. Certains sont bloqués par google si vous faites beaucoup de (quelques) demandes, dont certaines sont obsolètes. L'analyse de la recherche google html (ajout de l'en-tête dans la demande) fonctionnera jusqu'à ce que google modifie la structure html de nouveau. Vous pouvez utiliser la même logique de recherche dans n'importe quel 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="http://stackoverflow.com/url?q=')
          else:
            start = data.find('<a href="http://stackoverflow.com/url?q='+str(siteurl))
          data = data[start+len('<a href="http://stackoverflow.com/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

Utilisation:

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

(Edit: Ajout d'un paramètre pour affiner les résultats de recherche google à un site spécifique:)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X