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

如何用requests和bs4获取网站分页数据?以Fuel Rats排行榜为例

解决动态分页排行榜的爬取问题

首先明确:仅用requests和bs4完全可以搞定,但不能通过解析HTML模拟点击按钮——因为这个页面的分页是AJAX动态加载的:点击“下一页”时,页面会悄悄向后端发送一个API请求,拿到新的分页数据后再渲染到页面上,所以URL不会变化。

具体操作步骤:

  1. 找到后台数据接口
    打开浏览器开发者工具(F12),切换到「Network」标签,点击页面的“下一页”按钮,在请求列表里找类型为XHR或Fetch的请求。你会发现类似https://fuelrats.com/api/v1/leaderboard的接口,请求参数里包含分页信息(比如page=2、limit=25)。

  2. 直接请求API接口获取全量数据
    找到接口后,用requests直接请求每一页的接口即可,无需解析HTML页面。示例代码如下:

    import requests
    
    # 基础接口地址
    api_url = "https://fuelrats.com/api/v1/leaderboard"
    # 每页条数和初始页码
    limit = 25
    page = 1
    all_rescue_counts = []
    
    while True:
        # 构造请求参数
        params = {
            "page": page,
            "limit": limit
        }
        # 发送请求
        response = requests.get(api_url, params=params)
        # 解析JSON数据
        data = response.json()
        
        # 提取当前页的救援次数
        for item in data["data"]:
            all_rescue_counts.append(item["rescues"])
        
        # 判断是否还有下一页:如果当前页数据不足25条,或者已到最后一页,停止循环
        if len(data["data"]) < limit or page >= data["meta"]["totalPages"]:
            break
        
        # 页码加1,继续请求下一页
        page += 1
    
    # 输出结果
    print(f"共获取到{len(all_rescue_counts)}条救援数据")
    print(all_rescue_counts[:10])  # 打印前10条示例数据
    
  3. 验证帕累托分布
    拿到所有数据后,即可排序计算前20%人员的救援占比:

    # 按救援次数降序排序
    all_rescue_counts.sort(reverse=True)
    total_rescues = sum(all_rescue_counts)
    top_20_percent_count = int(len(all_rescue_counts) * 0.2)
    top_20_rescues = sum(all_rescue_counts[:top_20_percent_count])
    top_20_ratio = top_20_rescues / total_rescues * 100
    
    print(f"前20%人员完成了{top_20_ratio:.2f}%的救援任务")
    

为什么不用bs4解析页面?

直接请求API接口拿到的是结构化JSON数据,比解析HTML效率更高、稳定性更强——HTML结构可能随页面改版变化,但API接口的格式通常不会轻易改动。

内容的提问来源于stack exchange,提问作者J.Doe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 17:15:36