Парсинг сайтов с помощью фреймворка Scrapy: различия между версиями

Материал из GIS-Lab
Перейти к навигации Перейти к поиску
мНет описания правки
мНет описания правки
Строка 54: Строка 54:
== Описание модели данных ==
== Описание модели данных ==


Модель представляет собой отдельный класс, содержащий перечень атрибутивных полей собираемых данных. Прежде чем описывать модель, необходимо определиться во-первых с объектом парсинга, а во-вторых с набором его атрибутов, которые мы хотим извлечь из целевого ресурса. Объектом парсинга в нашем случае будут являться детские дома, а набором атрибутов - их характеристики (в случае если у каждого объекта перечень доступных атрибутов различный, то итоговым набором будет являться объединение множеств атрибутов всех объектов). Находим страницу, содержащую наиболее полный перечень атрибутов (в данном случае факт полнотоы был определён путём сопоставления представленных атрибутов и [http://detskiedomiki.ru/UserFiles/Anketa%20detskogo%20uchrezhdeniya(2).doc анкеты детского учреждения]) и выписываем их: "Рег. номер", "Регион", "Район", "Тип учреждения", "Название", "Почтовый адрес" и т.д. (всего 34 атрибута). После того, как мы определились с перечнем атрибутов, отразим их в специальном классе. Для этого открываем файл ''items.py'' и описываем класс (название - произвольное):
Модель представляет собой отдельный класс, содержащий перечень атрибутивных полей собираемых данных. Прежде чем описывать модель, необходимо определиться во-первых с объектом парсинга, а во-вторых с набором его атрибутов, которые мы хотим извлечь из целевого ресурса. Объектом парсинга в нашем случае будут являться детские дома, а набором атрибутов - их характеристики (в случае если у каждого объекта перечень доступных атрибутов различный, то итоговым набором будет являться объединение множеств атрибутов всех объектов). Находим [http://detskiedomiki.ru/?act=home_more&id=6278&z_id=3&part_id=65 страницу], содержащую наиболее полный перечень атрибутов (в данном случае факт полнотоы был определён путём сопоставления представленных атрибутов и [http://detskiedomiki.ru/UserFiles/Anketa%20detskogo%20uchrezhdeniya(2).doc анкеты детского учреждения]) и выписываем их: "Рег. номер", "Регион", "Район", "Тип учреждения", "Название", "Почтовый адрес" и т.д. (всего 34 атрибута). После того, как мы определились с перечнем атрибутов, отразим их в специальном классе. Для этого открываем файл ''items.py'' и описываем класс (название - произвольное):


<syntaxhighlight lang="python">
<syntaxhighlight lang="python">

Версия от 10:54, 2 января 2013

Эта страница является черновиком статьи.


Введение

Синтаксический анализ (парсинг) сайтов хоть и не имеет прямого отношения к пространственным данным, но владение основами которого полезно любому, работающему с ними. В свете роста числа онлайн-ресурсов, публикующих открытые данные, ценность умения извлекать из них необходимую информацию многократно повышается. Приведём небольшой пример. Допустим, нам необходимо составить набор тематических карт, отражающих результаты Выборов Президента Российской Федерации 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.

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

Модель представляет собой отдельный класс, содержащий перечень атрибутивных полей собираемых данных. Прежде чем описывать модель, необходимо определиться во-первых с объектом парсинга, а во-вторых с набором его атрибутов, которые мы хотим извлечь из целевого ресурса. Объектом парсинга в нашем случае будут являться детские дома, а набором атрибутов - их характеристики (в случае если у каждого объекта перечень доступных атрибутов различный, то итоговым набором будет являться объединение множеств атрибутов всех объектов). Находим страницу, содержащую наиболее полный перечень атрибутов (в данном случае факт полнотоы был определён путём сопоставления представленных атрибутов и анкеты детского учреждения) и выписываем их: "Рег. номер", "Регион", "Район", "Тип учреждения", "Название", "Почтовый адрес" и т.д. (всего 34 атрибута). После того, как мы определились с перечнем атрибутов, отразим их в специальном классе. Для этого открываем файл items.py и описываем класс (название - произвольное):

from scrapy.item import Item, Field

class OrphanageItem(Item):
    # define the fields for your item here like:
    # name = Field()
    id               = Field()
    region           = Field()
    district         = Field()
    type             = Field()
    name             = Field()
    post             = Field()
    phone            = Field()
    director         = Field()
    bank             = Field()
    parent           = Field()
    foundation       = Field()
    activities       = Field()
    history          = Field()
    staff            = Field()
    publications     = Field()
    children         = Field()
    age              = Field()
    orphans          = Field()
    deviated         = Field()
    principle        = Field()
    education        = Field()
    treatment        = Field()
    holidays         = Field()
    communication    = Field()
    buildings        = Field()
    vehicles         = Field()
    farming          = Field()
    working_cabinet  = Field()
    library          = Field()
    computers        = Field()
    toys             = Field()
    patronage        = Field()
    needs            = Field()
    volunteers       = Field()
    url              = Field()

Как можно увидеть представленный класс содержит записи вида имя атрибута = Field(), где в качестве имя атрибута рекомендуется использовать английский вариант названия соответствующего атрибута. Кроме того, в класс был добавлен ещё один атрибут url, который подразумевает хранение для объекта URL той страницы, из которой были извлечены данные.

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

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

Результат