Вебскрапінг із Parsel у Python

Вебскрапінг із Parsel у Python: гайд 2026 року

У цій статті я проведу вас через основи використання Parsel, від вебскрапінгу простих даних до розв’язання складніших сценаріїв, як-от пагінація. Незалежно від того, чи ви тільки починаєте, чи хочете вдосконалити свої навички, цей посібник вам допоможе. Давайте зануримося й почнемо вебскрапінг!

Розумніша альтернатива вебскрапінгу з Parsel

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

Ось список моїх 5 найкращих API для вебскрапінгу:

  1. Bright Data: Потужний вебскрапінг на базі проксі для складних завдань.
  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 дає змогу витягувати дані, використовуючи обидва XPath і CSS-селектори. Це два різні способи ідентифікації елементів на вебсторінці, і наявність обох варіантів робить Parsel дуже універсальним.
  2. Data Extraction: Parsel дає змогу витягувати різні типи даних, як-от текстовий вміст, атрибути (наприклад, href або src) і навіть вкладені елементи.
  3. Chaining Selectors: Parsel дає змогу послідовно поєднувати селектори, щоб уточнювати процес вилучення даних і точно націлюватися саме на потрібні дані.
  4. Scalability: Незалежно від того, чи ви скрапите невеликий блог, чи величезну базу даних, Parsel ефективно справляється з усім, що робить його придатним для проєктів будь-якого масштабу.
  5. Інтеграція з Scrapy: Якщо ви працюєте з Scrapy фреймворк, Parsel уже інтегрований у нього, тож ви можете скористатися можливостями Scrapy, використовуючи Parsel для парсингу.

Як використовувати Parsel у Python для вебскрапінгу: покроковий посібник

Перш ніж почати скрапінг, переконайтеся, що ваше середовище готове до роботи з Parsel. Нижче наведені кроки, які потрібно виконати, щоб налаштувати Parsel для вебскрапінгу:

Prerequisites

  1. Python: Переконайтеся, що у вас є Python 3.10.1 або пізнішої версії, встановленої у вашій системі.
  2. Virtual Environment: Це хороша практика — працювати у віртуальному середовищі, щоб ізолювати залежності.

Щоб створити та активувати віртуальне середовище, виконайте такі команди:

python -m venv venv

For Windows:

venvScriptsactivate

Для macOS і Linux:

source 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.

import requests
from parsel import 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: Витягніть дані з кожного рядка

Кожен рядок у таблиці містить кілька стовпців даних. Наприклад, назва команди міститься в елементі з класом .name, а кількість перемог — у класі .wins. Ось як можна витягти дані:

data = []
for row in 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": name.strip(),
"year": year.strip(),
"wins": wins.strip(),
"losses": losses.strip(),
"pct": pct.strip(),
})
print(data)

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:

from urllib.parse import 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) for link in page_links]
return full_urls

Ця функція отримує посилання пагінації та повертає список повних URL-адрес для кожної сторінки. Після цього ви можете по черзі виконувати вебскрапінг кожної сторінки.

page_urls = get_all_page_urls()
data = []
for url in page_urls:
page_data = scrape_page(url) # Call the scraping function for each page
data.extend(page_data)
print(data)

Крок 5: Об’єднайте все

Тепер давайте зберемо все разом. Ось повний скрипт, який збирає дані з кількох сторінок:

import requests
from parsel import Selector
from urllib.parse import urljoin
def scrape_page(url):
response = requests.get(url)
selector = Selector(text=response.text)
data = []
rows = selector.css("table.table tr.team")
for row in 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": name.strip(),
"year": year.strip(),
"wins": wins.strip(),
"losses": losses.strip(),
"pct": pct.strip(),
})
return 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) for link in page_links]
return full_urls
# Scrape all pages
page_urls = get_all_page_urls()
data = []
for url in page_urls:
page_data = scrape_page(url)
data.extend(page_data)
print(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.

Conclusion

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

Пам’ятайте, що вебскрапінг слід завжди виконувати етично. Перед вебскрапінгом сайту перевірте його умови використання, щоб переконатися, що ви не порушуєте жодних правил чи законів. Відповідальний вебскрапінг допомагає вашим проєктам працювати стабільно й законно, тож завжди зважайте на ці рекомендації під час витягування даних.

Схожі записи