Веб-скрейпинг с Parsel на Python

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

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

Более умная альтернатива веб-скрейпингу с Parsel

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

Вот список моих 5 лучших API для скрейпинга:

  1. Яркие данные: Мощный скрейпинг с использованием прокси для сложных задач.
  2. ScraperAPI: Доступная многоязычная поддержка для сайтов без защиты.
  3. Oxylabs: Высококачественные прокси, парсинг данных на основе ИИ.
  4. ScrapingBee: Справляется со сложными сайтами благодаря решению CAPTCHA.
  5. Apify: Простая в использовании платформа с готовыми скрейперами.

Я не связан ни с одним из вышеперечисленных поставщиков.

Что такое Parsel?

Parsel — это Python-библиотека для разбора и извлечения данных из документов HTML, XML и JSON. Она основана на библиотеке lxml, которая предоставляет более продвинутый набор инструментов для работы с XML- и HTML-контентом. При этом Parsel предлагает более простой и удобный интерфейс, что делает её отличным выбором для задач веб-скрейпинга.

С Parsel вы можете легко извлекать данные из HTML-документов с помощью XPath или CSS-селекторов, что делает его гибким и подходящим для различных задач веб-скрейпинга. Он также интегрирован во фреймворк Scrapy, популярный инструмент для масштабных проектов веб-скрейпинга.

Зачем использовать Parsel для веб-скрейпинга?

Есть несколько причин, по которым Parsel выделяется как отличный инструмент для веб-скрейпинга:

  1. XPath и CSS-селекторыParsel позволяет извлекать данные с помощью как CSS-селекторов, так и XPath-выражений. XPath и CSS-селекторы. Это два разных способа находить элементы на веб-странице, и наличие обоих вариантов делает Parsel очень универсальным.
  2. Data ExtractionParsel позволяет извлекать различные типы данных: текстовое содержимое, атрибуты (например, href или src) и даже вложенные элементы.
  3. Chaining Selectors: Parsel позволяет связывать селекторы в цепочки, чтобы точнее настраивать процесс извлечения данных и получать именно те данные, которые вам нужны.
  4. Масштабируемость: Независимо от того, извлекаете ли вы данные с небольшого блога или огромной базы данных, Parsel эффективно справляется со всем, что делает его подходящим для проектов любого масштаба.
  5. Интеграция с Scrapy: Если вы работаете с Scrapy В этот фреймворк Parsel уже встроен, поэтому вы можете воспользоваться возможностями Scrapy и одновременно использовать Parsel для парсинга.

Как использовать Parsel в Python для веб-скрейпинга: пошаговое руководство

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

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

  1. Python: Убедитесь, что у вас есть Python 3.10.1 или более позднюю версию, установленную в вашей системе.
  2. Virtual Environment: Хорошая практика — работать в виртуальном окружении, чтобы изолировать зависимости.

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

python -m venv venv

For Windows:

venvScriptsactivate

Для macOS и Linux:

источник venv/bin/activate

Installing Dependencies

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

pip install parsel requests
  • Parsel: Это основная библиотека для парсинга HTML.
  • RequestsПростая HTTP-библиотека, которая позволяет отправлять запросы для получения HTML-контента со страниц. Я также советую изучить, как ею пользоваться Использование прокси с requests.

Веб-скрейпинг с Parsel: пошаговое руководство

Let’s dive into the scraping process with Parsel. In this example, we’ll scrape a simple table from a website. We’ll guide you through the steps from defining the URL to extracting data and handling pagination.

Шаг 1: Определите целевой URL и разберите содержимое

Начните с импорта необходимых библиотек: requests для выполнения HTTP-запросов и parsel для разбора HTML.

импорт requests
с сайта parsel импорт Selector
url = "https://www.example.com"
response = requests.get(url)
selector = Selector(text=response.text)

The above code defines the URL you want to scrape, retrieves the page content with requests.get(), and parses the content using Parsel’s Selector().

Шаг 2: Извлечение данных из таблицы

Предположим, целевая веб-страница содержит таблицу с данными, например список спортивных команд. После изучения HTML вы обнаруживаете, что таблица имеет класс `.table`, а строки отмечены классом `.team`.

