2009-11-01 17 views
51

Próbuję uruchomić kwerendę wyszukiwania google z aplikacji Pythona. Czy istnieje jakiś interfejs python, który pozwoliłby mi to zrobić? Jeśli nie jest nikomu wiadomo, który Google API pozwoli mi to zrobić. Dzięki.Wyszukiwarka Google z aplikacji Pythona

Odpowiedz

70

Istnieje prosty przykład here (szczególnie brakuje niektórych cytatów ;-). Większość tego, co zobaczysz w internecie, to interfejsy Pythona ze starym, przestarzałym interfejsem SOAP API - przykład wskazuję, że korzystam z nowszego i obsługiwanego interfejsu API AJAX, to zdecydowanie ten, którego potrzebujesz! -)

Edit: tu jest pełniejsza Python 2.6 przykładem wszystkich potrzebnych cytatów & 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') 
+3

Próbowałem tego na moim lokalnym komputerze z Linuksem, a potem Google myślał, że jestem botem, a wszelkie wyszukiwania w przeglądarce są captcha "Ed! Nie powinienem był tego wypróbowywać w pracy, po prostu heads-up dla kogoś używającego tego. Dodaj klienta użytkownika i stronę odsyłającą, aby wyglądał bardziej jak prawdziwe żądanie! – ThinkCode

+11

Niestety, [Google Web Search API] (http://code.google.com/apis/websearch/), na który się opiera, został wycofany w listopadzie 2010 r. Interfejs API wyszukiwarki niestandardowej ma zastąpić to, ale wymaga skonfigurowania lista adresów URL do przeszukiwania - nie cała sieć. – Day

+3

na dzień dzisiejszy (2014.06.10), działa ... na moim IPython/Python2.7.6 – kmonsoor

17

tutaj jest odpowiedź Alexa przeniesiony do 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') 
+0

Jaka byłaby przewaga korzystania z Pythona 3 nad odpowiedzią Alexa? –

+1

@Phill, nie wiesz co masz na myśli przez "zaletę". Jeśli twój projekt korzysta z Python2, używaj odpowiedzi Alexa. Jeśli projekt korzysta z Python3, możesz użyć tej odpowiedzi.Niestety, pisanie tej funkcji w praktyce nie jest zbyt praktyczne, aby użyć tego samego kodu w obu wersjach Pythona –

+0

. Domyślam się, że moje pytanie brzmi: dlaczego warto używać Python3 w porównaniu z Python2? Jakie są korzyści? Nowość w Pythonie, pochodząca z tła PHP. Czy sprawy są bardziej sformalizowane? –

11

Oto moje podejście do tego : http://breakingcode.wordpress.com/2010/06/29/google-search-python/

A przykłady kodu para:

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

Zauważ, że ten kod nie korzysta z API Google i nadal pracuje do chwili obecnej (styczeń 2012).

+0

HI Mario, próbowałem użyć twojego scenariusza i jego bajecznego. Mam do czynienia tylko z jedną kwestią - nawet jeśli używam. COM jako TLD, otrzymuję wyniki, które się pojawiają .CO.IN. Czy możesz mi pomóc? –

+0

Pamiętaj, że może to przerwać w dowolnym momencie, ponieważ nie korzysta z oficjalnego interfejsu API, ale jest pobierana na stronie wyników wyszukiwania Google, np. jeśli Google zmieni sposób zwracania wyników. – stracktracer

6

Jestem nowy w Pythonie i zastanawiałem się, jak to zrobić. Żaden z podanych przykładów nie działa poprawnie. Niektóre z nich są blokowane przez Google, jeśli wykonujesz wiele (kilka) próśb, niektóre są nieaktualne. Parsowanie html wyszukiwania Google (dodanie nagłówka w żądaniu) będzie działało, dopóki google nie zmieni ponownie struktury html. Możesz użyć tej samej logiki do wyszukiwania w dowolnej innej wyszukiwarce, zaglądając do 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 

Zastosowanie:

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

(Edit 1: Dodanie parametru do zawężenia wyszukiwania Google do określonej strony)

(Edit 2: Kiedy dodałem tę odpowiedź byłem kodowania Skrypt w języku Python do wyszukiwania napisów Ostatnio dodałem go do Github: Subseek)

+0

Interesuje mnie, dlaczego żaden z przykładów nie zadziałał, zwłaszcza ten, że BeautifulSoup nie działa, ponieważ kod HTML jest generowany przez JavaScript ... Próbowałem już teraz i działa: http: //breakingcode.wordpress .com/2010/06/29/google-search-python/ – MarioVilas

+0

W moim przypadku nie mogłem korzystać z BeautifulSoup. Testowałem to i wygląda na to, że google generowało odpowiedź html za pomocą bloków javascript, więc nie znalazłem sposobu na uzyskanie linków z klasą BS. Znalazłem tylko linki w odpowiedzi za pomocą funkcji "znajdź". –

+0

Być może adres URL do Google wskazuje na nowszy interfejs API, który używa JavaScript zamiast starszego interfejsu API, który korzystał z gołego kodu HTML. Wydaje mi się, że dodanie "& btnG = Google + Search" w zapytaniach powoduje, że używa on HTML API, a przynajmniej jest to jedyna różnica, którą widzę. – MarioVilas

Powiązane problemy