使用__doPostBack分页的BrickEconomy站点爬取仍返回首页数据问题求助
问题修复方案
- 修正请求URL为HTTPS协议,原代码使用的HTTP会触发站点301重定向,重定向后请求自动转为GET请求,自然返回第一页内容。
- 新增
__EVENTVALIDATION隐藏字段提取,ASP.NET WebForm的PostBack请求默认会校验该字段,缺失会导致分页参数失效。 - 使用
requests.Session()维持会话,统一管理Cookie,保证多次请求被站点识别为同一会话。 - 请求头新增
X-Requested-With: XMLHttpRequest,标记为AJAX异步请求,符合站点分页接口的预期请求格式。 - 如果需要爬取多页,每次请求完新页面后,要从返回的内容里提取最新的
__VIEWSTATE、__VIEWSTATEGENERATOR、__EVENTVALIDATION值,用于下一次分页请求,这三个值每次页面刷新都会更新,不能一直复用第一页的数值。
修复后的参考代码
import requests from bs4 import BeautifulSoup # 初始化会话 保持cookie session = requests.Session() 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', 'X-Requested-With': 'XMLHttpRequest' } # 修正为https协议 url = "https://www.brickeconomy.com/sets/theme/collectable-minifigures" # 先请求第一页 获取初始状态字段 page_content = session.get(url, headers=headers).content soup = BeautifulSoup(page_content, 'html.parser') # 提取三个必要的状态字段 VIEWSTATEGENERATOR = soup.find('input',{'id':'__VIEWSTATEGENERATOR'}).get('value') VIEWSTATE = soup.find('input',{'id':'__VIEWSTATE'}).get('value') EVENTVALIDATION = soup.find('input',{'id':'__EVENTVALIDATION'}).get('value') data = { "ctl00$ScriptManager1": "ctl00$ContentPlaceHolder1$ctlSets$UpdatePanelMain|ctl00$ContentPlaceHolder1$ctlSets$GridViewSets", "ctl00$txtSearchHeader2": "", "ctl00$txtSearchHeader": "", "subthemesorter": "", "setsorter": "SetNumberDESC", "ctl00$LoginModalUsername": "", "ctl00$LoginModalPassword": "", "__EVENTTARGET": "ctl00$ContentPlaceHolder1$ctlSets$GridViewSets", "__EVENTARGUMENT": "Page$2", "__VIEWSTATE":VIEWSTATE, "__VIEWSTATEGENERATOR": VIEWSTATEGENERATOR, "__EVENTVALIDATION": EVENTVALIDATION, "__ASYNCPOST": 'true' } res = session.post(url, data=data, headers=headers).content # 此时返回的就是第二页内容 print(BeautifulSoup(res, 'html.parser').find_all(class_ = 'mb-5'))
内容的提问来源于stack exchange,提问作者Phyllis Loo
相关产品推荐
相关产品推荐

