Написание и запуск парсера организаций из Яндекс Карт
Эта статья поможет вам пройти полный цикл настройки и использования API Яндекс для поиска организаций. Мы рассмотрим, как установить необходимые инструменты, получить ключ доступа к API, а также написать скрипт на Python, который поможет автоматизировать сбор данных.
1. Установка Python
Для написания и запуска скриптов на Python необходимо сначала установить сам Python.
- Перейдите на официальный сайт Python по ссылке: https://www.python.org/downloads/.
- Для пользователей Windows выберите версию с расширением
.exe
, для macOS и Linux — подходящие версии для ваших ОС. - Рекомендуется устанавливать версию 3.x для большей совместимости.
- Запустите скачанный установочный файл.
- На первом экране обязательно установите галочку «Add Python to PATH», чтобы Python добавился в системные переменные.
- Нажмите Install Now и дождитесь завершения установки.
- Для лучшего понимания процесса, добавьте скриншоты, чтобы пользователи могли легко следовать инструкциям.
python --version
2. Установка библиотеки requests
Библиотека requests
используется для отправки HTTP-запросов. Она понадобится для взаимодействия с API Яндекс.
pip install requests
- В случае проблем с установкой, попробуйте запустить командную строку от имени администратора.
- Проверьте, что библиотека установлена, с помощью команды:
pip show requests
3. Регистрация и настройка API Яндекс
Для работы с API Яндекс необходимо зарегистрироваться и настроить доступ через Яндекс.Облако.
Шаг 1: Регистрация в Яндекс.Облаке
- Перейдите на Яндекс.Облако и войдите в свой аккаунт. Если у вас нет аккаунта, зарегистрируйтесь.
- На главной странице панели управления Яндекс.Облака нажмите Создать облако и задайте ему имя, например, «Проект Новосибирск».
- Яндекс.Облако может потребовать привязку банковской карты для подтверждения личности. Это нужно даже для получения бесплатного тарифа.
- Внутри созданного облака создайте каталог. Каталоги помогают структурировать проекты и ключи API. Назовите его, например, «Автосервисы Новосибирск».
Шаг 3: Подключение API поиска по организациям
- Перейдите на страницу API поиска по организациям (Places API) и нажмите Подключить API.
- Выберите ранее созданный каталог и нажмите Подключить.
- Перейдите в раздел «Управление доступом» и найдите раздел «API-ключи».
- Нажмите Создать API-ключ и дайте ему название, например, «API для автосервисов».
- Скопируйте полученный ключ, он понадобится для выполнения запросов.
Не забудьте выбрать и оплатить тариф использования API
4. Написание Скрипта для Парсинга Данных
Теперь, когда у нас есть API-ключ, можно написать скрипт для получения данных о организациях в заданном регионе.
Шаг 1: Открытие редактора и создание файла
- Рекомендую использовать редактор с подсветкой синтаксиса, например PyCharm. Если редактора нет, скачайте и установите его.
- Создайте новый файл с названием, например,
novosibirsk_autoservices.py
.
import requests import csv import logging # Настройка логирования logging.basicConfig(filename='errors.log', level=logging.ERROR, format='%(asctime)s - %(levelname)s - %(message)s') # Укажи API-ключ Яндекс.Карт API_KEY = "ваш_ключ_API" # Вставь сюда свой API-ключ SEARCH_TEXT = "автосервис" # Что ищем (можно менять на другие категории) LOCATION = "82.9204,55.0302" # Координаты Новосибирска RADIUS = 5000 # Радиус поиска в метрах (например, 5 км) - пока не используется напрямую # Формирование URL запроса url = f"https://search-maps.yandex.ru/v1/?text={SEARCH_TEXT}&ll={LOCATION}&spn=0.1,0.1&rspn=1&type=biz&results=50&lang=ru_RU&apikey={API_KEY}" try: # Отправка запроса и получение данных response = requests.get(url, timeout=10) response.raise_for_status() # Проверка на успешный статус ответа data = response.json() # Проверка наличия данных в ответе if 'features' not in data or not data['features']: raise ValueError("Поле 'features' отсутствует или пустое в ответе API.") # Сохранение данных в CSV файл with open('novosibirsk_autobase.csv', mode='w', newline='', encoding='utf-8') as file: writer = csv.writer(file) writer.writerow(["Название", "Телефон", "Адрес"]) for org in data['features']: properties = org.get('properties', {}).get('CompanyMetaData', {}) name = properties.get('name', 'Не указано') # Проверка на наличие телефонов phones = properties.get('Phones', []) phone = phones[0].get('formatted', 'Не указано') if phones else 'Не указано' # Получение адреса address = properties.get('address', 'Не указано') writer.writerow([name, phone, address]) print("Данные сохранены в файле novosibirsk_autobase.csv") except requests.exceptions.RequestException as e: error_message = f"Произошла ошибка при выполнении запроса: {e}" print(error_message) logging.error(error_message) except Exception as e: error_message = f"Непредвиденная ошибка: {e}" print(error_message) logging.error(error_message)
5. Запуск Скрипта
Теперь, когда скрипт готов, можно его запустить.
- Откройте командную строку и перейдите в папку, где сохранён ваш файл. Для этого используйте команду
cd
:
cd путь_к_папке_с_файлом
cd C:\Users\Имя_пользователя\Desktop
python novosibirsk_autoservices.py
6. Проверка Результатов
- Найдите файл
novosibirsk_autobase.csv
в папке, где находится скрипт. - Откройте файл, чтобы убедиться, что данные корректно сохранились. CSV-файл будет содержать названия, телефоны и адреса найденных организаций.
- Для удобства можно открыть файл в Excel или Google Sheets, чтобы сделать данные более наглядными.
Советы и Подсказки
- Работа с ошибками API: Возможны ошибки, такие как
403 Forbidden
или429 Too Many Requests
. Убедитесь, что вы правильно указали ключ и не превысили лимит запросов. - Дополнительные возможности: Вы можете адаптировать запрос, чтобы искать другие типы организаций. Попробуйте изменить параметр
SEARCH_TEXT
на что-то другое, например, «ресторан» или «аптека». - Автоматизация: Если вы хотите собирать данные регулярно, настройте запуск скрипта по расписанию с помощью Планировщика задач Windows или
cron
для Linux.
Теперь у вас есть полноценная инструкция по установке Python, настройке API Яндекс и написанию скрипта для автоматического сбора данных. Если потребуется помощь, обращайтесь @zinchenki