Чтобы выбрать все строки таблицы, используйте CSS-селектор:

rows = selector.css("table.table tr.team")

Это выберет все строки в таблице с классом team. Теперь вы можете пройтись по этим строкам в цикле и извлечь нужные данные.

Шаг 3: Извлеките данные из каждой строки

Каждая строка таблицы содержит несколько столбцов данных. Например, название команды находится в элементе a с классом .name, а число побед — в классе .wins. Вот как можно извлечь эти данные:

data = []
для row в rows:
name = row.css("td.name::text").get()
year = row.css("td.year::text").get()
wins = row.css("td.wins::text").get()
losses = row.css("td.losses::text").get()
pct = row.css("td.pct::text").get()
data.append({
"имя": name.strip(),
"year": year.strip(),
"wins": wins.strip(),
"losses": losses.strip(),
"pct": pct.strip(),
})
печать(данные)

Here, .css(“td.name::text”).get() extracts the text content from the td element with the name class. .strip() is used to remove leading and trailing whitespace.

Шаг 4: Обработка пагинации

If the website has multiple pages of data, you’ll need to handle pagination. Pagination links are usually contained in a ul.pagination element. You can scrape all the page URLs using the following function:

с сайта urllib.parse импорт urljoin
def get_all_page_urls(base_url="https://www.example.com"):
response = requests.get(base_url)
selector = Selector(text=response.text)
page_links = selector.css("ul.pagination li a::attr(href)").getall()
full_urls = [urljoin(base_url, link) для link в page_links]
возврат full_urls

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

page_urls = get_all_page_urls()
data = []
для url в page_urls:
page_data = scrape_page(url) # Call the scraping function for each page
data.extend(page_data)
печать(данные)

Шаг 5: Собираем всё вместе

Теперь сведем всё воедино. Вот полный скрипт, который извлекает данные с нескольких страниц:

импорт requests
с сайта parsel импорт Selector
с сайта urllib.parse импорт urljoin
def scrape_page(url):
response = requests.get(url)
selector = Selector(text=response.text)
data = []
rows = selector.css("table.table tr.team")
для row в rows:
name = row.css("td.name::text").get()
year = row.css("td.year::text").get()
wins = row.css("td.wins::text").get()
losses = row.css("td.losses::text").get()
pct = row.css("td.pct::text").get()
data.append({
"имя": name.strip(),
"year": year.strip(),
"wins": wins.strip(),
"losses": losses.strip(),
"pct": pct.strip(),
})
возврат data
def get_all_page_urls(base_url="https://www.example.com"):
response = requests.get(base_url)
selector = Selector(text=response.text)
page_links = selector.css("ul.pagination li a::attr(href)").getall()
full_urls = [urljoin(base_url, link) для link в page_links]
возврат full_urls
# Scrape all pages
page_urls = get_all_page_urls()
data = []
для url в page_urls:
page_data = scrape_page(url)
data.extend(page_data)
печать(данные)

Продвинутые сценарии веб-скрейпинга

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

1. Выбор элементов по тексту

Иногда нужно извлекать элементы по их текстовому содержимому. Например, можно найти все абзацы, содержащие слово “test”. Это можно сделать с помощью XPath:

test_paragraphs = selector.xpath("//p[contains(text(), 'test')]/text()").getall()

Это выберет все абзацы, в тексте которых встречается слово «test».

2. Using Regular Expressions

Parsel также поддерживает использование регулярных выражений для фильтрации данных. Например, можно использовать `re:test()`, чтобы извлекать только те элементы, которые соответствуют определенному шаблону, например номерам телефонов или адресам электронной почты.

emails = selector.xpath("//p[re:test(text(), '[a-zA-Z0–9._% -] @[a-zA-Z0–9.-] \.[a-zA-Z]{2,}')]/text()").getall()

Это извлекает абзацы, содержащие адреса электронной почты.

3. Навигация по HTML-дереву

С помощью XPath можно перемещаться по дереву HTML и выбирать родительские или соседние элементы. Например, чтобы получить родительский элемент:

parent_of_p = selector.xpath(“//p/parent::*”).get()

Это выберет родительский элемент тега p.

Заключение

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

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

Похожие записи