如何用requests.post结合BeautifulSoup抓取无URL变化的子页面?
搞定表单POST参数构造问题
我明白你的问题了——这个页面用表单提交切换内容但不改变URL,所以必须精准构造POST参数才能拿到"OTHER INFORMATION"的内容。核心是要先从初始页面抓取服务器生成的隐藏字段,再加上触发目标页面的关键参数statview=2。
接下来一步步来:
第一步:先抓初始页面的表单基础参数
首先得发GET请求到目标页面,把form1_2date里的隐藏字段、默认值都捞出来,尤其是keyf这种服务器生成的验证字段,不带它的话POST请求大概率会被拒绝。用requests.Session还能自动帮你管理Cookie,避免会话不一致的问题:
import requests from bs4 import BeautifulSoup url = 'https://www.mmorpg-stat.eu/0_fiche_alliance.php?pays=5&ftr=500208.all&univers=_146' # 初始化会话,自动保持Cookie session = requests.Session() initial_response = session.get(url) soup = BeautifulSoup(initial_response.text, 'html.parser') # 定位到目标表单form1_2date form = soup.find('form', {'name': 'form1_2date'}) # 提取表单里的有效参数 form_data = {} for input_tag in form.find_all('input'): name_attr = input_tag.get('name') value_attr = input_tag.get('value', '') # 跳过无name属性的字段,以及仅用于触发提交的button按钮(不属于表单提交数据) if not name_attr or input_tag.get('type') == 'button': continue # 未勾选的复选框不需要传入参数 if input_tag.get('type') == 'checkbox' and not input_tag.get('checked'): continue form_data[name_attr] = value_attr # 关键操作:根据按钮的onclick逻辑,将statview设为2,这是切换到"OTHER INFORMATION"页面的标识 form_data['statview'] = '2'
第二步:发送POST请求获取目标页面
现在用构造好的参数发POST请求,就能拿到你要的子页面内容了:
# 发送POST请求 target_response = session.post(url, data=form_data) # 解析页面内容,提取你需要的信息 target_soup = BeautifulSoup(target_response.text, 'html.parser') # 这里就可以处理"OTHER INFORMATION"区域的内容了
为什么这么构造参数?我给你拆解下表单字段:
keyf:隐藏字段,服务器用来验证请求合法性的凭证,必须从初始页面实时获取,不能硬编码。zoomgraph_box:复选框,默认未勾选,所以无需传入参数。date_1/date_2:日期字段,直接使用页面默认值即可;如果需要自定义日期,修改form_data里的对应值即可(注意格式要和页面一致,比如DD-MM-YYYY)。plot_1:隐藏字段,初始值为空,无需修改。statview:核心参数!按钮点击时会将其设为2,对应"OTHER INFORMATION"页面;值0和1则对应另外两个页面。statview_bis:隐藏字段,保留初始值即可。- 各类Submit按钮:都是
type="button",仅用于触发提交的交互元素,不属于表单提交数据,所以不用放进POST参数里。
额外提醒
- 务必使用
requests.Session():网站可能通过Cookie跟踪会话,不用Session的话,POST请求可能会被判定为非法请求。 - 不要硬编码隐藏字段值:比如
keyf这类字段可能会随会话变化,每次请求都从初始页面抓取才是可靠的做法。
内容的提问来源于stack exchange,提问作者sound wave
相关产品推荐
相关产品推荐

