返回博客

精通网页抓取分页:技术、挑战和Python解决方案

分页是网站用来将大型数据集分割到多个页面的系统,以实现更快的加载和更好的导航。在网页抓取中,处理分页对于捕获完整数据集而不仅仅是第一页结果至关重要。本指南解释了什么是分页、它带来的挑战以及如何使用Python高效处理它。

Dominykas Niaura

12月 10日, 2025年

10 分钟阅读

什么是网页抓取中的分页?

网站使用分页系统将长列表的项目或搜索结果分割到多个页面。不是一次加载数千个条目,而是将页面分成更小的块,每个块通过页面底部的"下一页"、"上一页"或编号按钮等链接访问。

从网页设计的角度来看,分页改善了性能和可用性。它有助于页面更快加载,减少带宽使用,并防止浏览器在内容过多时崩溃。它还通过使浏览和导航大型数据集更容易来创建更好的用户体验。例如,每页浏览10个产品,而不是无休止地滚动浏览10,000个产品。

然而,对于数据提取来说,分页引入了额外的复杂性。抓取器必须识别并跟随这些导航链接,从一个页面移动到下一个页面,同时跟踪已经抓取的内容。每个网站处理分页的方式都不同,有些依赖编号的URL(“?page=2”),其他则依赖AJAX请求或通过滚动触发的动态加载内容。

这种可变性造成了三个关键挑战:

  • 检测分页结构. 您首先需要定位网站如何组织其页面: 通过查询参数、"加载更多"按钮或无限滚动
  • 保持连续性. 每个请求必须记住上一个请求停止的位置,以避免丢失或重复数据
  • 处理动态加载. 许多现代网站不再使用简单的下一页链接,而是在您滚动时异步获取新数据,需要无头浏览器或JavaScript渲染工具来捕获它

常见的分页类型

网站使用几种模式来组织大型数据集,每种模式都影响您如何构建抓取器。以下是您将遇到的最常见类型,以及您可能在实践中看到它们的位置:

“下一页”/"上一页"按钮

最简单的分页形式之一。每个页面包含标记为"下一页"或"上一页"的导航链接,用于在结果集之间移动。例如,早期版本的eBay和Google搜索使用这种方法。通过检测包含这些标签的锚标签并跟随它们的href属性,很容易抓取。

数字页面链接

许多电子商务或新闻网站显示一行编号链接(1、2、3、…),以便用户可以跳转到特定页面。亚马逊的产品列表和LinkedIn搜索结果通常使用这种结构。抓取器通常通过递增查询参数(如"?page=2"或"&p=3")来循环遍历URL。

无限滚动

像Twitter、Instagram和YouTube这样的平台在用户向下滚动时不断加载新内容。没有可见的页面链接,而是通过后台请求(XHR或API调用)动态获取数据。处理这种类型需要像Playwright或Selenium这样的工具,可以模拟滚动并等待新元素出现。

"加载更多"按钮

分页和无限滚动之间的混合体。单击"加载更多"或"显示更多结果"按钮会触发其他内容,而不会更改URL。您会在SoundCloud或Pinterest等网站上看到这种模式。抓取器必须重复单击按钮或复制相关的网络请求。

基于API的分页

许多现代网站通过API公开数据,这些API提供分页的JSON响应。这些API通常使用page、limit、offset或cursor等参数在数据块之间导航。这种方法在Reddit、GitHub或Shopify商店等平台中很常见。当可访问时,这是收集结构化数据的最干净、最有效的方式。

其他变体

有些网站使用下拉菜单选择页码、用箭头代替文本按钮,或使用省略号跳过页面范围(例如,“1 … 5 6 7 … 20”)。其他网站使用选项卡式分页来处理类别或日期过滤器。虽然这些变体在视觉上有所不同,但它们遵循相同的逻辑: 分割内容以实现更快的导航和受控加载。

如何识别分页模式

在自动化分页之前,您需要了解目标网站如何构建和加载新数据。此过程从使用浏览器的内置开发者工具进行手动检查开始:

1. 使用浏览器DevTools

要探索网站的结构,打开您计划抓取的页面,右键单击任何位置,然后选择检查(或按Ctrl+Shift+I / Cmd+Option+I)。切换到Elements选项卡以探索页面的HTML。查找:

  • 内容底部附近的导航块,通常包含锚标签(<a>),其中包含"下一页"、"上一页"或页码等文本
  • 包含查询参数的URL,如"?page=2"、“&p=3"或"start=20”。这些表明服务器端分页,新页面通过URL更改加载
  • 具有属性的按钮,如"data-page"、“aria-label=“next"或自定义类,如”.pagination-next"或”.load-more"。这些是客户端导航的强烈指示器

