Освоение пагинации в веб-скрапинге: Полное руководство
В этом руководстве мы разберем пагинацию, почему она важна для парсинга сайтов и, самое главное, как справиться с ней без лишних сложностей. К концу статьи вы будете уверенно собирать данные с многостраничных сайтов, не чувствуя перегрузки. Давайте сделаем пагинацию еще одной проблемой, о которой не придется беспокоиться.
Автоматизированные решения для обработки пагинации
Эти 3 сервиса помогут вам на каждом этапе скрапинга страниц с пагинацией, будь то только прокси или полностью автоматизированный API:
- Яркие данные — Best overall for advanced scraping; features extensive proxy management and reliable APIs.
- Octoparse - удобный no-code-инструмент для автоматического извлечения данных с сайтов.
- ScrapingBee — API для разработчиков, эффективно работающее с прокси, браузерами и CAPTCHA.
Я не связан ни с одним из них.
Что такое пагинация?
Такие сайты, как e-commerce-платформы, сайты вакансий и социальные сети, используют пагинацию для работы с большими объемами данных. Если бы все было на одной странице, это замедлило бы загрузку и потребовало бы слишком много памяти. Пагинация разбивает контент на несколько страниц, что упрощает работу с ним. Она также добавляет простую навигацию, например кнопки «Next», номера страниц или автоматическую прокрутку. Это ускоряет работу с сайтом и делает навигацию понятной. Пагинация помогает пользователям быстро находить нужное, не перегружая систему.
Типы пагинации
Пагинация может быть разной по сложности. Она варьируется от простых методов до более продвинутых техник, таких как бесконечная прокрутка. По моему опыту, я выделил три основных типа пагинации, которые обычно используются на сайтах:
- Numbered Pagination: Этот метод позволяет пользователям переходить между отдельными страницами по пронумерованным ссылкам. Пользователи нажимают на номера, чтобы увидеть разные наборы контента.
- Click-to-Load Pagination: В этом подходе пользователи нажимают кнопку, например “Load More”, чтобы раскрыть дополнительный контент. Это позволяет более контролируемо загружать данные.
- 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:
импорт requests
с сайта bs4 импорт BeautifulSoup
base_url = "https://example.com/items?page="
page_num = 1
в то время как Правда:
response = requests.get(base_url + str(page_num))
если response.status_code != 200:
перерыв
soup = BeautifulSoup(response.text, 'html.parser')
# Extract the data you need from soup object here
печать(f"Scraping page {page_num}…")
# If no next page link or last page is reached, exit loop
если не soup.find('a', {'class': 'next-page'}):
перерыв
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», динамически подгружает новый контент на той же странице. Это требует, чтобы скрейпер многократно имитировал клик, чтобы загрузить весь доступный контент.
Обработка пагинации с загрузкой по клику с помощью Selenium:
Поскольку пагинация по клику обычно зависит от JavaScript, эффективно использовать инструменты вроде Selenium или Playwright. Эти инструменты позволяют взаимодействовать с элементами страницы и загружать нужный контент.
Пример с использованием Selenium:
с сайта селен импорт webdriver
с сайта selenium.webdriver.common.by импорт По ссылке
с сайта selenium.webdriver.common.keys импорт Keys
импорт time
driver = webdriver.Chrome()
driver.get("https://example.com/items")
в то время как Правда:
попробуйте:
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
кроме:
перерыв
# After loading all items, scrape the data
items = driver.find_elements(By.CLASS_NAME, "item")
для пункт в items:
печать(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:
импорт asyncio
с сайта playwright.async_api импорт async_playwright
async def scroll_to_bottom(страница):
в то время как Правда:
previous_height = ожидайте page.evaluate("document.body.scrollHeight")
ожидайте page.evaluate("window.scrollTo(0, document.body.scrollHeight)")
ожидайте asyncio.sleep(2)
new_height = ожидайте page.evaluate("document.body.scrollHeight")
если new_height == previous_height:
перерыв
async def scrape_infinite_scroll(url):
async с async_playwright() в роли p:
браузер = ожидайте p.chromium.launch()
page = ожидайте browser.new_page()
ожидайте page.goto(url)
ожидайте scroll_to_bottom(page)
# Extract data after fully loading the page
content = ожидайте page.content()
печать(контент)
ожидайте browser.close()
asyncio.run(scrape_infinite_scroll("https://example.com/items"))
Код прокручивает страницу вниз до тех пор, пока новый контент не перестанет загружаться, обеспечивая отображение всех элементов на странице для скрапинга.
Challenges:
- Не всегда очевидно, когда следует остановить прокрутку.
- Некоторые сайты применяют такие меры, как ленивая загрузка, где изображения не загружаются, пока не станут видимыми в области просмотра.
Сложности с пагинацией
При работе с контентом, разбитым на страницы, нужно учитывать несколько рисков. Одна из серьезных проблем — возможность блокировки со стороны сайтов. Некоторые сайты могут блокировать доступ уже после одной страницы. Например, при попытке собрать данные с сайта электронной коммерции вроде Amazon вы можете столкнуться с CAPTCHA.
Amazon CAPTCHA Challenge
Let’s make a request to the Amazon homepage and see what happens.
импорт запросы
url = "https://www.amazon.com/"
response = requests.get(url)
печать(f"Status code: {response.status_code}")
В этом случае вы можете получить код состояния 403.
Этот статус означает, что Amazon определил ваш запрос как исходящий от бота или скрейпера, из-за чего была показана CAPTCHA. Если вы продолжите отправлять несколько запросов, ваш IP-адрес могут заблокировать немедленно.
Чтобы обойти эти блокировки и эффективно собрать нужные данные, можно использовать прокси с Python Requests. Этот прием помогает избегать блокировок IP-адресов. Кроме того, можно имитировать реальный браузер, меняя User Agent. Однако важно понимать, что эти методы не гарантируют успех против продвинутых систем обнаружения ботов.
Заключение
Обработка пагинации критически важна для сбора полных данных с сайтов, которые подают контент частями. Здесь я разобрал основные типы пагинации: нумерованную, загрузку по клику и бесконечную прокрутку. Я также объяснил, как работать с ними с помощью таких инструментов, как BeautifulSoup, Selenium и Playwright.
Выбор инструмента зависит от типа пагинации. Для нумерованной пагинации я часто могу использовать простые циклы, тогда как пагинация по клику и бесконечная прокрутка требуют фреймворков автоматизации, чтобы имитировать действия пользователя.
Чтобы повысить надежность моих проектов по веб-скрейпингу, я придерживаюсь таких лучших практик, как ограничение частоты запросов, плавная обработка ошибок и вращение прокси. Понимание этих приемов помогает мне создавать эффективные веб-скреперы для любого страничного контента.

