CoderCastrov logo
CoderCastrov
Питон

Парсинг международных путешествий из истории Google Maps

Парсинг международных путешествий из истории Google Maps
просмотров
3 мин чтение
#Питон

Проведя несколько лет в Великобритании, я решил, что стал достаточно британским, чтобы подать заявление на получение гражданства. После изучения и успешной сдачи теста "Жизнь в Великобритании" я предполагал, что самая трудная часть уже позади. Это предположение разбилось, как только я перешел к разделу заявления, где мне нужно было указать детали моих международных поездок за последние 5 лет. Обычно это не должно быть слишком сложно, но учитывая, что мне приходилось путешествовать по работе, это займет немало времени.

Как любой уважающий себя разработчик, вместо того, чтобы выполнять ручную работу по поиску всех деталей моих полетов и вводу их по одной в форму, я решил автоматизировать этот процесс (что, вероятно, займет больше времени, но хотя бы это весело).

На высоком уровне мне нужно будет сначала получить набор данных с необходимыми деталями о путешествии: страна, причина, дата отправления, дата возвращения. После этого мне нужно будет выяснить, как программно отправить эти данные.


Часть 1: Генерация набора данных

Благодаря моему отсутствию конфиденциальности (по собственному выбору, предположим), у меня есть полная история местоположений, отслеживаемая Google, которая охватывает последние 5 лет. После того, как я скачал ее от Google, я обратился к Python, чтобы выполнить следующие задачи:

  • Извлечь список кортежей с отметками времени, широтой и долготой
  • Перевести широту и долготу в названия стран (обратное геокодирование)
  • Оставить только переходы из и в Великобританию

Для извлечения списка мы воспользуемся стандартной библиотекой JSON в Python:

records = json.load(open(args.input))
locations = records["locations"]

Для получения названий стран мы будем использовать метод, называемый обратным геокодированием. Этот метод предоставляет информацию о местоположении для заданных широты и долготы. Для достижения наилучшей точности наиболее подходят онлайн-API (например, Google Maps API). В моем случае важна только страна, а скорость работы имеет большее значение, поэтому я буду использовать оффлайн-библиотеку. Подходящей для этого является библиотека Python с названием reverse-geocode.

location_metadata = reverse_geocode.search(coordinates)

В моем случае для 8 лет данных было 1,4 миллиона записей о местоположении. Даже с оффлайн-поиском обратного геокодирования на такой шкале обработка каждого события занимает несколько минут, поэтому мы можем уменьшить гранулярность, игнорируя записи в определенном временном окне.

Интересно, что Google Maps может давать очень неточные измерения, которые помещают меня в случайные страны, поэтому я также фильтрую события на основе точности (произвольное значение 200 работает хорошо).

Остальная часть кода просто манипулирует списком объектов в формате, наиболее удобном для последующего использования. Полный скрипт находится на GitHub:

GitHub - gergelycsegzi/gmaps-history-to-countries: Преобразование истории местоположений Google в список временных меток путешествий, возможно, сглаживая для источника...

github.com


Для Часть 2: Автоматическая отправка_ — _вместо ручного заполнения формы я буду использовать либо curl, либо скрипты Tampermonkey. Но это для другого дня и другого поста.

Обновление: после проверки некоторых запросов, отправляемых при отправке формы, кажется возможным написать скрипт, который отправляет HTTP-запросы на веб-сайт правительства Великобритании для отправки информации о путешествиях. Соответствующие шаги будут следующими:

Однако создание этого скрипта займет гораздо больше времени, чем просто ручная отправка готовой и подготовленной истории путешествий. Поэтому, несмотря на то что это противоречит инженерному инстинкту создания многоразового решения, я просто сделаю это вручную, чтобы быстро закончить.