如何用requests和bs4获取网站分页数据?以Fuel Rats排行榜为例
解决动态分页排行榜的爬取问题
首先明确:仅用requests和bs4完全可以搞定,但不能通过解析HTML模拟点击按钮——因为这个页面的分页是AJAX动态加载的:点击“下一页”时,页面会悄悄向后端发送一个API请求,拿到新的分页数据后再渲染到页面上,所以URL不会变化。
具体操作步骤:
找到后台数据接口
打开浏览器开发者工具(F12),切换到「Network」标签,点击页面的“下一页”按钮,在请求列表里找类型为XHR或Fetch的请求。你会发现类似https://fuelrats.com/api/v1/leaderboard的接口,请求参数里包含分页信息(比如page=2、limit=25)。直接请求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条示例数据验证帕累托分布
拿到所有数据后,即可排序计算前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
相关产品推荐
相关产品推荐

