темный логотип proxyscrape

Введение в веб-парсинг на Python с помощью Parsel

Python, Янв-03-20255 минут чтения

Веб-анализ стал необходимым навыком для разработчиков на Python, специалистов по анализу данных и энтузиастов веб-анализа. Независимо от того, извлекаете ли вы данные для анализа, создаете инструмент сравнения цен или автоматизируете извлечение контента, веб-парсинг лежит в основе каждой из этих задач. Но что делает веб-парсинг одновременно эффективным и удобным для новичков? Parsel -мощная библиотека на Python, которая упрощает парсинг HTML и извлечение данных.

Введение в Parsel

Что такое веб-парсинг и почему он важен?

Parsel - это легкая библиотека Python, предназначенная для парсинга HTML/XML и извлечения данных. Созданная с учетом требований веб-скрапинга, Parsel позволяет легко взаимодействовать со структурами веб-страниц, используя мощные селекторы, такие как XPath и CSS. Эти инструменты позволяют точно находить и извлекать из веб-страниц определенные элементы или атрибуты. Интеграция Parsel с экосистемой Python также означает, что он легко работает с такими библиотеками, как `requests` и `httpx` для получения веб-контента.

Ключевые особенности Parsel

  • Поддержка селекторов: Используйте XPath для детальной навигации по путям или селекторы CSS для упрощения синтаксиса.
  • Гибкость: Поддерживает множество задач по разбору HTML/XML, от простого извлечения текста до работы с глубоко вложенными элементами.
  • Масштабируемость: Parsel может извлекать данные из одной или нескольких страниц с помощью циклических структур.
  • Интеграция со Scrapy: Совместимость Parsel естественным образом распространяется на Scrapy, популярный фреймворк для веб-скрапинга.

Общие случаи использования

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

Понимание селекторов и парсинга HTML

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

Разбор HTML - это процесс разбиения HTML-документа на структурные компоненты, такие как теги, атрибуты и объектная модель документа (DOM). Parsel использует эту структуру для точного поиска и извлечения нужных данных.

Документы HTML создаются с помощью:

  • Теги: Определите тип элемента (например., <h1>, <p>, <img>).
  • Атрибуты: Предоставьте дополнительную информацию об элементе (например, id, класс, href).
  • DOM: Иерархическое представление веб-страницы, обеспечивающее навигацию между элементами.

Что такое селекторы?

Селекторы XPath и CSS - это языки запросов, используемые для выбора элементов в HTML-документе:

  • XPath: Мощный и многофункциональный XPath позволяет выбирать узлы на основе их пути в DOM, отношений "родитель-ребенок" и условий.
  • Селекторы CSS: Более простой синтаксис, часто используемый во фронтенд-разработке, идеально подходит для выбора элементов на основе классов, идентификаторов или псевдоселекторов.

Подробнее о селекторах читайте здесь.

Пререквизиты

Прежде чем приступить к работе с Parsel, убедитесь в следующем:

  • Python установлен: Загрузите и установите Python с сайта
  • Установите необходимые библиотеки(parsel, requests): 
pip install parsel requests

Методы парселя для разбора HTML

Извлечение элементов по идентификатору и классу

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

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

Ниже приведен пример его HTML-структуры:

Из этого элемента мы будем извлекать:

  • Название книги
  • Цена книги
  • Статус доступности

Пример кода на языке Python

импортировать запросы
from parsel import Selector

# Получение веб-страницы
url = "https://books.toscrape.com/"
response = requests.get(url)
selector = Selector(response.text)

# Выберите первый продукт по классу
product = selector.css("article.product_pod").get()

# Разбор деталей выбранного продукта
product_selector = Selector(text=product)
title = product_selector.css("h3 a::attr(title)").get()
цена = product_selector.css("p.price_color::text").get()
наличие = product_selector.css("p.instock.availability::text").get().strip()

print("Название:", title)
print("Цена:", цена)
print("Наличие:", availability)

Объяснение сценария:

  • Получите веб-страницу: Сценарий отправляет сообщение ПОЛУЧИТЬ запрос к сайту-примеру, чтобы получить его HTML-содержимое.
  • Выберите блок продуктов: Он использует селектор CSS article.product_pod чтобы выбрать первую запись книги на странице.
  • Разберите информацию о продукте: Сценарий извлекает название, цена, и наличие нацеливаясь на определенные HTML-теги и атрибуты внутри подставка для продуктов блок.
  • Отображение результатов: Извлеченные данные выводятся на консоль в удобочитаемом формате.

