2016-05-07 6 views
26

Ich habe einen Code-Snippet den pygoogle Python-Modul verwenden, das ich kurz und bündig für einigen Begriff in Google programmatisch suchen kann:Suche Programmatically google in Python mit benutzerdefinierter Suche

g = pygoogle(search_term) 
g.pages = 1 
results = g.get_urls()[0:10] 

ich gerade herausgefunden, dass dies war leider eingestellt und durch etwas ersetzt, das als Google Custom Search bezeichnet wird. Ich sah mir die anderen verwandten Fragen zu SO an, fand aber nichts, was ich verwenden könnte. Ich habe zwei Fragen:

1) Erlaubt Google benutzerdefinierte Suche, genau das, was ich in den drei Zeilen oben tun?

2) Wenn ja - wo finde ich Beispielcode, um genau das zu tun, was ich oben mache? Wenn nein, was ist die Alternative zu dem, was ich mit pygoogle gemacht habe?

+0

Es sieht so aus, als ob die benutzerdefinierte Suche Ergebnisse im Cache zurückgibt, die nicht mit den neuesten Google-Funden übereinstimmen? – Alex

Antwort

52

Es ist möglich, dies zu tun. Das Setup ist ... nicht sehr einfach, aber das Endergebnis ist, dass Sie das gesamte Web von Python mit wenigen Zeilen Code durchsuchen können.

Es gibt insgesamt 3 Hauptschritte.

1. Schritt: Holen Google API-Schlüssel

Die pygoogle ‚s-Seite heißt es:

Leider Google nicht mehr unterstützt die SOAP-API für die Suche, noch tun sie neue Lizenzschlüssel zur Verfügung stellen. Kurz gesagt, PyGoogle ist ziemlich viel zu diesem Zeitpunkt tot.

Sie können stattdessen ihre AJAX-API verwenden. Werfen Sie einen Blick hier für Beispielcode: http://dcortesi.com/2008/05/28/google-ajax-search-api-example-python-code/

... aber man kann eigentlich nicht AJAX API verwenden entweder. Sie müssen einen Google API-Schlüssel erhalten. https://developers.google.com/api-client-library/python/guide/aaa_apikeys Für den einfachen experimentellen Gebrauch schlage ich "Serverschlüssel" vor.

2. Schritt: Setup benutzerdefinierte Suchmaschine, so dass Sie das gesamte Web

der Tat suchen, ist die alte API nicht verfügbar. Die beste neue API, die verfügbar ist, ist die benutzerdefinierte Suche. Es scheint nur zu unterstützen, in bestimmten Bereichen suchen jedoch nach folgenden this SO answer Sie die gesamte Web durchsuchen können:

  1. Vom Google Custom Search Homepage (http://www.google.com/cse/), klicken Sie auf eine benutzerdefinierte Suchmaschine erstellen.
  2. Geben Sie einen Namen und eine Beschreibung für Ihre Suchmaschine ein.
  3. Geben Sie unter Suchmaschine definieren im Feld Zu durchsuchende Websites mindestens eine gültige URL ein (setzen Sie jetzt einfach www.anyurl.com, um hinter diesen Bildschirm zu gelangen. Mehr dazu später).
  4. Wählen Sie die gewünschte CSE-Edition aus und akzeptieren Sie die Nutzungsbedingungen, und klicken Sie dann auf Weiter. Wählen Sie die gewünschte Layoutoption aus, und klicken Sie dann auf Weiter.
  5. Klicken Sie auf einen der Links im Abschnitt Nächste Schritte, um zu Ihrem Steuerungsfeld zu navigieren.
  6. Klicken Sie im linken Menü unter Systemsteuerung auf Grundlagen.
  7. Wählen Sie im Bereich "Sucheinstellungen" die Option "Das gesamte Web durchsuchen", aber die darin enthaltenen Websites aus.
  8. Klicken Sie auf Änderungen speichern.
  9. Klicken Sie im linken Menü unter Systemsteuerung auf Sites.
  10. Löschen Sie die Website, die Sie bei der Ersteinrichtung eingegeben haben. https://support.google.com/customsearch/answer/2631040

    3. Schritt:

Dieser Ansatz von Google wird auch empfohlen, Google API-Client für Python

pip install google-api-python-client, weitere Infos hier installieren:

4. Schritt (Bonus): tun, um die Suche

So, nachdem diese nach oben einstellen, können Sie die Codebeispiele aus wenigen Orten folgen:

und mit diesem Ende:

from googleapiclient.discovery import build 
import pprint 

my_api_key = "Google API key" 
my_cse_id = "Custom Search Engine ID" 

def google_search(search_term, api_key, cse_id, **kwargs): 
    service = build("customsearch", "v1", developerKey=api_key) 
    res = service.cse().list(q=search_term, cx=cse_id, **kwargs).execute() 
    return res['items'] 

results = google_search(
    'stackoverflow site:en.wikipedia.org', my_api_key, my_cse_id, num=10) 
for result in results: 
    pprint.pprint(result) 

Nach einigen Optimierungen Sie einige Funktionen schreiben könnte, die genau wie Ihr Snippet verhalten, aber ich werde diesen Schritt hier überspringen.

+0

Danke, das ist eine tolle Antwort. – user3079275

+3

'my_cse_id' finden Sie unter' https://cse.google.com/cse/setup/basic?cx= 'und ersetzen Sie'% 3A' durch ':' – Hugo

+0

Der obige Code gibt manchmal das gleiche Ergebnis. Irgendeine Idee? –