如何使用Python提交请求提取.aspx页面内的表格数据(2022)
问题原因
你的代码拿不到目标表格,是以下几个关键错误导致的:
- 请求头完全错配且未生效:你定义的headers里
Origin填的是印度邮政域名、Referer填的是印度理工学院的页面地址,和纳斯达克目标站点完全无关,很容易触发反爬拦截。同时你自定义的MyOpener没有加载你写的headers配置,两次请求都处于无有效请求头的裸奔状态。 - 表单校验值提取错误:ASP.NET页面的
__VIEWSTATE、__EVENTVALIDATION是服务端校验请求合法性的核心字段,你用findAll拿到的是整个input标签的对象列表,不是标签的value属性值,POST出去的是无效的标签对象字符串,服务端校验不通过就会返回默认空页面。 - 缺失必要表单字段:你只传了3个表单字段,实际ASP.NET页面表单还包含
__EVENTTARGET、__EVENTARGUMENT等必填隐藏域,缺任何一个都可能导致服务端不返回正确内容。而且你第二次发起POST请求时没有指定任何触发事件的参数,本质就是无效的重复刷新请求。 - 响应处理逻辑缺失:你在请求头里声明接受gzip/deflate压缩格式的响应,但没有写对应的解压逻辑,拿到的是二进制压缩数据,直接传给BeautifulSoup根本解析不出正常文本。另外你用的
urllib.request.FancyURLopener是Python2时代的遗留类,对HTTPS、表单编码的兼容性很差。 - 解析代码写错:BeautifulSoup对象没有
content属性,你最后打印的内容本身就是无效值,就算拿到正确页面也会报错。
修正方案
首次加载当前交易日的交易暂停数据根本不需要发POST请求,直接GET就能拿到完整表格内容,用requests库处理请求可以自动解决压缩、编码、请求头传递的兼容问题,参考代码如下:
import requests from bs4 import BeautifulSoup # 配置匹配目标站点的请求头 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', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language': 'en-US,en;q=0.9', 'Referer': 'https://www.nasdaqtrader.com/Trader.aspx?id=TradeHalts' } url = 'https://www.nasdaqtrader.com/trader.aspx?id=TradeHalts' # 发起GET请求,自动处理gzip解压、编码适配 resp = requests.get(url, headers=headers) resp.encoding = 'utf-8' soup = BeautifulSoup(resp.text, 'html.parser') # 直接定位交易暂停目标表格 halt_table = soup.find('table', {'id': 'TradeHaltsTable'}) # 逐行提取表格数据 for row in halt_table.find_all('tr')[1:]: # 跳过表头行 cells = [cell.get_text(strip=True) for cell in row.find_all('td')] print(cells)
如果需要查询指定日期的历史暂停记录,再构造POST请求:把第一次GET拿到的所有隐藏input的name和value都放进formdata,同时给
__EVENTTARGET、__EVENTARGUMENT赋上对应查询按钮的触发值,再POST到同个地址就能拿到查询结果,不要随意删减表单里的隐藏字段。
内容的提问来源于stack exchange,提问作者xiaxio
相关产品推荐
相关产品推荐