Пример вывода

Название: A Light in the Attic
Цена: £51.77
Доступность: В наличии

Извлечение текста из элементов

Parsel позволяет легко извлекать текст из элементов HTML, будь то заголовок, описание или другое видимое содержимое веб-страницы.

Чтобы продемонстрировать это, мы используем тот же пример веб-сайта снова. Мы сосредоточимся на извлечении текста заголовка одной книги с помощью h3 тег, вложенный в элемент article с классом подставка для продуктов.

Ниже приведен пример его HTML-структуры:

Из этого элемента мы будем извлекать:

  • Заглавный текст книги

Пример кода на языке Python

импортировать запросы
from parsel import Selector

# Получение веб-страницы
url = "https://books.toscrape.com/"
response = requests.get(url)
selector = Selector(response.text)

# Выберите первый продукт по классу
product = selector.css("article.product_pod").get()

# Разберите текст заголовка выбранного продукта
product_selector = Selector(text=product)

title_text = product_selector.css("h3 a::attr(title)").get()
print("Текст заголовка:", title_text)

Объяснение сценария:

  • Получите веб-страницу: Сценарий отправляет сообщение ПОЛУЧИТЬ запрос для получения HTML-контента с сайта.
  • Выберите блок продуктов: Статья.подставка для продуктов CSS-селектор нацелен на первую запись в книге.
  • Извлеките текст заголовка: Использование h3 a::attr(title)Скрипт извлекает атрибут title из файла <a> тег, вложенный в <h3> тег.
  • Отобразите результат: Извлеченный заголовок выводится на консоль.

Пример вывода

Заголовок Текст: Свет на чердаке

Извлечение атрибутов (например, `href`, `src`, `alt`)

Parsel также позволяет извлекать значения атрибутов, таких как href, src или alt, из элементов HTML. Эти атрибуты часто содержат ценные данные, такие как URL, источники изображений или описательный текст.

Мы сосредоточимся на извлечении ссылки (href) на страницу с подробным описанием книги из <a> тег внутри статья элемент с классом подставка для продуктов.

Ниже приведен пример его HTML-структуры:

Из этого элемента мы будем извлекать:

  • Ссылка (href) на страницу с подробным описанием книги

Пример кода на языке Python

импортировать запросы
from parsel import Selector

# Получение веб-страницы
url = "https://books.toscrape.com/"
response = requests.get(url)
selector = Selector(response.text)

# Выберите первый продукт по классу
product = selector.css("article.product_pod").get()

# Разберите атрибут 'href' выбранного продукта
product_selector = Selector(text=product)
book_link = product_selector.css("h3 a::attr(href)").get()

print("Ссылка на книгу:", book_link)

Объяснение сценария:

  • Получение веб-страницы: Скрипт отправляет GET-запрос, чтобы получить HTML-содержимое сайта.
  • Выберите блок продукта: CSS-селектор article.product_pod нацелен на первую запись книги.
  • Извлеките атрибут href: Используя h3 a::attr(href), скрипт извлекает значение href из тега, вложенного в тег.
  • Выведите результат: Извлеченный URL-адрес выводится на консоль.

Пример вывода

Ссылка на книгу: catalog/a-light-in-the-attic_1000/index.html

Извлечение списков элементов

Parsel упрощает извлечение нескольких элементов с веб-страницы с помощью селекторов CSS или XPath. Это особенно полезно при работе со списками, такими как названия товаров, ссылки или цены.

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

Ниже приведен пример соответствующей структуры HTML:

Из этих элементов мы будем извлекать:

  • Названия всех книг, отображаемых на главной странице сайта

Пример кода на языке Python

импортировать запросы
from parsel import Selector

# Получение веб-страницы
url = "https://books.toscrape.com/"
response = requests.get(url)
selector = Selector(response.text)

# Выберите все названия книг
book_titles = selector.css("article.product_pod h3 a::attr(title)").getall()

# Выведите каждое название
for title in book_titles:
   print("Заголовок:", title)

Объяснение сценария:

  • Получите веб-страницу: Сценарий отправляет сообщение ПОЛУЧИТЬ запрос для получения HTML-контента с сайта.
  • Выберите все названия: Использование CSS селектор article.product_pod h3 a::attr(title), он выбирает все <a> метки внутри <h3> метки внутри подставка для продуктов элементы.
  • Названия отрывков: Сайт .getall() Метод извлекает список всех подходящих названий.
  • Отображение результатов: Каждое название в списке печатается поочередно.

