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

如何遍历无URL索引网站?chainplay.gg多页数据爬取求助

解决Chainplay.gg多页数据爬取问题

问题分析

你当前的代码通过解析页面中的__NEXT_DATA__脚本只能获取第一页数据,原因是网站的分页数据采用后端API异步加载机制,初始页面仅渲染第一页内容,后续页面需要单独请求对应接口获取。

解决方案

通过浏览器开发者工具抓包可定位到游戏列表的分页API接口,直接循环请求该接口的所有页码(1到45),收集全量数据后统一写入CSV即可:

完整代码

import requests
import csv

# 配置请求头,模拟浏览器访问避免被拦截
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"
}

all_games = []
total_pages = 45  # 已知总页数为45

# 循环请求每一页数据
for page in range(1, total_pages + 1):
    api_url = f"https://chainplay.gg/api/games?page={page}"
    response = requests.get(api_url, headers=headers)
    
    # 检查请求状态,跳过失败的页面
    if response.status_code != 200:
        print(f"第{page}页请求失败,状态码: {response.status_code}")
        continue
    
    page_data = response.json()
    page_games = page_data.get("games", [])
    all_games.extend(page_games)
    print(f"已获取第{page}页,共{len(page_games)}条数据")

# 将全量数据写入CSV文件
if all_games:
    with open('all_games.csv', 'w', newline='', encoding='utf-8') as data_file:
        csv_writer = csv.writer(data_file)
        # 写入表头
        csv_writer.writerow(all_games[0].keys())
        # 写入所有数据行
        for game in all_games:
            csv_writer.writerow(game.values())
    print(f"全量数据已写入all_games.csv,共{len(all_games)}条")
else:
    print("未获取到任何有效数据")

关键说明

  • API接口定位:通过浏览器F12「网络」面板,翻页时可观察到/api/games?page=X格式的请求,这就是分页数据的直接来源。
  • 请求头设置:添加User-Agent模拟正常浏览器访问,避免被服务器识别为爬虫拦截。
  • 分页处理:遍历1到45页,将每一页返回的games列表合并到总数据列表中,确保不遗漏任何页面。
  • CSV写入优化:统一收集完所有数据后再写入文件,避免重复写入表头,提升处理效率。

关于Selenium尝试无效的说明

若之前用Selenium未成功,大概率是因为网站翻页需要精准模拟交互(如滚动触底、点击分页按钮),但直接调用API的方式比Selenium更高效、稳定,无需处理页面渲染和交互的复杂逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 10:17:41