如何遍历无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
相关产品推荐
相关产品推荐

