You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何爬取无?page=数字参数分页站点的所有页面链接

无?page=后缀分页场景的全量页面链接采集方法

你之前写的循环拼接?page=数字的逻辑,只适配分页参数明文放在URL查询串里的站点。遇到点击分页地址栏不变的情况,本质是分页参数没有直接暴露在页面URL里,按下面的顺序排查处理就行,不需要死磕页面URL格式。

1. 优先排查异步接口加载(这类站点90%是这个逻辑)

  • 打开浏览器F12开发者工具,切换到「网络」面板,选「Fetch/XHR」选项过滤请求
  • 点击页面上的分页按钮,观察新弹出的请求:这类请求一般会携带page、pageNum、offset之类的分页参数,参数可能放在GET请求的查询串里,也可能放在POST请求的请求体中,返回内容要么是分页区域的HTML片段,要么是结构化的JSON数据
  • 你不需要访问带分页后缀的页面URL,直接模拟这个接口请求传页码参数就行,采集效率比爬整页更高。你提到的站点点击分页时地址栏完全不变,就是典型的异步加载逻辑,按这个方法抓接口就能拿到所有分页数据。

2. 排查路径式分页规则

  • 小部分站点不会把分页参数放在?后面的查询串里,而是直接嵌在URL路径中,常见格式比如/page/2、/list/index_2.html
  • 点击分页时如果地址栏有变化,只是没有?page=的格式,直接按实际看到的路径规则循环拼接URL即可;如果点击分页地址栏完全不动,直接跳过这种情况。

3. 排查前端假分页

  • 部分内容量小的站点会把所有列表数据一次性加载到页面里,点击分页只是前端JS控制内容的显示隐藏,根本不会向服务器发新的请求
  • 这种情况直接请求第一页的源码,把所有目标链接一次性解析出来就行,不需要做分页遍历。

参考实现代码

import requests
from bs4 import BeautifulSoup

# 替换成你在F12网络面板里抓到的实际分页接口地址
api_url = "https://apexranked.com/对应接口路径"
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36",
    "Referer": "https://apexranked.com/"
}

all_links = set()
# 按实际接口返回的总页数调整循环范围即可
for page_num in range(1, 121):
    # 根据接口实际的请求方式传参,GET请求用params,POST请求用data/json参数
    req_params = {
        "page": page_num
        # 把F12里看到的接口固定参数都补在这里
    }
    resp = requests.get(api_url, headers=headers, params=req_params)
    resp.raise_for_status()
    
    # 如果返回是HTML就用BeautifulSoup解析,返回是JSON就直接从结构化数据里提取链接
    soup = BeautifulSoup(resp.text, "html.parser")
    for a_tag in soup.find_all("a", href=True):
        # 过滤掉带?page=参数的链接,只保留目标链接
        if "?page=" not in a_tag["href"]:
            all_links.add(a_tag["href"])
    
    print(f"第{page_num}页采集完成,当前累计获取有效链接{len(all_links)}个")

注意:抓接口时如果看到有cookie、签名参数校验,先请求站点首页拿到合法的cookie和必要参数再发起分页请求,请求间隔加1-2秒的延时,避免被站点反爬拦截。

内容的提问来源于stack exchange,提问作者UBIYTSV

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 21:01:16