Поиск Google из приложения Python - PullRequest
51 голосов
/ 01 ноября 2009

Я пытаюсь запустить поисковый запрос Google из приложения Python. Есть ли какой-нибудь интерфейс Python, который позволил бы мне сделать это? Если нет, никто не знает, какой API Google позволит мне это сделать. Спасибо.

Ответы [ 5 ]

70 голосов
/ 01 ноября 2009

Вот простой пример здесь (в частности, отсутствуют некоторые кавычки ;-). Большая часть того, что вы увидите в Интернете, - это интерфейсы Python к старому, прекращенному API SOAP - пример, на который я указываю, использует более новый и поддерживаемый API AJAX, это, безусловно, тот, который вам нужен!

Редактировать : вот более полный пример 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')
17 голосов
/ 01 ноября 2009

Вот ответ Алекса, портированный на 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')
11 голосов
/ 10 января 2012

Вот мой подход к этому: 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)

Обратите внимание, что этот код НЕ использует API Google и до сих пор работает (январь 2012 г.).

6 голосов
/ 07 февраля 2013

Я новичок в Python, и я изучал, как это сделать. Ни один из приведенных примеров не работает должным образом для меня. Некоторые из них заблокированы Google, если вы делаете много (несколько) запросов, некоторые устарели. Анализ html-поиска Google (добавление заголовка в запрос) будет работать до тех пор, пока Google снова не изменит структуру html. Вы можете использовать ту же логику для поиска в любой другой поисковой системе, просматривая 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

Использование:

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

(Изменить 1: добавление параметра для сужения поиска Google для определенного сайта)

(Изменить 2: Когда я добавил этот ответ, я кодировал скрипт Python для поиска субтитров. Недавно я загрузил его на Github: Subseek )

0 голосов
/ 24 апреля 2018

Поскольку API AJAX не работает, вы можете использовать стороннюю службу, такую ​​как Serp API , которая является оболочкой результатов поисковой системы Google.

Легко интегрируется с 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...