如何用Python向ASP.NET WebForm发送AJAX请求以替代Selenium
用Python模拟ASP.NET回发请求替代Selenium操作
当然可以用Python直接发送请求替代Selenium,速度会快很多——毕竟不用启动浏览器、渲染页面。这个按钮是ASP.NET的WebForm_DoPostBack回发按钮,只要模拟它的请求逻辑就行。
先分析按钮的回发逻辑
按钮的onclick事件里,WebForm_PostBackOptions的关键参数:
- 触发回发的控件ID:
ctl00$MainContent$btnSearch - 验证组:
chkNumbers - 其他参数说明这是同步回发(本质还是POST请求,我们可以直接模拟)
实现步骤
ASP.NET回发需要几个核心隐藏字段和表单数据,按以下步骤操作:
先获取页面的会话信息和隐藏字段
先GET目标页面,拿到Cookie和ASP.NET生成的__VIEWSTATE、__VIEWSTATEGENERATOR、__EVENTVALIDATION这几个隐藏字段,这些是页面验证和会话维持的关键。构造POST请求的表单数据
除了上面的隐藏字段,还要加上回发的目标控件ID、验证组,以及页面上其他需要提交的表单字段(比如搜索框内容、复选框状态等)。发送POST请求并处理结果
用Session维持会话,发送POST请求后解析返回的HTML获取数据。
示例代码
先安装依赖:
pip install requests beautifulsoup4
然后编写代码:
import requests from bs4 import BeautifulSoup # 替换成目标页面的实际URL target_url = "https://你的目标页面地址" # 初始化会话,维持Cookie session = requests.Session() # 第一步:获取页面的隐藏字段和会话Cookie page_response = session.get(target_url) soup = BeautifulSoup(page_response.text, "html.parser") # 提取ASP.NET核心隐藏字段 view_state = soup.find("input", id="__VIEWSTATE")["value"] view_state_generator = soup.find("input", id="__VIEWSTATEGENERATOR")["value"] event_validation = soup.find("input", id="__EVENTVALIDATION")["value"] # 构造POST表单数据 form_data = { "__VIEWSTATE": view_state, "__VIEWSTATEGENERATOR": view_state_generator, "__EVENTVALIDATION": event_validation, "__EVENTTARGET": "ctl00$MainContent$btnSearch", # 触发回发的按钮ID "__EVENTARGUMENT": "", # 回发参数,这里为空 "__VALIDATIONGROUP": "chkNumbers", # 对应按钮指定的验证组 # 这里补充页面上其他需要提交的表单字段,比如搜索框: # "ctl00$MainContent$txtSearch": "你的搜索关键词" # 如果有复选框,比如chkNumbers对应的控件,也要加上它的name和value } # 第二步:发送POST请求模拟点击Find按钮 result_response = session.post(target_url, data=form_data) # 第三步:解析返回的结果 result_soup = BeautifulSoup(result_response.text, "html.parser") # 替换成你需要提取的数据选择器 search_results = result_soup.find_all("div", class_="search-result-item") for item in search_results: print(item.get_text(strip=True))
注意事项
- 一定要用
requests.Session()维持会话,ASP.NET靠Cookie识别用户会话,不然会验证失败。 - 表单数据要和浏览器实际提交的一致:可以打开浏览器开发者工具(Network标签),点击Find按钮后查看POST请求的Form Data,把所有字段都加到
form_data里。 - 如果页面有JS动态生成的内容,可能需要额外处理,但大部分ASP.NET页面的核心字段都是静态生成的,直接提取即可。
内容的提问来源于stack exchange,提问作者user20857794
相关产品推荐
相关产品推荐

