Написание и запуск парсера организаций из Яндекс Карт
Эта статья поможет вам пройти полный цикл настройки и использования 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