Поиск Google из приложения Python

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


person Res    schedule 01.11.2009    source источник


Ответы (4)


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

Изменить: вот более полный пример Python 2.6 со всеми необходимыми кавычками -)...:

#!/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')
person Alex Martelli    schedule 01.11.2009
comment
Попробовал это на моей локальной машине с Linux, а затем Google подумал, что я бот, и любые поисковые запросы в моем браузере блокируются! Я не должен был пробовать это на работе, просто хедз-ап для тех, кто использует это. Добавьте пользовательский агент и реферер, чтобы он больше походил на настоящий запрос! - person ThinkCode; 28.09.2011
comment
К сожалению, API веб-поиска Google, на котором это основано, в ноябре 2010 г. устарел. Пользовательский поиск Предполагается, что API заменит это, но требует, чтобы вы настроили список URL-адресов для поиска, а не всю сеть. - person Day; 27.12.2011
comment
на сегодняшний день (2014.06.10) это работает... на моем IPython/Python2.7.6 - person kmonsoor; 10.06.2014
comment
По состоянию на март 2016 года это не работает. Google отвечает следующим образом: {responseData: null, responseDetails: Google Web Search API больше недоступен. Перейдите на Google Custom Search API (developers.google.com/custom-search). , статус ответа: 403} - person ; 16.03.2017
comment
Как упоминалось выше, это устаревший API, который больше не работает. Кроме того, Google использует https для всего, поэтому один URL-адрес http:// не рекомендуется. То же самое с ответом Джона Ла Роя ниже. - person fattire; 26.03.2017

Вот ответ Алекса, перенесенный на 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')
person John La Rooy    schedule 01.11.2009
comment
В чем преимущество использования Python 3 по сравнению с ответом Алекса? - person Phill Pafford; 16.11.2010
comment
@Phill, не уверен, что ты имеешь в виду под преимуществом. Если в вашем проекте используется Python2, вы используете ответ Алекса. Если в проекте используется Python3, вы можете использовать этот ответ. К сожалению, не очень практично писать эту функцию таким образом, чтобы использовать один и тот же код с обеими версиями Python. - person John La Rooy; 17.11.2010
comment
Я предполагаю, что мой вопрос в том, зачем использовать Python3 вместо Python2? Каковы преимущества? Новичок в Python, исходящий из фона PHP. Все более формализовано? - person Phill Pafford; 17.11.2010
comment
@Phill, Python3 - более чистый и последовательный дизайн, чем Python2, но не полностью обратно совместим. Как правило, изменения, необходимые для переноса кода, довольно малы, как вы можете видеть здесь, однако ряд сторонних библиотек и фреймворков по-прежнему не поддерживают Python3, поэтому многие люди все еще используют Python2. - person John La Rooy; 18.11.2010
comment
Есть ли способ получить более 4 хитов? - person Adam_G; 26.04.2015

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

person Mario Vilas    schedule 10.01.2012
comment
Привет, Марио, я пытался использовать твой сценарий, и он потрясающий. Я столкнулся только с одной проблемой: даже когда я использую .COM в качестве TLD, я получаю результаты, соответствующие .CO.IN. Не могли бы вы помочь? - person Nitin Srivastava; 24.02.2015
comment
Обратите внимание, что это может сломаться в любое время, поскольку он не использует официальный API, а очищает страницу результатов Google, например. если Google изменит способ возврата результатов. - person stracktracer; 21.04.2015

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

person Federico Nicolas Motta    schedule 07.02.2013
comment
В моем случае я не смог использовать BeautifulSoup. Я проверил это, и кажется, что Google генерирует ответ html с блоками javascript, поэтому я не нашел способа получить ссылки с классом BS. Я нашел ссылки в ответе только с помощью функции поиска. - person Federico Nicolas Motta; 04.08.2013
comment
Возможно, URL-адрес Google указывает на более новый API, использующий JavaScript вместо устаревшего API, использующего чистый HTML. Я считаю, что добавление &btnG=Google+Search в ваши запросы заставляет его использовать HTML API, или, по крайней мере, это единственная разница, которую я вижу. - person MarioVilas; 06.08.2013
comment
@MarioVilas Спасибо за совет. Попробую с параметром. Может так быстрее? - person Federico Nicolas Motta; 17.08.2013