Python запрашивает пагинацию для соскабливания нескольких страниц

Python запрашивает пагинацию для соскабливания нескольких страниц

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

Что такое веб-скрейпинг?

Веб-скрейпинг — это процесс извлечения данных с сайтов. Python предлагает такие библиотеки, как requests, для отправки HTTP-запросов и доступа к веб-страницам, а также BeautifulSoup для парсинга HTML и извлечения нужного контента. Скрейпинг простых сайтов несложен, но многие современные сайты используют пагинацию, чтобы распределять контент по разным страницам. Если не знать, как работать с пагинацией, можно извлечь данные только с одной страницы и упустить все остальное.

Почему пагинация важна?

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

Более умный способ работы с пагинацией 🚀🧠

Хотя у Python requests Библиотека отлично подходит для скрейпинга простых сайтов с пагинацией, но она плохо справляется, когда страницы загружают контент динамически через JavaScript, бесконечную прокрутку или кнопки “Load More”. Именно здесь Браузер для скрапинга вот где он пригодится! 🖥️✨

Scraping Browser ведет себя как настоящий браузер: он загружает JavaScript, прокручивает страницы, кликает и перемещается по ним так же, как это сделал бы человек. Это делает его идеальным для работы со сложными сценариями пагинации, которые requests сама по себе не справится. Кроме того, она оптимизирована для крупномасштабного скрейпинга, с встроенным управлением прокси и контролем сессий. 🌍🔄

Если вы скрейпите современные сайты и вам нужен более надежный способ работы с пагинацией, scraping browser может сэкономить вам много времени и нервов.

Разные типы пагинации

Прежде чем начать скрейпинг, важно понять типы пагинации, которые обычно встречаются на сайтах:

  1. Классическая пагинация с номерами страниц: 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.
  2. Next Page Button: На некоторых сайтах для перехода на следующую страницу используется кнопка «Next». URL страницы остается тем же, но сайт меняет содержимое в зависимости от номера страницы.
  3. Infinite Scroll: Этот прием используется на сайтах, где контент загружается по мере прокрутки вниз. Он динамически подгружает новый контент без изменения страницы или URL.
  4. Load More Button: Сайты с кнопкой load more позволяют пользователю нажать кнопку, чтобы загрузить дополнительный контент, а не переходить на новую страницу.

Настройка Python для веб-скрейпинга

Прежде чем переходить к скрейпингу, давайте убедимся, что у нас настроены необходимые инструменты:

Install Required Libraries: Сначала нужно установить две библиотеки: requests и beautifulsoup4. Установить их можно с помощью следующих команд:

pip install requests
pip install beautifulsoup4

Import Libraries: После установки мы можем импортировать их в наш скрипт. `requests` будет выполнять HTTP-запросы к сайту, а BeautifulSoup будет разбирать HTML и позволять извлекать нужные элементы.

импорт requests
с сайта bs4 импорт BeautifulSoup

Сбор данных с нескольких страниц

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

Шаг 1: Изучение сайта

Прежде чем писать код, нужно понять структуру сайта. Откройте сайт в браузере, щёлкните правой кнопкой мыши по странице и выберите «Inspect», чтобы посмотреть HTML-структуру. Найдите раздел, в котором находятся карточки товаров и элементы пагинации (например, номера страниц или кнопку перехода на следующую страницу).

Обычно ссылки пагинации находятся внутри HTML-документа.

    • или
<nav класс="pagination">
<a href="page/1">1</a>
<a href="page/2">2</a>
<a href="page/3">3</a>
<a href="next" класс="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)
если response.status_code != 200:
печать(f"Не удалось получить страницу: {response.status_code}")
возврат
soup = BeautifulSoup(response.text, 'html.parser')
product_cards = soup.find_all('div', class_='product-card')
для продукт в product_cards:
name = product.find('h2', class_='product-title').text
price = product.find('span', class_='цена').text
печать(f"Name: {name}, Цена: {price}")

В этом коде мы отправляем запрос к странице, проверяем, был ли он выполнен успешно, и разбираем содержимое с помощью BeautifulSoup. Затем мы находим все карточки товаров и извлекаем название и цену товара.

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

Теперь, когда мы можем извлекать данные с первой страницы, нужно обработать пагинацию. Сайты со ссылкой на следующую страницу обычно содержат URL следующей страницы. Мы можем изменить функцию так, чтобы она переходила по этой ссылке и собирала данные со следующей страницы. Добавим логику для этого.

def scrape_all_pages(start_url):
url = start_url
в то время как url:
печать(f"Скрапинг страницы: {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')
если next_page:
url = next_page.get('href')
else:
печать("Страниц для скрапинга больше нет.")
перерыв

В этой функции мы начинаем сбор данных с указанного 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):
для страница в ассортимент(1, total_pages   1):
url = f"{start_url}?page={page}"
печать(f"Скрапинг страницы: {url}")
scrape_page(url)

В этой функции мы проходим по заданному числу страниц и формируем URL для каждой страницы, добавляя номер страницы. Затем мы собираем данные со страницы и переходим к следующей.

Бесконечная прокрутка и AJAX-запросы

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

Вы можете отслеживать эти запросы в инструментах разработчика браузера (на вкладке Network). Как только вы определите URL запроса для получения дополнительного контента, вы можете имитировать эти запросы в Python с помощью requests, чтобы загружать дополнительные данные.

def scrape_infinite_scroll(url):
page = 1
в то время как Правда:
# Construct the URL for the next batch of content
request_url = f"{url}?page={page}"
response = requests.get(request_url)
если response.status_code != 200:
печать("Не удалось получить дополнительные данные.")
перерыв
data = response.json() # Assuming the data is returned as JSON
для продукт в данные['items']:
печать(f"Name: {product['name']}, Цена: {product['price']}")
если не данные['has_more']:
печать("Больше нечего собирать.")
перерыв
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» вместо ссылок пагинации. Вы можете имитировать нажатие кнопки, отправляя запросы к соответствующему URL или API-эндпоинту, как и в случае с бесконечной прокруткой. Отслеживайте сетевые запросы, чтобы понять, как сайт загружает дополнительный контент при нажатии кнопки.

Обработка пагинации — важный навык для веб-скрапинга. Неважно, имеете ли вы дело с простой пагинацией по номерам страниц, более сложной кнопкой «Показать еще» или бесконечной прокруткой, главное — внимательно изучать структуру сайта и понимать, как загружается новый контент. Используя библиотеки requests и BeautifulSoup в Python, вы можете автоматизировать процесс сбора данных с нескольких страниц и получить необходимые данные.

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

 

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