Пример вывода

Название: Свет на чердаке
Название: Tipping the Velvet
Название: Soumission
Название: Острые предметы

Навигация по вложенным элементам

Parsel обеспечивает эффективную навигацию по сложным, вложенным структурам HTML с помощью селекторов CSS и XPath. Это особенно ценно при извлечении данных, погребенных глубоко внутри многочисленных слоев HTML-тегов.

Мы будем извлекать цену книги изнутри подставка для продуктов элемент.

Ниже приведен пример соответствующей структуры HTML:

Из этой вложенной структуры мы извлечем:

  • Цена первой книги

Пример кода на языке Python

импортировать запросы
from parsel import Selector

# Получение веб-страницы
url = "https://books.toscrape.com/"
response = requests.get(url)
selector = Selector(response.text)

# Выберите первый продукт по классу
product = selector.css("article.product_pod").get()

# Разбор вложенного элемента цены
product_selector = Selector(text=product)
цена = product_selector.css("div.product_price p.price_color::text").get()

print("Цена:", price)

Объяснение сценария:

  • Получение веб-страницы: Сценарий получает HTML-содержимое веб-страницы с помощью запросов.
  • Выберите первый блок продуктов: Он нацеливается на первый тег статьи с классом подставка для продуктов.
  • Перейдите к вложенному элементу цены: Использование CSS селектор div.product_price p.price_colorон переходит в div и выбирает p тег, содержащий цену.
  • Извлеките текст цены: Сайт .get() метод извлекает значение цены.
  • Отобразите результат: Печатается извлеченная цена.

Пример вывода

Цена: £51.77

Разбор таблиц и списков

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

В качестве примера мы снова поработаем с тем же пример веб-сайта. Наша цель - извлечь список названий книг вместе с их ценами. В частности, мы будем ориентироваться на <ol> тег, который содержит несколько <li> элементов, каждый из которых представляет отдельную книгу.

Ниже приведен пример соответствующей структуры HTML:

Из этой структуры мы извлечем:

  • Название каждой книги
  • Цена каждой книги

Пример кода на языке Python

import requests
from parsel import Selector

# Fetch the webpage
url = "https://books.toscrape.com/"
response = requests.get(url)
selector = Selector(response.text)

# Select all book items in the list
books = selector.css("ol.row li.article")

# Loop through each book and extract title and price
for book in books:
    title = book.css("h3 a::attr(title)").get()
    price = book.css("p.price_color::text").get()
    print(f"Title: {title} | Price: {price}")

Объяснение сценария:

  • Получение веб-страницы: Скрипт отправляет GET-запрос, чтобы получить HTML-содержимое с сайта.
  • Выберите все элементы книги: Селектор ол.ряд li.article все цели <li> элементы внутри упорядоченного списка (<ol>), которые представляют отдельные элементы книги.
  • Извлеките название и цену: h3 a::attr(title) извлекает атрибут title из <a> метка. --- p.price_color::text извлекает текст цены из <p> тег.
  • Отобразите результаты: Сценарий выводит название и цену каждой книги.

Пример вывода

Название: A Свет в на Чердак | Цена: £51.77
Название: Tipping на Velvet | Цена: £53.74
Название: Soumission | Цена: £50.10
Название: Sharp Sharp Objects | Цена: £47.82
...

Заключение

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

Вот краткий обзор того, о чем мы рассказали:

  • Извлечение элементов по идентификатору и классу: Нацеливание на конкретные элементы HTML с помощью селекторов CSS.
  • Извлечение текста и атрибутов: Узнайте, как извлекать из элементов текстовое содержимое и атрибуты, такие как href и src.
  • Работа с вложенными элементами: Изучите, как ориентироваться в отношениях "родитель-ребенок" в структурах HTML.
  • Разбор списков: Извлечение структурированных данных из повторяющихся шаблонов, таких как таблицы или списки товаров.

Следующие шаги:

  • Экспериментируйте с различными веб-страницами и сложными HTML-структурами с помощью Parsel.
  • Изучите возможность интеграции с другими библиотеками, такими как Scrapy, для крупномасштабных проектов веб-скрапинга.
  • Следуйте лучшим практикам этичного скраппинга, например, соблюдайте файлы robots.txt и не перегружайте серверы.

Parsel - мощный инструмент в наборе инструментов для веб-скреппинга, и его освоение откроет бесчисленные возможности для сбора и анализа данных.

Счастливого разбора!