31 дек. 2012 г.

Scrapy + MongoDB: Пишем парсер Amazon (part1)

Почти все люди сталкиваются с необходимостью сбора информации. Для спецов, работающих у WEB-сфере, такая задача ставиться очень часто.

Python + community предоставляют массу интересных решений для работы, среди которых можно найти и достаточно простые библиотеки и целые комбайны. Сегодня речь пойдет о гиганте, а именно Scrapy.

В статье нереально описать все возможности, да и не нужно это. Полная документация лежит на официальном сайте продукта.

Давайте разберем базовую работу, на примере парсера Amazon. Определим сразу основные задачи:

1) Заточить скрипт под Amazon.com;
2) Собирать по запросу Books: названия товаров, ссылки на них и текущие цены;
4) Сохранить результаты в MongoDB;


Проводим установку библиотеки с помощью PIP:
sudo pip install scrapy
Про другие варианты установки, вы можете прочитать в документации.
Кстати! Не устанавливайте пакет python-scrapy, с репозитория Ubuntu, он там очень устаревшей версии ...

Старт проекта на Scrapy - начинается с терминала и:
scrapy startproject ***
Давайте назовем наш проект amazon_spider.
scrapy startproject amazon_spider


Как видно на скриншоте. Создается проект, с файлами: __init__.py  items.py  pipelines.py settings.py и папкой spiders, в которой создаются классы пауков.

Переходим в файл items.py и смотрим... Этот файл идет как ORM. В нем описываются поля, для удобного переноса в базу данных.

Потому, исходя с поставленной задачи, мы изменяем созданный класс и прописываем там поля:
title = Field()
link = Field()
price = Field()



Теперь нам нужно создать класс паука. На этот момент, задача:

1) Перейти на поисковую страницу по запросу Books.
2) Получить все тайтлы товаров, урлы и цены книг в твердой обложке, с помощью XPath. Официальная документация по этой фиче. 
3) C помощью XPath, определить, есть ли следующая страница. Если да - переходим на нее и повторяем цикл. Нет - сворачиваем работу.


Ок. Взглянем на сайт:


Ссылки в классе "title" содержат анкор на товар и урл. Здесь зарыты, нужных нам два элемента.

 В табличном классе "toeOurPrice" - цена. Есть и сложность. Нас интересуют только цены, на книги в твердой обложке. Но, если товар имеет и электронную версию для Kindle, то цена будет тоже заключена в классе "toeOurPrice". Потому сбор инфы, по этому пункту, мы начнем с div-класса "tp", который включает в себя все цены и будем с него выдергивать только нужный "toeOurPrice", опускаясь по иерархии.

Ссылка в классе "pagnNEXT" ведут на следующую страницу. 


Давайте сразу опишем XPath выражения, для всех интересующих элементов:
Поиск Title: //a[@class="title"]/text()
Поиск URL: //a[@class="title"]/@href
Поиск цены: //div[@class="tp"]/table/tr[2]/td[3]/a/text()
Ссылка на следующую страницу: //a[@class="pagnNext"]

Продолжение во второй части.

Комментариев нет:

Отправить комментарий