Краткий обзор Scrapy

Scrapy (/ˈskreɪpaɪ/) — это прикладная среда для сканирования веб-сайтов и извлечения структурированных данных, которая может использоваться для широкого спектра полезных приложений, таких как интеллектуальный анализ данных, обработка информации или историческое архивирование.

Несмотря на то, что Scrapy изначально был разработан для парсинга веб-страниц, его также можно использовать для извлечения данных с помощью API-интерфейсов (например, Веб-сервисы Amazon Associates) или в качестве веб-сканера общего назначения.

Пошаговая демонстрация паука-примера

Чтобы показать вам, что предлагает Scrapy, мы рассмотрим пример Scrapy Spider, использующий простейший способ запуска паука.

Вот код паука, который извлекает известные цитаты с веб-сайта http://quotes.toscrape.com после разбивки на страницы:

import scrapy


class QuotesSpider(scrapy.Spider):
    name = 'quotes'
    start_urls = [
        'http://quotes.toscrape.com/tag/humor/',
    ]

    def parse(self, response):
        for quote in response.css('div.quote'):
            yield {
                'author': quote.xpath('span/small/text()').get(),
                'text': quote.css('span.text::text').get(),
            }

        next_page = response.css('li.next a::attr("href")').get()
        if next_page is not None:
            yield response.follow(next_page, self.parse)

Поместите этот код в текстовый файл, назовите его quotes_spider.py и запустите паука с помощью команды runspider:

scrapy runspider quotes_spider.py -o quotes.jl

Когда код завершит руботу, у вас будет в файле quotes.jl список цитат в формате JSON Lines, содержащий текст и автора, примерно так:

{"author": "Jane Austen", "text": "\u201cThe person, be it gentleman or lady, who has not pleasure in a good novel, must be intolerably stupid.\u201d"}
{"author": "Steve Martin", "text": "\u201cA day without sunshine is like, you know, night.\u201d"}
{"author": "Garrison Keillor", "text": "\u201cAnyone who thinks sitting in church can make you a Christian must also think that sitting in a garage can make you a car.\u201d"}
...

Что только что произошло?

Когда вы запускали команду scrapy runspider quotes_spider.py, Scrapy искал внутри себя определение Spider и запускал его через свой движок поискового робота.

Сканирование началось с выполнения запросов к URL-адресам, определённым в атрибуте start_urls (в данном случае только URL-адрес для цитат в категории humor), и вызова метода обратного вызова по умолчанию parse, передав объект ответа в качестве аргумента. В обратном вызове parse мы циклически перебираем элементы цитаты с помощью CSS-селектора, получаем Python dict с извлеченным текстом цитаты и автором, ищем ссылку на следующую страницу и планируем другой запрос, используя тот же метод parse, что и обратный вызов.

Здесь вы заметили одно из главных преимуществ Scrapy: запросы планируются и обрабатываются асинхронно. Это означает, что Scrapy не нужно ждать, пока запрос будет завершён и обработан, он может отправить другой запрос или выполнить другие действия тем временем. Это также означает, что другие запросы могут продолжать выполняться, даже если какой-то запрос не удался или произошла ошибка при его обработке.

Хотя это позволяет вам выполнять очень быстрое сканирование (одновременная отправка нескольких одновременных запросов отказоустойчивым способом), Scrapy также предоставляет вам контроль над вежливостью сканирования через некоторые настройки. Вы можете делать такие вещи, как установка задержки загрузки между каждым запросом, ограничение количества одновременных запросов на домен или на IP, и даже с помощью авто-задержки расширения, который пытается вычислить это автоматически.

Примечание

Здесь используется экспорт фидов для создания файла JSON, вы можете легко изменить формат экспорта (например, XML или CSV) или серверную часть хранилища (например, FTP или Amazon S3). Вы также можете написать конвейер элементов для хранения элементов в базе данных.

Что ещё?

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

  • Встроенная поддержка данных выбор и извлечение из источников HTML/XML с использованием расширенных селекторов CSS и выражений XPath с вспомогательными методами для извлечения с использованием регулярных выражений.

  • Интерактивная консоль-оболочка (с поддержкой IPython) для опробования выражений CSS и XPath для сканирования данных, очень полезен при написании или отладке ваших пауков.

  • Встроенная поддержка генерация экспорта фидов в нескольких форматах (JSON, CSV, XML) и их хранение в нескольких бэкэндах (FTP, S3, локальная файловая система)

  • Надёжная поддержка кодирования и автоопределение для работы с иностранными, нестандартными и некорректными кодировками.

  • Сильная поддержка расширяемости, позволяющий подключать собственные функции с помощью сигналов и чётко определённого API (промежуточное ПО, расширений и конвейеров).

  • Широкий спектр встроенных расширений и промежуточного программного обеспечения для обработки:

    • cookie и обработка сеансов

    • Функции HTTP, такие как сжатие, аутентификация, кеширование

    • подмена пользовательского агента

    • robots.txt

    • ограничение глубины обхода

    • и больше

  • Telnet консоль для подключения к консоли Python, запущенной внутри вашего процесса Scrapy, для самоанализа и отладки вашего паука

  • Плюс другие полезности, такие как многоразовые пауки для сканирования сайтов из Sitemaps.xml и каналов XML/CSV, конвейер мультимедиа для автоматическая загрузка изображений (или любого другого носителя), связанный с сканированными элементами, кэширующий преобразователь DNS и многое другое!

Что дальше?

Следующие шаги для вас — это установка Scrapy, пройти обучение, чтобы узнать, как создать полномасштабный проект Scrapy и присоединиться к сообществу. Спасибо за ваш интерес!