CoderCastrov logo
CoderCastrov
Парсер

Парсинг веб-сайтов с помощью Scrapy в Python (88/100 Дней Python)

Парсинг веб-сайтов с помощью Scrapy в Python (88/100 Дней Python)
просмотров
4 мин чтение
#Парсер
Day 88 of the “100 Days of Python” blog post series covering web scraping with Scrapy

Парсинг веб-сайтов - это процесс извлечения данных с веб-сайтов. Он может использоваться для различных целей, включая data mining, исследования и анализ. Scrapy - мощный и гибкий фреймворк для парсинга веб-сайтов, написанный на Python.

Установка Scrapy

Сначала вам нужно установить Scrapy. Вы можете сделать это с помощью pip, менеджера пакетов Python. Откройте командную строку или терминал и выполните следующую команду:

pip install scrapy

Создание проекта Scrapy

После установки Scrapy вы можете создать новый проект Scrapy. Чтобы создать новый проект, выполните следующую команду в командной строке или терминале:

scrapy startproject myproject

Это создаст новый каталог под названием myproject, который содержит основную структуру проекта Scrapy.

Создание паука

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

cd myproject
scrapy genspider myspider example.com

Это создаст нового паука с именем myspider, который настроен на обход веб-сайта example.com. Вы можете изменить код паука, чтобы определить, как извлекать данные из веб-сайта.

Определение правил для паука

В коде паука необходимо определить правила для парсинга веб-сайта. Для этого можно использовать методы start_urls и parse. Метод start_urls определяет начальные URL-адреса для парсинга, а метод parse определяет, как извлекать данные с веб-сайта:

import scrapy


class MyspiderSpider(scrapy.Spider):
    name = 'myspider'
    start_urls = ['https://example.com']

    def parse(self, response, **kwargs):
        title = response.css('title::text').extract_first()
        yield {'title': title}

Запуск паука

После определения правил для паука можно запустить его с помощью следующей команды:

scrapy crawl myspider

Это запустит паука и начнет парсинг веб-сайта. Извлеченные данные будут выведены в консоль.

Сохранение данных

Если вы хотите сохранить извлеченные данные в файл, вы можете использовать встроенный экспортер Scrapy. Для этого добавьте следующие строки в файл settings.py:

FEED_FORMAT = 'json'
FEED_URI = 'data.json'

Это сохранит извлеченные данные в файл с именем data.json.

Расширенный парсинг

Scrapy предлагает множество расширенных функций для парсинга веб-страниц, включая поддержку cookies, user agents и прокси. Вы также можете использовать Scrapy с другими библиотеками Python, такими как BeautifulSoup и Pandas, для дальнейшей обработки и анализа извлеченных данных.

Парсинг quotes.toscrape.com с помощью Scrapy

Мы можем извлекать информацию с веб-страницы на основе ее HTML. В качестве примера давайте рассмотрим Quotes to Scrape, на котором есть много цитат разных людей вместе с некоторыми атрибутами. Это отличная страница, на которой мы можем попрактиковаться в парсинге. Если вы перейдете к исходному коду страницы, вы можете найти ее HTML и все определенные в нем атрибуты. Вы можете сделать это, щелкнув правой кнопкой мыши на содержимом страницы и нажав кнопку Просмотреть исходный код страницы.

После открытия исходного кода страницы вы можете заметить, что все цитаты находятся внутри элемента <div>, который имеет атрибут class="quote". Таким образом, мы можем перебрать все цитаты, используя scrapy.

Таким образом, паук будет выглядеть примерно так:

import scrapy


class MyspiderSpider(scrapy.Spider):
    name = 'myspider'
    start_urls = ['https://quotes.toscrape.com']

    def parse(self, response, **kwargs):
        for book in response.css('.quote'):
            yield {
                'text': book.css('.text::text').extract_first(),
                'author': book.css('.author::text').extract_first(),
            }

Он извлекает все элементы div с классом .quote, а затем возвращает другие поля, извлекая их из HTML и превращая их в значения словаря.

В этом примере мы извлекли текст цитаты и автора цитаты. Если вы посмотрите на приведенный выше HTML, автор всегда определяется внутри <span>, который имеет атрибут класса author, а сама цитата находится внутри <span>, который имеет атрибут класса text. Суффикс ::text добавляется, чтобы убедиться, что мы извлекаем фактический текст внутри <span>, а не сам <span>.

После запуска кода с помощью scrapy crawl myspider вы получите красивый JSONL со всем содержимым страницы:

[
{"text": "“The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.”", "author": "Albert Einstein"},
{"text": "“It is our choices, Harry, that show what we truly are, far more than our abilities.”", "author": "J.K. Rowling"},
{"text": "“There are only two ways to live your life. One is as though nothing is a miracle. The other is as though everything is a miracle.”", "author": "Albert Einstein"},
{"text": "“The person, be it gentleman or lady, who has not pleasure in a good novel, must be intolerably stupid.”", "author": "Jane Austen"},
{"text": "“Imperfection is beauty, madness is genius and it's better to be absolutely ridiculous than absolutely boring.”", "author": "Marilyn Monroe"},
{"text": "“Try not to become a man of success. Rather become a man of value.”", "author": "Albert Einstein"},
{"text": "“It is better to be hated for what you are than to be loved for what you are not.”", "author": "André Gide"},
{"text": "“I have not failed. I've just found 10,000 ways that won't work.”", "author": "Thomas A. Edison"},
{"text": "“A woman is like a tea bag; you never know how strong it is until it's in hot water.”", "author": "Eleanor Roosevelt"},
{"text": "“A day without sunshine is like, you know, night.”", "author": "Steve Martin"}
]

Что дальше?