CoderCastrov logo
CoderCastrov
Парсер

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

Парсинг веб-страниц на Python с использованием Scrapy
просмотров
4 мин чтение
#Парсер

Данные являются неотъемлемой частью любого приложения для iOS, Android или веб-сайта. С учетом взрывного роста профессий Data Scientist, Data Analyst, Data Engineer и т. д., данные становятся еще более важными. Так как получить эти данные? Конечно, когда вы сталкиваетесь с какой-либо проблемой, вы всегда обращаетесь к поисковой системе. И эти поисковые системы всегда приводят вас к веб-страницам с большим количеством плотных данных, которые нельзя скопировать вручную и сохранить в файл Excel. Это пустая трата времени. Начните обращать внимание на термин "парсинг данных". Парсинг данных - это полезное занятие, которое позволяет вам оптимизировать время поиска данных. Действительно, вам просто нужно написать небольшой код, отправить запросы на веб-сайты и ждать результатов.

Возможно, вы не знаете, но уже существует множество приложений для парсинга данных: Google Scraping Tool, JSOUP, BeautifulSoup, ... Сегодня я расскажу вам о Scrapy. Scrapy известен как бесплатный и открытый фреймворк для сбора данных с веб-страниц, написанный на Python. Он также может извлекать данные через API.

Как установить scrapy?

Scrapy работает на Python версии 2.7 или выше 3.4.

Прежде всего, рекомендуется использовать виртуальное окружение, созданное с помощью Virtualenv или Anaconda, чтобы избежать конфликтов версий пакетов Python при работе с проектом Scrapy.

Используйте следующую команду для установки scrapy: pip install scrapy

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

Используйте следующую команду для создания проекта scrapy: scrapy startproject имя_вашего_проекта

Как работает процесс парсинга данных?

Перейдем к первому парсингу данных

Прежде чем приступить к парсингу данных, нужно понять, что такое Spiders в Scrapy. Spiders - это классы, которые определяют, как веб-страницы будут парситься и как извлекаться структура данных. Другими словами, Spiders - это место, где вы определяете пользовательские задачи для парсинга и анализа любой веб-страницы.

В папке имя_проекта/spiders создайте произвольный файл .py:

**import **scrapy**class **ExampleSpider1(scrapy.Spider):
    name = **'examplespider1'    **allowed_domains = [**'www.familug.org'**]
    start_urls = [**'https://www.familug.org/search/label/Python'**,
                  **'https://www.familug.org/search/label/Command'**]

    **def **parse(self, response):
        self.logger.info(**'A response from {} just arrived'**.format(response.url))
        self.logger.debug(**'Nothing wrong in {}'**.format(response.url))

Вышеуказанный код создает паука для парсинга данных с веб-страниц, перечисленных в start_urls. Я объясню атрибуты scrapy.Spider.

**name: **имя вашего паука. Вы можете выбрать любое имя, но оно не должно совпадать с именем другого паука, чтобы избежать конфликтов.**allowed_domains: **список доменных имен веб-сайтов, с которых вы хотите парсить данные.**start_urls: **список URL-адресов, с которых вы хотите парсить данные.**parse: **важный и основной метод паука scrapy для анализа ответов, полученных от веб-страниц. Кроме того, обратите внимание, что сам scrapy.Spider предоставляет полезный метод logger в Python. Метод logger поможет вам создать структуру системы регистрации https://docs.python.org/3/library/logging.html

Как запустить паука?

Вернитесь в папку вашего проекта и откройте терминал.

Просто используйте следующую команду: scrapy crawl examplespider1

Парсинг данных и сохранение данных

Вы уже знаете основы работы простого паука :) Теперь давайте немного углубимся. Предположим, мы хотим написать код для парсинга данных на веб-сайте и сохранения их в файл json. Как это сделать? Добавьте следующий код под кодом вашего первого паука:

class ExampleSpider2(scrapy.Spider):
    name = 'examplespider2'
    allowed_domains = ['www.familug.org']
    start_urls = ['https://www.familug.org/search/label/Python',
                  'https://www.familug.org/search/label/Command']

    def parse(self, response):
        for title in response.css('h3.post-title.entry-title a::text').getall():
            self.logger.info('Welcome ' + title)
            yield {'title': title}

        for href in response.css('h3.post-title.entry-title a::attr(href)').getall():
            yield scrapy.Request(href, self.parse)

Помимо атрибутов и методов, похожих на паука examplespider1, examplespider2 имеет небольшое отличие в методе parse. response.css: это простой и удобный метод для анализа ответов, полученных от веб-сайта. Но как он работает? Просто. Возьмите приведенный выше пример. Он будет искать html-код веб-страницы с тегом h3, классом 'post-title entry-title' и следующим тегом a с содержимым в виде текста. Как же узнать, как выглядит этот html-код, чтобы мы могли искать нужное содержимое? Важная часть парсинга данных - зайти на сам веб-сайт, нажать ctrl+U, чтобы посмотреть html-код. Искать нужное содержимое. И лучше всего, если вы также просмотрите html-код связанных ссылок на этом веб-сайте, чтобы увидеть структуру html-кода. yield: это знакомый метод в Python. Он будет полезен, если вы хотите возвращать значения по одному и контролировать их. Кроме того, yield поможет избежать прерывания кода при возникновении ошибки. Как я уже упоминал выше, мы ищем связанные ссылки на другие веб-страницы внутри этого веб-сайта. Зачем? Цель парсинга данных - найти как можно больше данных со всех веб-страниц и использовать их по назначению. response.css('h3.post-title.entry-title a::attr(href)'): ищет связанные ссылки на следующие веб-страницы, также известные как пагинация. Затем отправляет запросы для следующих веб-страниц. И так далее, метод parse продолжает работу с ними.

Хранение данных в файле JSON

Просто запустите следующий код в терминале: scrapy crawl examplespider2 -o data.json

Обратите внимание, что файл data.json появится в папке вашего проекта. Félicitations!

Вот и все.