Продолжение первой части.
Кстати, небольшое уточнение. Если мы назовем нашего паука, как и проект, то будут трудности, при импорте класса items. Нужны разные названия...
Логика работы скрипта - проста:
Переходим в созданный вначале проект, далее в папку 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.
Созданный класс Amazon_Spider_Books - наследует импортированный CrawlSpider.
После этого мы даем название пауку в Name - amazon_spider_books, чтобы Scrapy мог идентифицировать его.
В списке allowed_domains указывается диапазон доменов, за который нельзя выходить. Рамки выставлены только на домен amazon.com
Query - внутренняя переменная, с интересующим запросом Books.
Далее идет список, с УРЛами, с которых начинается работа. Начальный урл я взял просто перейдя браузером, по нужному кейворду.
В Rules мы наследуем описанный выше класс Rule. Rules может в себя включать несколько классов 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.
Комментариев нет:
Отправить комментарий