Опанування пагінації у вебскрапінгу

Опановуємо пагінацію у вебскрапінгу: повний посібник

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

Автоматизовані рішення для роботи з пагінацією

Ці 3 сервіси допоможуть вам на кожному етапі скрапінгу пагінації, чи то лише проксі, чи повністю автоматизований API:

  1. Bright Data — Best overall for advanced scraping; features extensive proxy management and reliable APIs.
  2. Octoparse — Зручний no-code інструмент для автоматизованого вилучення даних із вебсайтів.
  3. ScrapingBee — API, орієнтований на розробників, який ефективно працює з проксі, браузерами та CAPTCHA.

Я не пов’язаний із жодною з них.

Що таке пагінація?

Сайти на кшталт e-commerce платформ, job boards і соціальних мереж використовують пагінацію для роботи з великими обсягами даних. Якщо показувати все на одній сторінці, це сповільнить завантаження і спричинить надмірне споживання пам’яті. Пагінація розбиває вміст на кілька сторінок, що полегшує його опрацювання. Вона також додає просту навігацію, наприклад кнопки «Next», номери сторінок або автоматичне прокручування. Це робить перегляд швидким і добре структурованим. Пагінація допомагає користувачам швидко знаходити потрібне, не перевантажуючи систему.

Типи пагінації

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

  1. Numbered Pagination: Цей метод дає змогу користувачам переходити між окремими сторінками за допомогою пронумерованих посилань. Користувачі натискають на числа, щоб переглядати різні набори вмісту.
  2. Click-to-Load Pagination: У цьому підході користувачі натискають кнопку, наприклад «Load More», щоб показати додатковий вміст. Це дає змогу більш контрольовано завантажувати дані.
  3. Infinite Scrolling: За нескінченного прокручування вміст автоматично завантажується, коли користувачі прокручують сторінку вниз. Це створює плавний досвід перегляду без потреби переходити між сторінками.

Numbered Pagination

Numbered pagination uses discrete page links, typically displayed at the bottom of a website, to allow users to jump directly from one page to another. This method is one of the easiest to scrape, as the URL often changes incrementally (e.g., /page=2, /page=3), making it straightforward for iterating through pages programmatically.

Щоб збирати дані з вебсайтів із нумерованою пагінацією, нам потрібно:

  • Визначте базову URL-адресу та шаблон URL.
  • Збільшуйте параметр page у циклі, доки не буде досягнуто останньої сторінки.

Приклад із використанням BeautifulSoup у Python:

import requests
from bs4 import BeautifulSoup
base_url = "https://example.com/items?page="
page_num = 1
while True:
response = requests.get(base_url + str(page_num))
if response.status_code != 200:
break
soup = BeautifulSoup(response.text, 'html.parser')
# Extract the data you need from soup object here
print(f"Scraping page {page_num}…")
# If no next page link or last page is reached, exit loop
if not soup.find('a', {'class': 'next-page'}):
break
page_num += 1

In the above code, the scraper continues to increment the page_num variable and scrape each page until no further “next” page button is found.

Challenges:

  • На деяких вебсайтах номери сторінок можуть бути динамічними або для завантаження вмісту може використовуватися JavaScript.
  • Not all numbered pagination will be visible in the URL; sometimes, an AJAX call is involved, requiring deeper inspection.

Click-to-Load Pagination

Пагінація за кліком для завантаження, яку часто реалізують як кнопку “Load More”, динамічно підвантажує новий вміст на тій самій сторінці. Для цього вебскрапер має багаторазово імітувати подію кліку, щоб завантажити весь доступний вміст.

Опрацювання пагінації Click-to-Load за допомогою Selenium:

Оскільки пагінація з завантаженням по кліку зазвичай потребує JavaScript, ефективно використовувати такі інструменти, як Selenium або Playwright. Ці інструменти дають змогу взаємодіяти з елементами сторінки та завантажувати потрібний контент.

