CoderCastrov logo
CoderCastrov
Питон

ПАРСИНГ С ПОМОЩЬЮ SCRAPY

ПАРСИНГ С ПОМОЩЬЮ SCRAPY
просмотров
6 мин чтение
#Питон

Что такое парсинг?

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

Зачем нам нужен парсинг?

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

Инструменты для парсинга

Для выполнения парсинга необходимо предварительно подготовить несколько шагов, таких как установка. Вот шаги установки, которые нужно выполнить.

Установка

  • Установите Python 3, в первом шаге необходимо установить Python 3, используя документацию здесь.
  • Установите Miniconda или Anaconda, Miniconda или Anaconda - это инструменты, которые помогают организовать установленные пакеты/библиотеки, что облегчает создание скриптов на Python. Еще одним преимуществом Miniconda или Anaconda является то, что они позволяют установить окружение, чтобы ваш проект не конфликтовал с другими проектами, которые используют другую версию Python.
conda create -n scraping-env python=3.5
conda activate scraping-env
  • Установите Scrapy, после установки Miniconda или Anaconda вы можете установить Scrapy, используя следующую команду:
conda install -c conda-forge scrapy

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

https://m.prodia.co.id/id/ProdukLayanan/PemeriksaanLaboratorium/14

На этом сайте мы будем извлекать данные из списка в алфавитном порядке. Когда вы нажимаете на один из элементов списка, мы извлекаем описание и преимущества, а также изображение, как показано ниже:

После того, как мы определили целевые данные, мы можем приступить к созданию проекта парсинга данных с использованием Scrapy.

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

scrapy startproject product

После выполнения этой команды автоматически создается папка и файлы, как показано ниже:

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

scrapy genspider description m.prodia.co.id

Это автоматически создаст файл description.py в папке spiders, как показано ниже:

Когда вы просматриваете файл description.py, вы видите, что он содержит код по умолчанию, как показано ниже:

Здесь мы должны настроить start_urls на URL, который мы хотим спарсить. Измените его на следующий образом:

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

Чтобы войти в функцию shell, мы можем выполнить следующую команду:

scrapy shell 'https://m.prodia.co.id/id/ProdukLayanan/PemeriksaanLaboratorium/14'

После выполнения этой команды откроется оболочка в терминале, как показано ниже:

Здесь Scrapy уже обошел HTML-элементы на основе этой ссылки:

https://m.prodia.co.id/id/ProdukLayanan/PemeriksaanLaboratorium/14

Теперь мы можем использовать селекторы в этой оболочке, используя функцию response.xpath(). Также есть функция response.css(), но я предпочитаю использовать xpath, потому что она более простая и понятная.

Прежде чем мы введем селектор xpath, давайте сначала посмотрим на HTML-элементы на этой странице с помощью инструмента "Исследовать элемент" в браузере:

Видно, что внутри тега div с идентификатором pilih-alfabet есть еще один div с классом alfabet-title. Мы можем предположить, какой селектор мы можем использовать для извлечения алфавита.

Мы можем использовать следующий xpath-селектор:

.//div[@id="pilih-alfabet"]/div/text()
  • .// - этот символ означает, что мы ищем корневой элемент HTML.
  • div[@id=”pilih-alfabet”]/div/text() - этот символ означает, что мы выбираем div с идентификатором "pilih-alfabet" и имеющий дочерний div, а затем извлекаем текстовое значение из этого div.

После того, как мы нашли xpath, мы можем ввести его в оболочку Scrapy, как показано ниже:

Здесь мы получили все алфавиты на этой ссылке. Теперь мы должны получить ссылки из этого списка.

Чтобы получить описание и преимущества, которые находятся внутри этих ссылок, прежде чем создавать селектор, давайте сначала посмотрим на HTML-элементы:

Здесь видно, что внутри div с идентификатором pilih-alfabet есть дочерний ul и li, а внутри li есть дочерний a href, который мы можем извлечь. Затем мы можем объединить эту ссылку с базовым URL и выполнить запрос к этой ссылке, чтобы получить доступ к HTML-элементам на следующей странице и извлечь описание и преимущества.