2. 检查网络请求

在与页面交互之前打开Network选项卡。然后单击"下一页"、“加载更多”,或如果使用无限加载则向下滚动。注意列表中出现的新请求。要查找的关键内容:

  • XHR或Fetch请求. 这些通常揭示网站如何异步获取其他数据。如果您看到返回JSON的请求,这意味着网站使用基于API的分页
  • 请求参数. 注意重复出现的变量,如page、offset、cursorlimit。它们显示分页如何在幕后控制
  • 响应结构. 如果服务器响应项目列表而不是完整的HTML,您可以直接针对此端点进行更快、更干净的抓取

3. 在控制台中测试行为

使用Console选项卡动态与页面交互。例如,您可以输入"window.scrollTo(0, document.body.scrollHeight)"来模拟滚动并查看是否自动加载新结果。如果页面在不重新加载的情况下更新,它可能使用无限滚动或JavaScript"加载更多"函数。

4. 识别事件处理程序

仍然不确定?在<script>部分搜索HTML中的关键字,如"loadMore"、“nextPage"或"pagination”。这些可能揭示用于获取新数据的JavaScript函数或端点。

用于抓取分页数据的Python技术

不同的网站需要不同的策略来处理分页。以下是常见的技术,从简单的URL循环到模拟无限滚动,以及简短的Python示例和最佳实践。

本节中的代码片段演示了这三个流行的Python库如何将分页处理作为完整抓取脚本的一部分:

  • Requests – 用于发送HTTP请求和处理基于API或静态HTML页面
  • Beautiful Soup – 用于解析和从HTML中提取数据
  • Playwright – 用于与动态或JavaScript渲染的网站交互

您可以在终端中使用以下两个命令安装它们:

pip install requests beautifulsoup4 playwright
playwright install

在Python中实现基于URL的分页

许多网站通过可预测的URL模式(如"?page=2"或"&offset=50")组织分页内容。在这种情况下,您可以以编程方式生成URL并遍历它们。当URL结构一致时,这种方法是轻量级和可靠的。始终首先检查HTML以确认控制分页的查询参数(例如,page、offsetstart):

import requests
from bs4 import BeautifulSoup
pages = 5
for i in range(1, pages + 1):
url = f"https://books.toscrape.com/catalogue/page-{i}.html"
response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")
# Extract desired data
items = soup.select(".product_pod")
print(f"Page {i}: Found {len(items)} products")

使用Python导航"下一页"按钮

有些网站不公开页码,而是依赖"下一页"或箭头按钮。使用Playwright或Selenium等工具,您可以以编程方式找到并单击这些按钮,直到没有更多页面为止。在这里,抓取器找到"下一页"按钮,单击它,并短暂等待下一批内容加载。在页面之间切换时,始终正确处理相对URL与绝对URL:

from playwright.sync_api import sync_playwright
MAX_PAGES = 5
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
page = browser.new_page()
page.goto("https://books.toscrape.com/catalogue/page-1.html")
current_page = 1
while True:
print("Scraping current page...")
titles = page.query_selector_all(".product_pod h3 a")
for t in titles:
print("-", t.inner_text())
if current_page >= MAX_PAGES:
break
next_btn = page.locator("li.next a")
if not next_btn.is_visible():
break
next_btn.click()
page.wait_for_timeout(2000)
current_page += 1

使用Python处理无限滚动和"加载更多"

使用无限滚动的网站(如Instagram或YouTube)需要模拟用户操作来加载新内容。您可以使用Playwright滚动或重复触发"加载更多"按钮,直到没有新结果出现。这种方法适用于无限滚动和动态追加项目的"加载更多"按钮:

from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
page = browser.new_page()
page.goto("https://infinite-scroll.com/demo/full-page/")
previous_height = 0
while True:
page.evaluate("window.scrollTo(0, document.body.scrollHeight)")
page.wait_for_timeout(2000)
new_height = page.evaluate("document.body.scrollHeight")
if new_height == previous_height:
break
previous_height = new_height
print("All results loaded.")

在Python中使用基于API的分页