Приклад із використанням Selenium:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time
driver = webdriver.Chrome()
driver.get("https://example.com/items")
while True:
try:
load_more_button = driver.find_element(By.XPATH, "//button[text()='Load More']")
load_more_button.click()
time.sleep(2) # Give time for content to load
except:
break
# After loading all items, scrape the data
items = driver.find_elements(By.CLASS_NAME, "item")
for item in items:
print(item.text)
driver.quit()

In the example above, the find_element method is used to locate the “Load More” button, and click() is called to load more content until the button no longer appears.

Challenges:

  • Потребує взаємодії з JavaScript.
  • Багаторазові кліки можуть спровокувати обмеження частоти запитів або CAPTCHA.

Infinite Scrolling

Нескінченне прокручування автоматично підвантажує більше контенту, коли користувач прокручує сторінку вниз, усуваючи потребу в кнопках пагінації. Хоча це зручно для користувачів, воно ускладнює вебскрапінг через залежність від JavaScript і динамічно завантажуваного контенту.

Робота з нескінченною прокруткою в Playwright:

Playwright, який підтримує автоматизацію в браузерах на базі Chromium, може обробляти нескінченне прокручування. Ця техніка полягає в імітації дій прокручування користувача доти, доки новий контент перестає завантажуватися.

Приклад із використанням Playwright:

import asyncio
from playwright.async_api import async_playwright
async def scroll_to_bottom(page):
while True:
previous_height = await page.evaluate("document.body.scrollHeight")
await page.evaluate("window.scrollTo(0, document.body.scrollHeight)")
await asyncio.sleep(2)
new_height = await page.evaluate("document.body.scrollHeight")
if new_height == previous_height:
break
async def scrape_infinite_scroll(url):
async with async_playwright() as p:
browser = await p.chromium.launch()
page = await browser.new_page()
await page.goto(url)
await scroll_to_bottom(page)
# Extract data after fully loading the page
content = await page.content()
print(вміст)
await browser.close()
asyncio.run(scrape_infinite_scroll("https://example.com/items"))

Код прокручує сторінку вниз, доки новий контент перестає завантажуватися, забезпечуючи, що всі елементи видно на сторінці для вебскрапінгу.

Challenges:

  • Визначити, коли слід припинити прокручування, не завжди просто.
  • Деякі вебсайти застосовують такі механізми, як lazy-loading, де зображення не завантажуються, доки не стають видимими у вікні перегляду.

Виклики пагінації

Під час роботи з вмістом із пагінацією треба враховувати кілька ризиків. Один із суттєвих викликів — ризик блокування з боку вебсайтів. Деякі сайти можуть заблокувати доступ уже після однієї сторінки. Наприклад, під час спроби зібрати дані з сайту електронної комерції на кшталт Amazon ви можете зіткнутися з перешкодами, такими як CAPTCHA.

Amazon CAPTCHA Challenge

Let’s make a request to the Amazon homepage and see what happens.

import requests
url = "https://www.amazon.com/"
response = requests.get(url)
print(f"Status code: {response.status_code}")

У цьому випадку ви можете отримати HTTP-код 403.

Цей статус означає, що Amazon визначив ваш запит як такий, що надходить від бота або вебскрапера, і через це з'являється CAPTCHA-перевірка. Якщо ви й далі надсилатимете багато запитів, вашу IP-адресу можуть заблокувати негайно.

Щоб подолати ці блокування та ефективно зібрати потрібні дані, можна використовувати проксі з Python Requests. Ця техніка допомагає уникати блокування IP-адрес. Крім того, можна імітувати реальний браузер, змінюючи User Agent. Водночас важливо зазначити, що ці методи не гарантують успіху проти просунутих систем виявлення ботів.

Conclusion

Опрацювання пагінації є критично важливим для збирання повних даних із сайтів, що подають контент порціями. Тут я розглянув основні типи пагінації: нумеровану, завантаження за кліком і нескінченне прокручування. Також я пояснив, як керувати ними за допомогою таких інструментів, як BeautifulSoup, Selenium і Playwright.

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

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

Схожі записи