Используя селектор, мы можем получить ссылку из этого списка:

.//div[@id=”pilih-alfabet”]/ul[@class=”alfabet-item”][0]/li/a/@href
  • .// - этот символ означает, что мы ищем корневой элемент HTML.
  • div[@id=”pilih-alfabet”]/ul[@class=”alfabet-item”][0]/li/a/href - этот символ означает, что мы выбираем div с идентификатором "pilih-alfabet", имеющий дочерний ul с классом "alfabet-item", затем берем первый элемент ul и выбираем его дочерний li и a, а затем извлекаем значение href. Таким образом, мы получаем нужную ссылку.

После того, как мы получили селектор xpath, давайте попробуем его в оболочке Scrapy:

Здесь мы получили ссылку, и теперь мы можем объединить эту ссылку с базовым URL, чтобы выполнить запрос.

После получения ссылки нам также нужно создать селекторы для извлечения описания и преимуществ из ссылки, которую мы получили ранее.

Для тестирования мы можем взять образец, используя эту ссылку:

https://m.prodia.co.id/id/produklayanan/pemeriksaanlaboratoriumdetails/17oh-kortikosteroid-urin-24-jam

и ввести его в оболочку с помощью следующей команды:

scrapy shell ‘https://m.prodia.co.id/id/produklayanan/pemeriksaanlaboratoriumdetails/17oh-kortikosteroid-urin-24-jam'

После выполнения этой команды мы можем создать селекторы для извлечения заголовка, описания и преимуществ. Прежде чем создавать селекторы, давайте сначала посмотрим на HTML-элементы, чтобы получить заголовок, описание и преимущества:

Мы видим, что заголовок находится в теге h2, описание находится в теге p, а преимущества находятся в теге p. Мы можем легко создать селекторы для этого.

Заголовок

Селектор, который мы будем использовать, выглядит следующим образом:

response.xpath(‘.//h2/text()’).extract()[0]

это извлечет значение из тега h2 с индексом 0.

Описание

Селектор, который мы будем использовать, выглядит следующим образом:

response.xpath(‘.//p/text()’).extract()[0]

это извлечет значение из тега p с индексом 0.

Преимущества

Селектор, который мы будем использовать, выглядит следующим образом:

response.xpath(‘.//p/text()’).extract()[1]

это извлечет значение из тега p с индексом 1.

Когда мы вводим их в оболочку, результат будет следующим:

И это соответствует нашим ожиданиям. Затем мы вставим эти данные в скрипт Python, чтобы он мог выполняться автоматически.

Сначала мы создадим цикл for для селектора алфавита, который мы создали ранее, и получим данные из ссылки, которую мы выбрали ранее. После получения ссылки не забудьте выполнить запрос к этой ссылке внутри цикла for, чтобы все ссылки могли быть успешно запрошены. Для этого кода:

Здесь мы выполняем запрос, и после выполнения запроса мы должны добавить обратный вызов (callback), чтобы запрос мог быть правильно обработан. Затем мы создадим функцию с именем parseTitleDesc для извлечения заголовка, описания и преимуществ. Код для этого выглядит следующим образом:

Для всего кода это будет выглядеть так:

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

scrapy crawl description -o result.csv

Опция -o означает, что результат будет сохранен в файле CSV. Вы также можете выбрать другой формат вывода, такой как jl, marshal, jsonlines, json, xml, csv, pickle. После выполнения этой команды будет создан файл, как показано ниже:

Когда вы открываете файл CSV с помощью Excel, результат будет выглядеть так:

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

Консолидация

Используя scrapy, мы можем легко и быстро выполнять парсинг данных, что делает эту библиотеку очень эффективной в использовании времени. Кроме того, scrapy поддерживает несколько функций, таких как оболочка, которая позволяет нам непосредственно проверять созданные селекторы и генерировать различные типы файлов. Вот почему scrapy становится основным инструментом для парсинга данных.

Исходный код

GitHub - zahidin/scrapping-scrapy

В этом проекте используется python 3.5. Если ваша версия python отличается, я рекомендую использовать miniconda / anaconda для создания среды с...

github.com