如果您在Network选项卡中发现JSON响应,网站可能依赖API端点进行分页。您可以直接从这些端点抓取数据,使用查询参数(如page、limit或cursor)。这是分页抓取最有效和最可靠的形式,因为它完全避免了渲染HTML。只需记住尊重速率限制并使用重试逻辑优雅地处理错误:

import requests
base_url = "https://dummyjson.com/products"
params = {"page": 1, "limit": 50}
max_pages = 10
for _ in range(max_pages):
response = requests.get(base_url, params=params)
data = response.json()
items = data.get("products", [])
if not items:
break
print(f"Fetched {len(items)} items from page {params['page']}")
params["page"] += 1

高级分页挑战

一旦您掌握了基本的分页处理,您通常会在实际应用中遇到更复杂的模式。这些高级情况需要更具适应性的逻辑和正确的抓取工具来保持稳定性。

处理未知数量的页面

并非每个网站都会告诉您存在多少页数据。在这种情况下,您可以设计抓取器继续运行,直到找不到新结果为止。例如,在每次请求后,检查页面返回的项目是否少于预期,或者"下一页"按钮是否消失,这两者都是您已到达末尾的迹象。添加最大页面限制也是防止无限循环的良好保障。

处理JavaScript或AJAX渲染的内容

现代网站经常使用JavaScript在不刷新页面的情况下动态加载新内容。像Requests和Beautiful Soup这样的传统库看不到该内容,因为它是在加载初始页面后生成的。像Playwright或Selenium这样的工具可以像浏览器一样渲染页面,使得捕获动态加载的元素成为可能。要检查这些请求,请在DevTools中打开Network选项卡,查找返回JSON的XHR或Fetch调用,这些通常揭示您可以直接定位的底层API端点。

管理会话数据、cookie或令牌

在抓取经过身份验证或基于会话的页面时,您的抓取器可能需要在请求之间携带cookie、会话令牌或标头。许多网站依赖这些来维护用户状态或访问限制。使用Requests或Playwright,您可以在登录后存储cookie并在后续页面上重用它们。注意会话过期,令牌通常需要定期刷新以避免在运行中期失去访问权限。

识别并适应复杂或混合分页模式

有些网站混合使用多种分页方法,例如,"加载更多"按钮与动态过滤器或类别选项卡结合使用。其他网站根据用户输入更改分页行为。这些混合设计需要灵活的抓取逻辑。仔细检查HTML结构和网络流量,以确定哪种机制负责获取数据。在这种设置中,结合技术(滚动模拟、按钮单击和API调用)通常会提供最可靠的结果。

网页抓取分页的最佳实践

抓取分页网站不仅需要技术精确性。它还需要稳定性、尊重网站资源和可靠的数据管理。遵循这些最佳实践有助于确保即使在大规模运行时也能平稳、一致地运行:

使用速率限制和退避策略

发送太多请求太快是暂时封锁的常见原因。在请求或页面加载之间添加短暂的随机延迟以模仿自然浏览行为。对于更大规模的抓取器,实施指数退避策略,在重试之前在每次失败的请求后增加等待时间。这不仅有助于您保持在速率限制之下,还能保持会话稳定。

尊重网站指南

在运行抓取器之前,检查网站的robots.txt文件以了解可以爬取哪些页面。许多网站还在其服务条款中概述了可接受的使用政策或API访问规则。遵循这些有助于防止中断并保持良好的抓取卫生。

添加错误处理和重试逻辑

网络故障、响应缓慢或偶尔的验证码触发是不可避免的。将您的请求包装在try/except块中,并限制重试失败页面的次数。包括超时设置并适当处理不同的响应代码(如403或429),例如,通过等待更长时间或切换代理IP。

执行数据去重和一致性检查

在抓取许多页面时,重复项很常见,特别是如果分页重叠或重置。以结构化格式(如CSV或数据库)存储抓取的数据,并使用唯一标识符(如产品ID或URL)删除重复项。定期验证项目计数、时间戳或分页索引是否与预期总数一致,以确保您的数据集保持完整和准确。

用于抓取分页网站的工具和库

选择正确的工具使分页处理变得更容易。每个Python库都有其优势,具体取决于您是处理静态页面、JavaScript渲染的网站还是大规模项目。

Beautiful Soup

一个轻量级的HTML解析器,非常适合小型项目和静态页面。当与Requests库配对以获取页面内容时,它工作得最好。当您只需要从不依赖JavaScript的简单网站中提取结构化数据(标题、价格、链接)时使用它。

