Cóż, słowo się rzekło, kobyłka u płotu. Obiecałem udostępnić skrypty z HOWTO? Obiecałem. To teraz trzeba udostępnić. Musiałem tylko trochę kod poczyścić, dzięki temu cały proces znacznie się uautomatycznił :)) przynajmniej do czasu aż PP zmieni układ strony do szukania.
OK, do rzeczy, potrzeba nam następujących składników:
- Ruby
- lynx
- unixpodobne zwierzę (ja to akurat na FreeBSD wszystko robię)
Najpierw Ruby. Skrypt parse.rb ściąga stronę(y) z wynikami szukania, parsuje je a wynik zapisuje w pliku poczta_out.js w bieżącym katalogu. Do ściągnięcia potrzebuje lynxa dostępnego w ścieżce. To czego szuka skrypt na stronie PP określają dwa parametry CITY oraz REGION na twardo zaszyte w skrypt (linie 4, 5). CITY to po prostu nazwa miejscowości, a REGION to numer województwa (lista uzyskana ze źródeł formularza na stronie poczty):
02 DOLNOŚLĄSKIE 04 KUJAWSKO-POMORSKIE 06 LUBELSKIE 08 LUBUSKIE 10 ŁÓDZKIE 12 MAŁOPOLSKIE 14 MAZOWIECKIE 16 OPOLSKIE 18 PODKARPACKIE 20 PODLASKIE 22 POMORSKIE 24 ŚLĄSKIE 26 ŚWIĘTOKRZYSKIE 28 WARMIŃSKO-MAZURSKIE 30 WIELKOPOLSKIE 32 ZACHODNIOPOMORSKIE
Czemu mnożyli to przez 2 to nie wiem, ale takie numerki trzeba używać. Akurat w parse.rb zaszyte jest miasto Opole, więc kod REGION to 16.
Czyli w skrypcie ustawiamy CITI oraz REGION i odpalamy go:
$ ruby parse.rb **** First request **** Page 3 Page 2 W sumie 21 placówek
OK. Teraz w poczta_out.js jest tablica ze wstępnymi danymi. Trzeba ją przepuścić przez geocoder aby uzyskać współrzędne z adresów. Tutaj na ratunek przychodzi poczta_geo.html, która robi geocoding. Najpierw musimy wpisać nazwę miasta w formularz (wiem, można było przez inna zmienna przekazać przez poczta_out.js) tak aby geocoder wiedział co dopisać do zapytania i klikamy geocode. Jeśli strona ma poprawny klucz Google Maps API, licznik powinien zacząć się zmniejszać, aż do zera, a potem powinna zostać wypisana tablica z finalnymi wynikami.
Teraz krótka analiza wyników – trzeba szukać ciągu 0, 0,. Jeśli taki się pojawił w finalnej tablicy jako współrzędne, to znaczy że dla tej lokalizacji wystąpił jakiś błąd podczas wywołania geocodera. Na przykład, Google Maps nie poradziło sobie w Warszawie z adresem Stacja METRO-CENTRUM, ale chyba nie będziemy się czepiać.
Jeśli wszystko jest OK to ta tablica to dane analogiczne jak dla Warszawy wcześniejsza moja praca.
Kilka uwag:
- Jeśli chcesz przyspieszyć działanie geocodera zmień opóźnienie w
poczta_geo.htmlw linii 66 z 500 na mniejsze – 100 będzie OK - Wymieniłem maile z webmasterem Poczty Polskiej i szykują oni jakąś wizualizację ale obawiam się, że to będzie tylko link z wyników szukania do mapy z zaznaczoną placówką (takie zobacz na mapie) a nie pełne odwzorowanie na mapie. Wystarczy spojrzeć w kod HTML wyników szukania (jak słusznie zauważył Imrahil)
poczta_geo.htmlwymaga wpisania klucza GM API – linia 14- jedna z rzeczy których sie przy okazji nauczyłem – IE tablicę
[ 1, 2, 3, 4, ]traktuje jako 5-cio elementową (dodatkowy przecinek na końcu!), a Firefoks jako 4-ro. Dlatego z finalnego rezultatu należy usunąć ostatni przecinek z końca aby IE nie dostał dodatkowego pustego rekordu
No a na koniec zostawiłem samo mięsko:
- parse.rb
- poczta_geo.html
- i jak kto ciekaw półproduktu to poczta_out.js
Ktoś się Poznania domagał? :))) to proszę, czekam :))
I jeszcze jedna rzecz – jeśli będziecie mi podsyłać wynik waszych walk dla różnych miast mogę to wszystko trzymać w jednym miejscu, w ten sposób powstałaby jakaś bardziej kompletna baza danych. Choć może w końcu Poczta Polska to udostępni w jakiś sensowny sposób…
Popularity: 24% [?]




Ja bym to uniezależnił od unixopodobnych i zamiast ściągania pliku lynxem zrobił używając http://www.ruby-doc.org/core/classes/Net/HTTP.html :)
Oprócz tego bardzo fajny tutorial :)
Gdyby to pisał od początku z myślą o tym tutorialu to pewnie bym tak zrobił, ale to jest lekko wyczyszczony ‘jednorazowy’ skrypt. Następnym razem może będę pamiętał :)