31 дек. 2012 г.

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

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

Переходим в созданный вначале проект, далее в папку spiders и создадим там файл amazon_spider_books.py

Кстати, небольшое уточнение. Если мы назовем нашего паука, как и проект, то будут трудности, при импорте класса items. Нужны разные названия...


Итак:

# -*- coding: utf-8 -*-
# amazon_spider_books.py

from scrapy.contrib.spiders import Rule, CrawlSpider
from scrapy.selector import HtmlXPathSelector
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor

from amazon_spider.items import AmazonSpiderItem

class Amazon_Spider_Books(CrawlSpider):
    name = 'amazon_spider_books'
    allowed_domains = ['amazon.com']
    query = 'Books'
    
    start_urls = ['http://www.amazon.com/s/ref=nb_sb_noss?url=search-alias%3Daps&field-keywords=' + query]

    rules = [Rule
                 (
                 SgmlLinkExtractor(restrict_xpaths=('//a[@class="pagnNext"]')),
                 callback = 'parse_products',
                 follow = True,
                 )
             ]


    def parse_products(self, response):
        hxs = HtmlXPathSelector(response)
        item = AmazonSpiderItem()
        
        item['title'] = hxs.select('//a[@class="title"]/text()').extract()
        item['link'] = hxs.select('//a[@class="title"]/@href').extract()
        item['price'] = hxs.select('//div[@class="tp"]/table/tr[2]/td[3]/a/text()').extract()

        return item



Паук запускается с терминала. Переходим в рабочую папки и пишем:
scrapy crawl amazon_spider_books
Заметьте, amazon_spider_books - это название, которое указано в скрипте:
name = 'amazon_spider_books' 
И Scrapy, при запуске, ориентируется на этом параметре.

Логика работы скрипта - проста:

1) Паук переходит на поисковую страницу.
2) Полученный ответ передается на анализ методу parse_products.
3) Объект rules производит поиск следующей страницы и переходит.
4) Если ссылок на следующую страницу нету - работа завершается.

Давайте разберем, что мы написали ... 

С разных модулей, мы наследуем: CrawlSpider, Rule,  HtmlXPathSelector, SgmlLinkExtractor, AmazonSpiderItem.

CrawlSpider - основной класс нашего паука. Его поведение мы и настраиваем.

Rule - объект, в котором описывается перемещение внутри сайта. По сути, он впитывает в себя все доступные ссылки, полученные с обработчика. Задается функция, которая будет обрабатывать эти ссылки. И дополнительный параметр follow, который по умолчанию True.

SgmlLinkExtractor - обработчик ссылок для Rule. В нем мы задаем маску, для получения ссылок. Или Allow для нахождения линков, через регулярные выражения. Или, как в нашем случае, restrict_xpaths - для поиска через пути XPath. В нашем примере мы задействуем последний вариант, к тому же можно передавать целые списки XPath выражения, для более гибкого поиска.

HtmlXPathSelector - помогает нам выбирать данные с ответа, посредством XPath, выражения которого мы уже составили ранее, в первой части мануала(ссылка вначале статьи).

AmazonSpiderItem - это тот класс, который мы изменяли тоже в первой части мануала(см. начало статьи). Когда создавали в нем поля: title, link, price.

Созданный класс Amazon_Spider_Books - наследует импортированный CrawlSpider.

После этого мы даем название пауку в Name - amazon_spider_books, чтобы Scrapy мог идентифицировать его.

В списке allowed_domains указывается диапазон доменов, за который нельзя выходить. Рамки выставлены только на домен amazon.com

Query - внутренняя переменная, с интересующим запросом Books.

Далее идет список, с УРЛами, с которых начинается работа. Начальный урл я взял просто перейдя браузером, по нужному кейворду.

В Rules мы наследуем описанный выше класс RuleRules может в себя включать несколько классов Rule, для гибкой работы. Передаем все параметры в списке.

Смотрим на сам Rule. В него входит настроенный обработчик ссылок SgmlLinkExtractor. В первой части мануала, мы определили XPath(в первой части мануала), для поиска следующей страницы. Этот XPath, мы вбиваем в restrict_xpaths. В callback указываем созданный нами метод parse_products и просто, для наглядной работы, добавляем активный параметр follow.

Переходим к нашему методу parse_products.

Наследуем в hxs класс HtmlXPathSelector. Чтобы получить его функционал, для разбора страницы.

В item наследуем созданную нами - модель ORM. 

Теперь у нас есть словарь item, в который, с помощью класса hxs и XPath выражений мы можем спокойно забивать найденными элементами.

Метод Select - для выбора нужного элемента.
Метод Extract - для выдергивания содержимого.

И на выходе добавляем return item чтобы в консоли видеть результат работы.

Паук работает автономно. Rules будет сам находить следующие ссылки и опять запускать parse_products. Когда следующая страница не будет найдена - скрипт прекратит работу.

К сожалению, убедится в этом вы можете только сами, так как там 50 млн. товаров и сбор данных будет очень долгий...

Все данные мы будем сохранять в базу MongoDB. 

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

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