Requests

以干净和Pythonic的方式处理HTTP请求。非常适合抓取具有可预测的基于URL的分页或返回JSON数据的API端点的网站。它快速、稳定且易于调试。

Selenium

一个浏览器自动化框架,像真实用户一样与网站交互。它适用于滚动或按钮单击后动态加载内容的网站。虽然功能强大,但Selenium速度较慢且资源密集,因此它更适合需要完整渲染的小型或中等抓取任务。

Playwright

Selenium的现代替代品,具有更快的性能和内置的无头浏览器支持。它特别适合处理无限滚动、"加载更多"按钮或需要用户交互的页面。Playwright的API稳定且开发人员友好,使其成为动态分页场景的首选。

Scrapy

一个功能齐全的抓取框架,专为可扩展性而设计。它包括异步请求处理、内置数据管道和通过链接提取自动分页。当您需要高效地爬取数百或数千个页面或维护长期运行的抓取项目时使用Scrapy。

aiohttp

一个异步HTTP客户端库,在您需要速度和并发性时表现出色。非常适合并行抓取多个分页端点。它通常与Beautiful Soup或lxml结合使用以进行解析。

网页抓取 API

一个多合一的抓取器,设计用于从电子商务市场、搜索引擎结果页面、社交媒体平台和许多其他具有分页支持的网站提取结构化数据。它提供HTML、JSON、CSV或Markdown格式的输出,并包括1.25亿多个预集成代理、JavaScript渲染和浏览器指纹识别,以实现稳定、不可阻挡的大规模抓取。

在其100多个现成的抓取模板中,有几个包含分页参数,如from_page和limit,以实现无缝数据检索。这些涵盖了广泛的用例,包括:

  • Amazon Pricing、Amazon Search和Amazon Bestsellers
  • Google Search with AI Overview、Google Shopping、Google Shopping Product、Google Ads with AI Overview、Google Travel Hotels和Google Maps

以及更多!


free-trial.svg

免费试用网页抓取API

立即激活您的7天免费试用,享受1000次请求额度,大规模抓取结构化公开数据。

何时使用哪种工具

正确的设置取决于网站的结构、您收集的数据量以及您需要对渲染、并发和错误处理的控制程度:

  • 对于具有简单下一页链接的静态HTML页面,使用Requests + Beautiful Soup
  • 对于JavaScript密集型网站或与"加载更多"按钮等元素交互时,选择Playwright(或Selenium)
  • 对于可扩展性和效率至关重要的生产级爬虫,使用Scrapy
  • 如果您需要许多轻量级API请求的异步性能,请选择aiohttp
  • 当您需要一个完全托管、即用的解决方案来处理复杂分页和大规模数据收集时,使用Decodo的网页抓取 API

常见问题排查

即使是设计良好的分页抓取器也可能遇到数据丢失或意外阻止等问题。了解这些最常见的原因将帮助您更快地调试并保持抓取会话的一致性:

数据丢失或不完整

如果某些页面返回的结果少于预期,请再次检查网站的HTML结构。它可能在页面或类别之间有所不同。检查您的选择器是否仍然匹配正确的元素,因为动态网站可以重新排列类名或容器布局。在请求之间添加短暂的延迟也可以防止页面加载不完整。

反机器人和速率限制措施

许多网站通过检测异常请求模式来限制自动访问。为了最小化这一点,轮换用户代理和代理,并随机化您的请求间隔。像Decodo的动态住宅代理与轮换会话类型等工具有助于将流量分布到多个IP上,使您的抓取器看起来更像真实用户。

free-trial.svg

用代理提升你的爬虫效率

立即领取住宅代理3天免费试用,探索1.15亿+道德获取的IP地址、高级地理定位选项、99.86%的成功率、平均响应时间低于0.6秒等更多功能。

动态内容未出现

如果某些结果从未加载,页面可能依赖JavaScript或AJAX调用。使用Playwright或Selenium等无头浏览器来渲染内容。您可以通过检查DevTools中的Network选项卡以查找后台请求或查看页面源代码来验证这一点。如果数据在那里缺失,它是动态生成的。

意外的重复或分页循环

如果您注意到重复数据或无限抓取循环,请检查您的分页逻辑。确保您正确识别"下一页"按钮或URL模式,并在每页后更新它。对于API分页,监控page、offset或cursor等参数以确认它们按预期前进。

知道何时停止分页

