Zanurkuj w Pythonie/Wyszukiwanie w Google

Wyszukiwanie w Google

edytuj

Powróćmy wreszcie do przykładu zamieszczonego na początku rozdziału, który robi coś bardziej użytecznego i interesującego niż mierzenie obecnej temperatury.

Google dostarcza API SOAP dla korzystania z wyników wyszukiwania wewnątrz programów. By móc z niego korzystać musisz zarejestrować konto w Google Web Services.

Procedura 12.4. Zakładanie konta w Google Web Services

  1. Wejdź na stronę http://www.google.com/apis/ i stwórz konto Google. Potrzebny jest Ci do tego tylko adres email. Po rejestracji pocztą elektroniczną dostaniesz swój klucz licencyjny Google API. Będziesz z niego korzystać przy każdym wywołaniu funkcji wyszukiwarki Google.
  2. Również ze strony http://www.google.com/apis/ pobierz zestaw dewelopera Google Web API. Zawiera on przykładowy kod w kilku językach programowania (ale nie w Pythonie) i, co istotniejsze, plik WSDL.
  3. Rozpakuj tenże zestaw i odnajdź w nim plik GoogleSearch.wsdl. Skopiuj go w bezpieczne miejsce na swoim dysku. Przyda się w dalszej części rozdziału.

Gdy będziesz już mieć klucz dewelopera i plik WSDL Google w jakimś pewnym miejscu możesz zacząć zabawę z Google Web Services.

Przykład 12.12. Wgląd w głąb Google Web Services

>>> from SOAPpy import WSDL
>>> server = WSDL.Proxy('/path/to/your/GoogleSearch.wsdl')               #(1)
>>> server.methods.keys()                                                #(2)
[u'doGoogleSearch', u'doGetCachedPage', u'doSpellingSuggestion']
>>> callInfo = server.methods['doGoogleSearch']
>>> for arg in callInfo.inparams:                                        #(3)
...     print arg.name.ljust(15), arg.type
key             (u'http://www.w3.org/2001/XMLSchema', u'string')
q               (u'http://www.w3.org/2001/XMLSchema', u'string')
start           (u'http://www.w3.org/2001/XMLSchema', u'int')
maxResults      (u'http://www.w3.org/2001/XMLSchema', u'int')
filter          (u'http://www.w3.org/2001/XMLSchema', u'boolean')
restrict        (u'http://www.w3.org/2001/XMLSchema', u'string')
safeSearch      (u'http://www.w3.org/2001/XMLSchema', u'boolean')
lr              (u'http://www.w3.org/2001/XMLSchema', u'string')
ie              (u'http://www.w3.org/2001/XMLSchema', u'string')
oe              (u'http://www.w3.org/2001/XMLSchema', u'string')
  1. Rozpoczęcie korzystania z Google Web Services jest proste: utwórz obiekt WSDL.Proxy i wskaż mu miejsce, gdzie znajduje się Twoja lokalna kopia pliku WSDL Google.
  2. Wedle zawartości pliku WSDL, Google udostępnia trzy funkcje: doGoogleSearch, doGetCachedPage i doSpellingSuggestion. Robią dokładnie to, co sugerują ich nazwy. Pierwsza z nich wykonuje wyszukiwanie i zwraca jego wyniki, druga daje dostęp do kopii strony na serwerach Google (z okresu, kiedy była ostatnio odwiedzona przez googlebota), a trzecia sugeruje poprawę błędów literowych we wpisywanych hasłach.
  3. Funkcja doGoogleSearch ma kilka parametrów różnego typu. Zauważ, że o ile z zawartości pliku WSDL można wywnioskować rodzaj i typ argumentów, o tyle niemożliwe jest stwierdzenie jak je wykorzystać. Teoretycznie mogłyby być także określone przedziały, do których muszą należeć argumenty, jednak plik WSDL Google nie jest tak szczegółowy. WSDL.Proxy nie czyni cudów - może dostarczyć Ci tylko informacji zawartych w pliku WSDL.

