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

如何使用BeautifulSoup抓取网站全部分页的页面数据

问题背景

需要采集apexranked.com站点全部分页的排行数据,自行编写的分页遍历代码无法生效,目标采集页面截图如下:
目标采集标签页截图

原有失效代码

url = 'https://apexranked.com/'
page = 1 
while page != 121: 
    url = f'https://apexranked.com/?page={page}'
    print(url) 
    page = page + 1

代码核心失效原因有两点:

  • 分页URL构造逻辑错误:站点分页不是通过?page=查询参数实现,而是采用路径分页规则,真实分页地址格式为https://apexranked.com/page/{页码}/,错误的URL会直接返回首页内容或者404
  • 代码仅构造打印了URL,没有发起真实HTTP请求、添加反爬绕过配置、也没有编写页面解析逻辑,根本无法拿到有效页面数据
BeautifulSoup 可行爬取方案

前置依赖

先安装需要的第三方库:

pip install requests beautifulsoup4

完整实现代码

import requests
from bs4 import BeautifulSoup
import time

# 配置基础请求头绕过反爬,无请求头会被Cloudflare拦截返回403
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
    "Referer": "https://apexranked.com/"
}

def parse_single_page(html):
    """解析单页内容,可根据采集需求修改对应选择器"""
    soup = BeautifulSoup(html, "html.parser")
    # 示例提取排行条目,实际选择器对照页面DOM结构调整即可
    rank_rows = soup.select(".player-row")
    page_data = []
    for row in rank_rows:
        player_name = row.select_one(".player-name").text.strip() if row.select_one(".player-name") else ""
        rank_score = row.select_one(".rank-score").text.strip() if row.select_one(".rank-score") else ""
        page_data.append({
            "player_name": player_name,
            "rank_score": rank_score
        })
    return page_data

if __name__ == "__main__":
    all_data = []
    total_page = 121
    for page in range(1, total_page+1):
        # 构造符合站点规则的分页URL
        url = "https://apexranked.com/" if page == 1 else f"https://apexranked.com/page/{page}/"
        resp = requests.get(url, headers=headers, timeout=10)
        # 异常状态重试/跳过
        if resp.status_code != 200:
            print(f"第{page}页请求失败,状态码:{resp.status_code}")
            time.sleep(2)
            continue
        single_page_data = parse_single_page(resp.text)
        all_data.extend(single_page_data)
        print(f"第{page}页采集完成,累计获取{len(all_data)}条数据")
        # 添加请求延时,避免触发频率限制
        time.sleep(1)
    
    # 后续可自行添加存储逻辑,比如写入CSV、JSON文件
    print(f"全部分页采集完成,总数据量:{len(all_data)}")

补充说明

  • 如果遇到Cloudflare 5秒盾拦截,可替换requests为cloudscraper库发起请求,即可绕过基础JS验证
  • 代码中示例的CSS选择器仅作参考,需要根据你实际要采集的字段,对照页面DOM结构调整
  • 请控制请求频率,不要对站点服务器造成不必要的压力

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 03:15:40