Пагінація в Python Requests для вебскрапінгу кількох сторінок
У цій статті я покажу вам, як обробляти пагінацію та збирати дані з кількох сторінок крок за кроком, щоб ви могли отримати повний набір даних, який вам потрібен.
Що таке вебскрапінг?
Вебскрапінг — це процес вилучення даних із вебсайтів. Python пропонує такі бібліотеки, як requests для надсилання HTTP-запитів і доступу до вебсторінок та BeautifulSoup для розбору HTML і витягання потрібного вмісту. Хоча скрапити прості сайти легко, багато сучасних сайтів використовують пагінацію, щоб розподіляти контент між різними сторінками. Якщо не знати, як працювати з пагінацією, можна скрапити дані лише з однієї сторінки й пропустити решту.
Чому пагінація важлива?
Під час вебскрапінгу сайти часто розбивають інформацію на кілька сторінок, щоб не завантажувати весь контент одразу, адже це може уповільнити роботу сторінки. Наприклад, сайт електронної комерції може показувати тисячі товарів, кожен на своїй сторінці. Пагінація дає користувачам змогу переходити між різними сторінками, щоб переглядати більше товарів. Для вебскрапінгу це означає, що для збирання всіх товарів вам потрібно буде проходити по кожній сторінці окремо й витягувати дані.
Розумніший спосіб обробки пагінації 🚀🧠
Хоча Python’s requests library is great for scraping simple paginated websites, it struggles when pages load content dynamically using JavaScript, infinite scroll, or “Load More” buttons. That’s where Scraping Browser ось тут і стане в пригоді! 🖥️✨
Scraping Browser поводиться як справжній браузер — він завантажує JavaScript, прокручує сторінку, натискає елементи та переходить між сторінками так само, як це робить людина. Це робить його ідеальним для роботи зі складними сценаріями пагінації, які requests сам не впорається. До того ж, він оптимізований для масштабного вебскрапінгу, із вбудованим керуванням проксі та контролем сесій. 🌍🔄
Якщо ви займаєтеся вебскрапінгом сучасних сайтів і вам потрібен надійніший спосіб роботи з пагінацією, використання browser для вебскрапінгу може заощадити вам багато часу та нервів.
Різні типи пагінації
Перед тим як почати скрапінг, важливо зрозуміти типи пагінації, які зазвичай трапляються на вебсайтах:
- Класична пагінація з номерами сторінок: This is the most common form of pagination. The URL usually includes the page number (e.g., page=2 or /page/2/). The website will display a set number of items per page, and the user can click on the page number to navigate to the next set of results.
- Next Page Button: Деякі сайти використовують кнопку «Next», щоб перейти на наступну сторінку. URL сторінки залишається тим самим, але сайт змінює вміст залежно від номера сторінки.
- Infinite ScrollЦей підхід використовують на вебсайтах, де вміст завантажується під час прокручування вниз. Він динамічно підвантажує новий контент без зміни сторінки чи URL.
- Load More Button: Сайти, що використовують кнопку «Показати ще», дають користувачам змогу натиснути кнопку, щоб завантажити додатковий контент, а не переходити на нову сторінку.
Налаштування Python для вебскрапінгу
Перед тим як занурюватися у вебскрапінг, переконаймося, що в нас налаштовані потрібні інструменти:
Install Required Libraries: Спочатку нам потрібно встановити дві бібліотеки: requests і beautifulsoup4. Ви можете встановити їх за допомогою таких команд:
pip install requests
pip install beautifulsoup4
Import Libraries: Після встановлення ми можемо імпортувати їх у наш скрипт. requests відповідатиме за виконання HTTP-запитів до вебсайту, а BeautifulSoup розбиратиме HTML і дасть нам змогу витягувати окремі елементи.
import requests
from bs4 import BeautifulSoup
Збирання даних з кількох сторінок
Тепер пройдемося по вебскрапінгу сайту з кількома сторінками пагінації. У цьому прикладі припустімо, що ми скрапимо вигаданий сайт електронної комерції, який перелічує товари на кількох сторінках. Ми отримаємо назви товарів і ціни.
Крок 1: Огляд вебсайту
Перш ніж писати будь-який код, потрібно зрозуміти структуру вебсайту. Відкрийте сайт у браузері, клацніть правою кнопкою миші на сторінці та виберіть «Inspect», щоб переглянути HTML-структуру. Знайдіть розділ, у якому містяться списки товарів і елементи пагінації (наприклад, номери сторінок або кнопку переходу на наступну сторінку).
Зазвичай ви знайдете посилання пагінації всередині HTML
-
- or
<nav class="pagination">
<a href="page/1">1</a>
<a href="page/2">2</a>
<a href="page/3">3</a>
<a href="next" class="next">Next</a>
</nav>
У цьому випадку ми можемо використати посилання «Next», щоб перейти на наступну сторінку, а номери сторінок можна використати, щоб визначити загальну кількість сторінок.
Крок 2: Вебскрапінг першої сторінки
Let’s start by scraping the first page. We will write a function that requests the website, parses the HTML, and extracts the product names and prices.
def scrape_page(url):
response = requests.get(url)
if response.status_code != 200:
print(f"Не вдалося отримати сторінку: {response.status_code}")
return
soup = BeautifulSoup(response.text, 'html.parser')
product_cards = soup.find_all('div', class_='product-card')
for product in product_cards:
name = product.find('h2', class_='product-title').text
price = product.find('span', class_='price').text
print(f"Name: {name}, Ціна: {price}")
У цьому коді ми надсилаємо запит до сторінки, перевіряємо, чи запит був успішним, і розбираємо вміст за допомогою BeautifulSoup. Потім знаходимо всі картки товарів і витягуємо назву та ціну товару.
Крок 3: Обробка пагінації
Тепер, коли ми можемо вебскрапити першу сторінку, нам потрібно обробити пагінацію. Вебсайти з посиланням на сторінку “Next” зазвичай містять URL для наступної сторінки. Ми можемо змінити нашу функцію так, щоб вона переходила за посиланням “Next” і вебскрапила наступну сторінку. Додаймо логіку для цього.
def scrape_all_pages(start_url):
url = start_url
while url:
print(f"Scraping page: {url}")
scrape_page(url)
# Get the next page URL
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
next_page = soup.find('a', class_='next')
if next_page:
url = next_page.get('href')
else:
print("Більше сторінок для вебскрапінгу немає.")
break
У цій функції ми починаємо вебскрапінг із заданої URL-адреси. Після збирання вмісту перевіряємо, чи є посилання «Next». Якщо воно існує, переходимо за ним, щоб зібрати дані з наступної сторінки. Цикл триває, доки не залишиться більше сторінок для вебскрапінгу.
Крок 4: Вебскрапінг усіх сторінок
Тепер, коли в нас є функція для вебскрапінгу всіх сторінок, ми можемо викликати її, передавши початковий URL першої сторінки. Ось як запустити вебскрапер:
start_url = 'https://example.com/products'
scrape_all_pages(start_url)
Це запустить вебскрапінг із першої сторінки й продовжуватиме його, доки не буде зібрано дані з усіх сторінок.
Advanced Pagination Techniques
Зміна номерів сторінок у URL
Some websites use page numbers directly in the URL (e.g., https://example.com/products?page=2). У таких випадках ми можемо просто пройтися сторінками, змінюючи номер сторінки в URL. Ось як це зробити:
def scrape_by_page_number(start_url, total_pages):
for page in range(1, total_pages 1):
url = f"{start_url}?page={page}"
print(f"Scraping page: {url}")
scrape_page(url)
У цій функції ми проходимо через задану кількість сторінок і формуємо URL-адресу для кожної сторінки, додаючи номер сторінки. Потім ми збираємо дані зі сторінки й переходимо до наступної.
Нескінченний скрол і AJAX-запити
Деякі вебсайти використовують нескінченне прокручування, підвантажуючи більше вмісту під час скролу вниз по сторінці. Такий вміст часто завантажується динамічно через AJAX-запити. Щоб вебскрапити такі сторінки, нам потрібно відстежувати мережеві запити, які браузер виконує під час прокручування.
Ви можете відстежувати ці запити в Developer Tools вашого браузера (вкладка Network). Щойно ви визначите URL запиту для отримання додаткового контенту, ви можете імітувати ці запити в Python за допомогою requests, щоб завантажувати додаткові дані.
def scrape_infinite_scroll(url):
page = 1
while True:
# Construct the URL for the next batch of content
request_url = f"{url}?page={page}"
response = requests.get(request_url)
if response.status_code != 200:
print(«Не вдалося отримати більше даних.»)
break
data = response.json() # Assuming the data is returned as JSON
for product in data['items']:
print(f"Name: {product['name']}, Ціна: {product['price']}")
if not data['has_more']:
print(Більше немає елементів для вебскрапінгу.)
break
page = 1
In this example, we request an HTTP to the dynamic URL for each data page. The response is assumed to be in JSON format, containing the product information and a flag (has_more) indicating whether there is more data to load.
Обробка кнопки «Load More»
Деякі вебсайти замість посилань пагінації використовують кнопку «Load More». Ви можете імітувати натискання кнопки, надсилаючи запити до відповідної URL-адреси або API-ендпойнта, так само як і у випадку з нескінченним прокручуванням. Відстежуйте мережеві запити, щоб зрозуміти, як вебсайт завантажує більше контенту після натискання кнопки.
Опрацювання пагінації є важливою навичкою для вебскрапінгу. Чи йдеться про просту пагінацію за номером сторінки, чи про складнішу кнопку «Load More» або нескінченне прокручування, головне — уважно спостерігати за структурою сайту та розуміти, як завантажується новий контент. Використовуючи бібліотеки Python requests і BeautifulSoup, ви можете автоматизувати процес вебскрапінгу кількох сторінок і зібрати потрібні дані.
Застосовуючи методи, описані в цій статті, ви можете ефективно збирати контент із вебсайтів із пагінацією. Лише пам’ятайте про дотримання умов користування сайтом і не перевантажуйте його сервери занадто великою кількістю запитів за короткий проміжок часу.