Poniżej znajduje się zestawienie parametrów funkcji doGoogleSearch:

  • key - Twój klucz licencyjny otrzymany po rejestracji konta Google Web Services.
  • q - Słowo lub wyrażenie, którego szukasz. Składnia jest dokładnie taka sama jak formularza wyszukiwania na stronie www Google, więc zadziałają tutaj wszelkie znane Ci sztuczki lub zaawansowana składnia wyszukiwarki.
  • start - Indeks wyniku wyszukiwania, od którego będą liczone zwrócone wyniki. Podobnie do wersji interaktywnej wyszukiwarki, funkcja ta zwraca 10 wyników na raz. Chcąc uzyskać drugą “stronę” wyników wyszukiwania podajemy tutaj 10.
  • maxResults - Liczba wyników do zwrócenia. Ograniczona z góry do 10, aczkolwiek, gdy interesuje cię tylko kilka wyników, w celu oszczędzenia transferu można podać wartość mniejszą.
  • filter - Podana wartość True spowoduje, iż Google odfiltruje duplikaty stron z wyników wyszukiwania.
  • restrict - Ustawienie countryXX, gdzie XX to kod państwa spowoduje wyświetlenie wyników tylko dla danego państwa, np. countryUK spowoduje wyszukiwanie tylko dla Zjednoczonego Królestwa. Dopuszczalnymi wartościami są też linux, mac i bsd, które spowodują wyszukiwanie w zdefiniowanych przez Google zbiorach stron o tematyce technicznej, lub unclesam, które spowoduje wyszukiwanie w materiałach dotyczących rządu i administracji Stanów Zjednoczonych.
  • safeSearch - Dla wartości True Google odfiltruje z wyników strony pornograficzne.
  • lr (ang. “language restrict” - ograniczenie językowe) - Ustawienie konkretnego kodu języka spowoduje wyświetlenie tylko stron w podanym języku.
  • ie and oe (ang. “input encoding” - kodowanie wejściowe, ang. “output encoding” - kodowanie wyjściowe) - Parametry przestarzałe. Oba muszą przyjąć wartość utf-8.

Przykład 12.13. Wyszukiwanie w Google

>>> from SOAPpy import WSDL
>>> server = WSDL.Proxy('/path/to/your/GoogleSearch.wsdl')
>>> key = 'YOUR_GOOGLE_API_KEY'
>>> results = server.doGoogleSearch(key, 'mark', 0, 10, False, "",
...     False, "", "utf-8", "utf-8")                                 #(1)
>>> len(results.resultElements)                                      #(2)
10
>>> results.resultElements[0].URL                                    #(3)
'http://diveintomark.org/'
>>> results.resultElements[0].title
'dive into mark'
  1. Po przygotowaniu obiektu WSDL.Proxy możemy wywołać server.doGoogleSearch z wszystkimi dziesięcioma parametrami. Pamiętaj o korzystaniu z własnego klucza licencyjnego Google API otrzymanego podczas rejestracji w Google Web Services.
  2. Funkcja zwraca mnóstwo informacji, ale wpierw spójrzmy właśnie na wyniki wyszukiwania. Są przechowywane w results.resultElements, a dostać się do nich możemy tak jak do elementów zwykłej pythonowej listy.
  3. Każdy ze składników resultElements jest obiektem zawierającym adres URL (URL), tytuł (title), urywek tekstu strony (snippet) oraz inne użyteczne atrybuty. W tym momencie możesz już korzystać z normalnych technik introspekcji Pythona do podejrzenia zawartości tego obiektu (np. dir(results.resultElements[0])). Możesz także tę zawartość podejrzeć przy pomocy obiektu WSDL proxy i atrybutu outparams samej funkcji. Obie techniki dają ten sam rezultat.

Obiekt wynikowy zawiera więcej niż tylko wyniki wyszukiwania. Na przykład: informacje na temat procesu szukania (ile trwał, ile wyników znaleziono - pomimo tego, że zwrócono tylko 10). Interfejs www wyszukiwarki pokazuje te informacje, więc są też dostępne metodami programistycznymi.

Przykład 12.14. Pobieranie z Google informacji pomocniczych

>>> results.searchTime                                      #(1)
0.224919
>>> results.estimatedTotalResultsCount                      #(2)
29800000
>>> results.directoryCategories                             #(3)
[<SOAPpy.Types.structType item at 14367400>:
 {'fullViewableName':
  'Top/Arts/Literature/World_Literature/American/19th_Century/Twain,_Mark',
  'specialEncoding': }]
>>> results.directoryCategories[0].fullViewableName
'Top/Arts/Literature/World_Literature/American/19th_Century/Twain,_Mark'
  1. To wyszukiwanie zajęło 0.224919 sekund. Wynik ten nie uwzględnia czasu poświęconego na przesył oraz odbiór dokumentów XML protokołu SOAP. Jest to wyłącznie czas poświęcony przez silnik Google na przetworzenie zapytania, już po otrzymaniu go.
  2. Znaleziono około 30 milionów pasujących stron. Dostęp do kolejnych dziesiątek z tego zbioru uzyskamy za pomocą zmiany argumentu start metody server.doGoogleSearch i kolejnych jej wywołań.
  3. Dla niektórych zapytań Google zwraca także listę powiązanych kategorii z katalogu Google. Dołączając zwrócone w ten sposób URL-e do przedrostka http://directory.google.com/ uzyskamy adresy odpowiednich stron katalogu.