如何爬取无?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
相关产品推荐
相关产品推荐