有些网站不明确显示存在多少页。在这种情况下,在以下情况下停止循环:

  • 下一页按钮不再可见或被禁用
  • 最新请求返回空列表或重复结果
  • 检索到的项目数低于每页的预期计数

添加最大页面限制是防止意外无限抓取的良好后备方案。

总结

分页既是一个设计特性,也是一个抓取障碍。通过了解分页的工作原理、识别其变体并选择正确的工具,您可以可靠地扩展数据收集,而不会丢失有价值的信息。一个灵活的抓取器,具有适当的延迟、重试和去重逻辑,将处理任何使用编号URL、JavaScript驱动的"加载更多"按钮或API端点的网站。

最终,分页不在于复杂性,而在于精确性,即构建您的请求、尊重网站限制并确保每个页面向您的最终数据集添加有意义的数据。通过仔细的设置和正确的Python库,即使是大型、多页面的来源也可以高效、负责任地抓取。

关于作者

Dominykas Niaura

技术文案

Dominykas 在他的写作中独特地融合了哲学洞察力和专业技术知识。他的职业生涯始于电影评论家和音乐行业的文案,现在他是一位将复杂的代理和网络搜索概念变得通俗易懂的专家。


通过 LinkedIn 与 Dominykas 联系。

Decodo 博客上的所有信息均按原样提供,仅供参考。对于您使用 Decodo 博客上的任何信息或其中可能链接的任何第三方网站,我们不作任何陈述,也不承担任何责任。

常见问题

从任何网站抓取分页数据合法吗?

分页不影响抓取的合法性,它只是一个结构特性。但是,在抓取任何网站时,请确保您只访问公开可用的数据,避免可能使网站服务器负担的过度请求,并根据版权和数据保护法负责任地处理数据。建议咨询法律顾问以确保完全遵守您特定用例的相关法规。

在抓取时处理未知数量分页页面的最佳方法是什么?

当总页数未知时,设计您的抓取器继续运行,直到没有新结果出现。当"下一页"按钮消失、请求返回空列表或重复结果开始重复时停止循环。添加最大页面限制可防止无限抓取循环。

如何抓取使用JavaScript加载分页内容的网站?

使用Playwright或Selenium等无头浏览器,它可以渲染JavaScript并模拟滚动或单击"加载更多"等用户操作。或者,检查DevTools中的Network选项卡以找到提供新数据的后台API调用,然后直接定位这些端点。

如何识别网站使用基于API的分页而不是传统的HTML分页?

在DevTools中打开Network选项卡,查找导航页面或单击"加载更多"时触发的XHR或Fetch请求。如果您看到包含page、offset、cursorlimit等参数的JSON响应,网站可能依赖基于API的分页。这种方法通常比HTML页面更快、更容易抓取。

相关文章

小红书抓取: 获取所需数据

小红书,又名 “小红书 ”或简称 “红”,已迅速成为中国社交和电子商务领域的重要参与者,成为一个不可或缺的平台。对于企业、营销人员和数据分析师来说,从小红书收集数据可以获得宝贵的洞察力,从而推动业务增长。虽然这一过程看似复杂,但 Decodo 代理等工具可以大大简化这一任务。在本博文中,我们介绍小红书搜索的最佳实践。


James Keenan

2月 10日, 2025年

4 分钟阅读

Python Tutorial: How To Scrape Images From Websites

如何使用 Python 从任何网站抓取图像

如果你需要大量图像,而一张一张保存的想法已经让你感到厌烦,那你并不孤单。在为机器学习项目准备数据集时,这种工作尤其令人疲惫。好消息是,网页抓取通过让你在几个步骤内收集大量图像,使整个过程更快、更易于管理。在这篇博文中,我们将指导你通过一种直接的方法从静态网站抓取图像。我们将使用 Python、几个便捷的库以及代理来保持一切顺利运行。

Dominykas Niaura

12月 05日, 2025年

10 分钟阅读

如何使用Python抓取网页表格:完整指南

HTML表格是网站组织数据最常见的方式之一,包括财务报告、产品列表、体育比分、人口统计等。但这些数据被锁定在网页布局中。要使用它,您需要提取它。本指南将向您展示如何使用Python做到这一点,从简单的静态表格开始,逐步处理复杂的动态表格。

Justinas Tamasevicius

12月 08日, 2025年

9 分钟阅读

© 2018-2025 decodo.cn(原名 smartproxy.com)。版权所有 津ICP备2022004334号-2