使用BeautifulSoup爬取Steam多页特惠数据时每页返回相同内容如何解决
问题排查及修复方案
核心原因
你用的#p=页码是浏览器前端锚点参数,不会被发送到服务端,所以不管你循环的page值是多少,requests.get()发送的请求实际都是指向Steam特惠首页,自然每次返回的都是第一页的静态内容,分页是浏览器端JS加载额外接口实现的。
修复步骤
- 第一步:抓包获取真实的分页AJAX接口,Steam特惠TopSellers分页的真实请求参数是用
start控制偏移量,每页默认返回15条数据,第n页对应start = n * 15 - 第二步:请求时添加
User-Agent请求头,避免被Steam的反爬策略拦截 - 第三步:接口返回的是JSON格式数据,提取其中的
results_html字段再用BeautifulSoup解析即可
修正后示例代码
import requests from bs4 import BeautifulSoup game_lis = set() # 加请求头模拟浏览器访问 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" } for page in range(0,4): # 用真实分页接口,start参数控制分页偏移 start = page * 15 page_url = f"https://store.steampowered.com/contenthub/querypaginated/specials/TopSellers/render/?query=&start={start}&count=15&cc=CN&l=schinese&v=4" steam_games = requests.get(page_url, headers=headers) # 接口返回JSON,提取html内容 res_json = steam_games.json() soup = BeautifulSoup(res_json['results_html'], 'lxml') s_game_offers = soup.findAll('a', class_='tab_item') print(f"第{page+1}页数据:") for game in s_game_offers: title = game.find('div', class_='tab_item_name') discount = game.find('div', class_='discount_pct') if title and discount: # 加判空避免异常 game_lis.add(title.text) print(f"{title.text}: {discount.text}")
内容的提问来源于stack exchange,提问作者Sairam
相关产品推荐
相关产品推荐

