Парсинг сайтов с помощью фреймворка Scrapy

Материал из GIS-Lab
Перейти к навигации Перейти к поиску
Эта страница является черновиком статьи.


Введение

Синтаксический анализ (парсинг) сайтов хоть и не имеет прямого отношения к пространственным данным, но владение основами которого полезно любому, работающему с ними. В свете роста числа онлайн-ресурсов, публикующих открытые данные, ценность умения извлекать из них необходимую информацию многократно повышается. Приведём небольшой пример. Допустим, нам необходимо составить набор тематических карт, отражающих результаты Выборов Президента Российской Федерации 2012. Исходные данные можно получить на сайте ЦИК России. Однако, согласитесь, что непосредственно использовать данные, предоставляемые в таком виде, очень сложно. Плюс это усложняется тем, что данные по разным регионам расположены на разных страницах. Гораздо удобнее было бы, чтобы вся эта информация была представлена, например, в виде одного или нескольких структурированных CSV или XML файлов (в идеале, конечно было бы иметь еще и некоторый API, позволяющий выполнять запросы к таким ресурсам), однако зачастую формирование подобных файлов отдаётся на откуп конечному пользователю (почему так происходит - это вопрос отдельный). Именно проблеме создания таких вот аггрегированных наборов данных и посвещена данная статья. В связи с недавними событиями в качестве целевого сайта, который мы будем парсить выбран сайт ДетскиеДомики.ру, а именно его раздел Детские учреждения. Предполагается, что информация, расположенная на этом сайте станет в ближайшее время очень востребованной.

В качестве инструмента, которым будет выполняться парсинг выбран Scrapy - очень гибкий фреймворк, написанный на Python, позволяющего решать широкий спектр задач. Информации о Scrapy на русском языке не так много, например, но этот пробел компенсируется отличной документацией.

В данной статье мы не будем подробно заострять внимание на всех технических возможностях Scrapy, а просто рассмотрим поэтапно как была решена определённая задача. Если кто-то захочет использовать данный материал как отправную точку для решения собственной задачи, но не найдёт здесь ответов на свой вопрос - спрашивайте в форуме, постараемся помочь.

Установка Scrapy

В *nix-системах установка Scrapy - тривиальная задача, чего не скажешь о Windows (чем не повод наконец-то отказаться от неё или по крайней мере посмотреть вокруг), поэтому мы рассмотрим первый вариант:

cd ~
mkdir scrapy
cd scrapy
virtualenv --no-site-packages env
source ./env/bin/activate
pip install Scrapy

Создание проекта

После того, как Scrapy установлен, необходимо создать каталог проекта. Для этого, находясь в каталоге ~/projects/scrapy, необходимо выполнить команду:

scrapy startproject orphanage

В результате чего будет создана директория orphanage (соответствует имени проекта), имеющая следующую структуру:

orphanage/
    scrapy.cfg
    orphanage/
        __init__.py
        items.py
        pipelines.py
        settings.py
        spiders/
            __init__.py
            ...
  • scrapy.cfg - настройки проекта;
  • orphanage/ - Python модуль проекта;
  • orphanage/items.py - классы, которые перечисляют поля собираемых данных;
  • orphanage/pipelines.py - используется в основном для описания каких-нибудь кастомных форматов сохранения результатов парсинга;
  • orphanage/settings.py - пользовательские настройки паука;
  • orphanage/spiders/ - директория, в которой хранятся файлы с классами пауков. Каждого паука принято писать в отдельном файле с именем spider_name.py.

Описание модели данных

Создание паука

Формирование выходных данных

Результат