Case Study - Wyciąganie danych z innych serwisów za pomocą pythona

Data publikacji: 2015-10-27 | Tagi:

Python doskonale nadaje się do szybkiego pobierania i przetwarzania dużej ilości danych. Za przykład niech posłuży opisany poniżej przypadek.

Uprawiam chodzenie. Są to raczej trasy na orientację po podlaskich lasach, polach, krzakach i łąkach. Gdy tak sobie chodzę, lubię mieć włączony telefon rejestrujący moją trasę w serwisie Strava.

Pewnego dnia wybrałem się na taki krótki spacer (w założeniu maksymalnie 20km) ze znajomymi. Pech chciał, że zapomniałem uruchomić aplikację u siebie. Szczęście w nieszczęściu, bo kolega odpalił podobną, ale korzystającą z serwisu Sports Tracker.

Podesłał mi świetnie zarejestrowaną wersję webową, ale co z tego, skoro ja chcę mieć ją u siebie na swoim koncie w stravie :)?

Trzeba wymienić się gpxami zakrzyknie ktoś wesoło, ale wspomniany wyżej kolega nie do końca kojarzy co to takiego ten gpx i jak wyciągnąć dane z telefonu komórkowego.

Zastanowiłem się chwilę i w ciągu 2 do 3 minut miałem gotowy niecny plan :]

Pierwszy krok, to zanalizowanie, w jaki sposób sports tracker pobiera dane do wyświetlenia trasy. Krótki sniff w konsoli Chrome i już wiem, że json z danymi, których potrzebuję znajduje się pod adresem http://www.sports-tracker.com/apiserver/v1/workouts/562373fce4b0ff81d80edfa6/data?samples=100000. Zgłębianie odpowiednich opcji apiservera odpuściłem sobie, bo wszelkie niezbędne informacje mam jak na talerzu. Przyszedł czas na nieco kodowania:

# -*- coding: utf-8 -*-

import json
import requests

URL = "http://www.sports-tracker.com/apiserver/v1/workouts/562373fce4b0ff81d80edfa6/data?samples=100000"

r = requests.get(URL)

data = json.loads(r.text)

W zmiennej data mamy w efekcie wszystkie dane, po krótkiej analizie których ustaliłem co następuje:

  • data['payload']['starttime'] - timestamp początku śledzenia (w formacie js, czyli łącznie z milisekundami;
  • data['payload']['locations'] - lista słowników zawierających poszczególne markery.
  • każdy z elementów wymienionej listy zawiera następujące, interesujące nas wartości: la oraz ln - szerokość i długość geograficzna; h - wysokość w metrach npm; t - ilość sekund, które upłynęły od początku śledzenia.

Jeszcze tylko informacja dla niezorientowanych - requests to urllib i urllib2 w jednym, zrozumiałym i niedziwacznym pakiecie :). Dokumentacja znajduje się tutaj.

No dobrze, mamy dane, więc przydałoby się je umieścić w pliku gpx 'jadalnym' dla najróżniejszych aplikacji korzystających z tego formatu. Jeśli nie jesteś superczłowiekiem lub nie zajmujesz się zawodowo urządzeniami gps, to zapewne (podobnie jak ja), nie wiesz jak wygląda prawidłowo sformatowany plik gpx. Po dwudziestu sekundach googlania jednak już wiesz :), korzystając np. z pierwszego zwróconego linka.

Kolejna wersja skryptu będzie zatem wyglądać mniej więcej tak:

# -*- coding: utf-8 -*-

import datetime
import json
import requests

URL = "http://www.sports-tracker.com/apiserver/v1/workouts/562373fce4b0ff81d80edfa6/data?samples=1000000"

GPX = """
<?xml version="1.0" encoding="UTF-8"?>
<gpx version="1.0">
    <name>SportsTracker converted</name>
    <trk>
        <name>SportsTracker Track</name>
        <number>1</number>
        <trkseg>
        %s
        </trkseg>
    </trk>
</gpx>
"""

r = requests.get(URL)

data = json.loads(r.text)
start_timestamp = int(data['payload']['starttime']) / 1000

result = ""
for elem in data['payload']['locations']:
    result += '<trkpt lat="%s" lon="%s"><ele>%s</ele><time>%s</time></trkpt>\n' % (elem['la'], elem['ln'], elem['h'], datetime.datetime.fromtimestamp(start_timestamp + int(elem['t'])).strftime('%Y-%m-%dT%H:%M:%SZ'))

print GPX % result

Poza znanym już odczytaniem danych z serwera, ustawiamy timestamp (dzieląc przez 1000, żeby pozbyć się milisekund javascriptu), a następnie iterujemy po każdej zapisanej lokalizacji, tworząc string wynikowy z tagiem trkpt.

Na zakończenie wszystko wypisujemy. Skrypt można wywołać w następujący sposób:

python nasz_skrypt.py > trasa.gpx

Tak przygotowaną trasę można wczytać do urządzenia GPS lub do dowolnej aplikacji pozwalającej na obróbkę i składowanie danych w formacie gpx. Powodzenia! :)


Oceń ten post:
Podziel się:

comments powered by Disqus

IT w obrazkach: