1. Вступ до пагінації
А хто сказав, що потрібні тобі дані будуть знаходитися на одній сторінці? Дуже часто їх доводиться витягати з купи сторінок, або вони взагалі розкидані по всьому сайту. Так що один з перших викликів, з яким ти зіткнешся, буде розбиття даних на сторінки (pages). А захоплююча робота по їх збору називається pagination (пагінація).
Так, пагінація — це не тільки той момент, коли ти чекаєш переходу на наступну сторінку результатів Google, але і коли веб-скрейпер задається питанням: "А як би це автоматизувати, щоб не робити це вручну?"
Пагінація — це спосіб організації даних на сайті, щоб уникнути довгих сторінок із контентом. Замість цього сайти розбивають дані на сторінки, додаючи посилання на кшталт "Наступна" або "Далі" для переходу від однієї сторінки до іншої. Це важлива концепція, адже ти, як веб-скрейпер, не захочеш сказати начальнику, що ти щось не отримав, бо це заховано на "п'ятій сторінці".
2. Проблеми скрейпінгу даних з кількох сторінок
Перша проблема, з якою ти можеш зіткнутися, — це відсутність інтуїтивно зрозумілих і передбачуваних URL. У деяких сайтів URL не змінюється кардинально, коли ти переходиш між сторінками, що ускладнює життя для автоматизації. Наприклад, замість page=1, page=2 ти можеш зіткнутися з x=abc, x=def без явного шаблону.
Друга проблема — захист від ботів. Деякі сайти активно відслідковують кількість запитів з однієї IP-адреси. Якщо вони бачать, що ти робиш забагато запитів, тебе можуть тимчасово (або назавжди) заблокувати.
Але не переймайся, зараз ми навчимось обходити ці труднощі як справжні скрейпери.
3. Обхід пагінації
Техніки та стратегії
- Аналіз структури URL: Зазвичай сторінки використовують параметр в URL для позначення номера сторінки, наприклад
?page=2. Якщо ти виявив таке, вітаю, ти знайшов золотий шаблон для обходу пагінації! - Пошук посилання "Далі": Іноді URL не піддається передбаченню. У таких випадках потрібно шукати посилання "Далі" або "Наступна" на сторінці та слідувати за ними.
- Використання AJAX-запитів: Деякі сайти отримують дані за допомогою AJAX без перезавантаження сторінки. У цьому випадку потрібно перехопити ці запити і відтворити їх.
Перейдемо до практики!
Приклад скрипта для обходу пагінації та збору даних
Розглянемо приклад скрипта:
import requests
from bs4 import BeautifulSoup
# Функція для отримання даних з однієї сторінки
def get_data_from_page(url):
response = requests.get(url)
if response.status_code == 200:
soup = BeautifulSoup(response.text, 'html.parser')
# Тут ти витягуєш дані із soup — приклад
data = soup.find_all('div', class_='data-class')
for item in data:
print(item.text) # Виведи або збережи дані
else:
print(f"Не вдалося отримати сторінку: {url}")
# Основна логіка для обходу пагінації
def scrape_all_pages(start_url):
current_url = start_url
while current_url:
get_data_from_page(current_url)
soup = BeautifulSoup(requests.get(current_url).text, 'html.parser')
# Спробуємо знайти посилання "Далі"
next_button = soup.find('a', text='Далі')
if next_button:
current_url = next_button['href']
else:
current_url = None
# Починаємо скрейпінг з першої сторінки
start_url = 'http://example.com/page=1'
scrape_all_pages(start_url)
Це базовий приклад, який демонструє принцип роботи з пагінацією. Тобі потрібно буде адаптувати його під структуру сайту, з яким ти працюєш.
Управління сесією і використання user-agent
Коли ти відправляєш багато запитів до сайту, корисно використовувати сесію і змінювати user-agent, щоб зменшити ризик блокування.
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
session = requests.Session()
session.headers.update(headers)
response = session.get('http://example.com')
Ця конструкція дозволяє емулювати браузер більш надійно, ніж просто відправка запитів з порожніми заголовками.
4. Практична реалізація
Тепер, коли ми знаємо основи, давай трохи ускладнимо задачу. Розглянемо випадок, коли посилання на сторінки містять непередбачувані параметри, і нам потрібно використовувати AJAX для отримання даних.
Реалізація з використанням AJAX
Іноді дані не завантажуються на основній сторінці, а підвантажуються через AJAX. Якщо ти виявив, що сайт діє так, використовуй інструмент в браузері для налагодження мережі, щоб визначити, які запити відправляються у фоновому режимі. Потім відтвори ці запити за допомогою Python.
# Приклад виклику AJAX
ajax_url = 'http://example.com/ajax_endpoint'
params = {
'some_param': 'value', # параметри, якщо потрібні для запиту
'page': 1
}
while True:
response = session.get(ajax_url, params=params)
data = response.json()
if not data['has_more']:
break
# Обробка даних
for item in data['items']:
print(item)
params['page'] += 1 # Перехід на наступну сторінку
Такий підхід допомагає, коли після детального аналізу запиту і відповіді ти розумієш, як відбувається завантаження даних у браузері.
Сьогоднішня лекція занурила нас у світ захоплюючої і часто примхливої пагінації. Ця навичка дозволить тобі впевнено і ефективно збирати дані з сайтів, не пропускаючи жодної сторінки. Зрештою, як і в житті, у веб-скрейпінгу важлива методичність і наполегливість, бо хто знає, які приховані скарби лежать на двадцятій сторінці!
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