CoderCastrov logo
CoderCastrov
Извлечение данных

Как сделать парсинг веб-страниц быстрым и точным с помощью Scrapy?

Как сделать парсинг веб-страниц быстрым и точным с помощью Scrapy?
просмотров
4 мин чтение
#Извлечение данных

Обзор

Когда речь идет о сборе данных, парсинг веб-страниц играет важную роль в получении большого объема и разнообразия данных из интернета. Для энтузиастов науки о данных количество доступных данных через Веб похоже на воду в океане. Например, если вы собираетесь купить какой-то продукт через интернет-платформу, как было бы здорово, если бы вы смогли спарсить сайты электронной коммерции и получить отзывы о том же продукте от покупателей! Возможности использования бесконечны.

К моменту завершения этой статьи вы узнаете, как делать парсинг с использованием фреймворка Scrapy и будете парсить несколько веб-сайтов - приступим к статье!

Обзор Scrapy

Scrapy - это фреймворк для парсинга веб-страниц на основе Python, используемый для извлечения необходимых данных с веб-сайтов. Это быстрый, простой и расширяемый способ получения данных.

Начало работы с Scrapy

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

$ python
Python 3.10.2 (tags/v3.10.2:a58ebcc, Jan 17 2022, 14:12:15)
Type "help", "copyright", "credits" or "license" for more information.
>>>

При успешной установке вы получите информацию о текущей версии Python. Здесь у меня установлена версия 3.10.2 на моей локальной системе.

Теперь с помощью следующей команды вы можете установить фреймворк Scrapy на вашей локальной системе.

$ pip install scrapy

Создание первого проекта парсинга

Давайте создадим новый проект парсинга, выполнив следующую команду.

$ scrapy startproject ИмяПроекта

В моем случае, я использую имя паука "ПервыйПарсер", что будет выглядеть примерно так:

$ scrapy startproject ПервыйПарсер

Это создаст папку "ПервыйПарсер" со следующей структурой:

На данный момент два файла являются важными:

  • settings.py : Настройки вашего проекта.
  • spiders/ : Папка, где хранятся все созданные пауки. В момент, когда вы запускаете парсер, Scrapy будет искать его в этой папке.

Создание первого паука в Scrapy

В Scrapy, в основном, паук представляет собой файл на языке Python, в котором содержатся все скрипты для парсинга.

Прежде всего, давайте перейдем в директорию FirstScraper и создадим наш первый паук.

С помощью команды "genspider" в командной строке можно автоматически создать паук.

Она принимает два аргумента: первый - это имя вашего паука, а второй - URL веб-сайта.

$ scrapy genspider QuotesScraper https://quotes.toscrape.com/

Это создаст новый файл паука "QuotesScraper.py" в папке spiders/ со следующим базовым шаблоном:

import scrapy


class QuotesScraperSpider(scrapy.Spider):
    name = "QuotesScraper"
    allowed_domains = ["quotes.toscrape.com"]
    start_urls = ["http://quotes.toscrape.com/"]

    def parse(self, response):
        pass

Что следует отметить здесь:

  • name: Имя паука, в нашем случае это "QuotesScraper".
  • allowed_domains: Список URL-адресов, которые должны быть доступны только для нашего паука.
  • parse(self, response): При успешном парсинге вызывается эта функция, и с помощью объекта response мы можем извлечь все данные, которые нам нужны с веб-страницы по заданному URL-адресу.

Парсинг веб-сайта с использованием Scrapy

Вот веб-сайт Quotes to Scrape, обычно используемый для изучения парсинга. И мы собираемся его спарсить.

С данного сайта я хочу спарсить все цитаты и имена их авторов. Для этого я создал следующий XPath в функции parse.XPath: XPath - это просто адрес определенного элемента HTML.

import scrapy


class QuotesScraperSpider(scrapy.Spider):
    name = "QuotesScraper"
    allowed_domains = ["quotes.toscrape.com"]
    start_urls = ["http://quotes.toscrape.com/"]

    def parse(self, response):
        quotes = response.xpath("/html/body/div/div[2]/div[1]/div/span[1]/text()").extract()
        authors = response.xpath("/html/body/div/div[2]/div[1]/div/span[2]/small/text()").extract()
        
        for quote, author in zip(quotes, authors):
            quote_detail = {
                "quote": quote,
                "written by": author
            }
            
            yield quote_detail

Теперь, выполнив следующую команду, мы можем начать процесс парсинга:

$ scrapy crawl QuotesScraper

Здесь я указал имя моего паука "QuotesScraper". В вашем случае оно будет отличаться. Теперь в нашем терминале мы можем увидеть все спарсенные цитаты с именами авторов.

Теперь пришло время узнать, чем Scrapy отличается от других инструментов для парсинга веб-сайтов. В Scrapy с помощью одной команды можно извлечь все спарсенные данные в формате json, xml и csv. Например, если мы хотим получить те же спарсенные данные в формате csv, нам просто нужно выполнить следующую команду.

$ scrapy crawl SpiderName -O FileName.Format(csv,xml,json)

В моем случае я хочу получить все данные в формате csv. Поэтому команда будет выглядеть примерно так.

$ scrapy crawl QuotesScraper ScrapedQuotes.csv

В результате у меня появился файл с названием "ScrapedQuotes.csv" в текущей директории моего проекта Scrapy, который выглядит примерно так.

Помимо этого, Scrapy предоставляет множество других функций, таких как переход по другим ссылкам, вход в систему с использованием csrf (межсайтовой подделки запросов), обход ограничений с помощью user-agent и прокси-серверов, несоблюдение правил robots.txt и т. д., которые все можно изучить в документации Scrapy.

Заключение

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