如何通过request.get传递复选框参数?网站表格下载技术求助
搞定BOM网站IFD数据下载的问题
嘿,我来帮你解决这个表格下载的难题!先说说你代码里的几个小问题,再给你调整后的可行方案:
你当前代码的问题
- 直接把
browsercookie模块传给requests.get的cookies参数是错误的,得用模块里的方法加载对应浏览器的cookies才行; - URL里的参数转义符
&要换成正常的&,不然服务器可能识别不了; - 这类网站通常需要先访问主页面建立会话,直接跳转到带参数的URL容易被拦截。
调整后的解决方案
步骤1:正确加载浏览器Cookie
先确保你用浏览器打开过目标网站(不需要登录,但要让浏览器保存会话信息),然后用browsercookie加载对应浏览器的cookies:
import requests import browsercookie # 加载Chrome的cookies,用Firefox就换成browsercookie.firefox(),自动检测用browsercookie.load() cookies = browsercookie.chrome()
步骤2:建立会话并访问主页面
用requests.Session()维持会话,先访问工具主页面获取必要的会话cookie:
session = requests.Session() # 先访问IFD工具的主页面 main_url = 'http://www.bom.gov.au/water/designRainfalls/revised-ifd/' session.get(main_url, cookies=cookies) # 可选:添加User-Agent模拟浏览器,避免被反爬拦截 session.headers.update({ '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' })
步骤3:构造请求参数并获取数据
按照网站复选框对应的参数构造请求(这里假设你要勾选分钟和小时数据的复选框,对应sdmin和sdhr):
# 构造参数,对应页面上的复选框和输入项 params = { 'coordinate_type': 'dd', 'latitude': '-35', 'longitude': '144', 'sdmin': 'true', # 分钟数据复选框 'sdhr': 'true', # 小时数据复选框 # 'sdday': 'true', # 如果需要日数据就保留,不需要就注释 'user_label': '', 'year': '2016' } # 发送GET请求获取数据 response = session.get('http://www.bom.gov.au/water/designRainfalls/revised-ifd/', params=params, cookies=cookies) # 检查请求是否成功 if response.status_code == 200: # 保存响应内容到本地,之后可以提取表格 with open('ifd_tables.html', 'w', encoding='utf-8') as f: f.write(response.text) print("数据下载成功啦!可以打开保存的HTML提取表格~") else: print(f"请求失败,状态码:{response.status_code}")
备选:如果GET请求不行,试试POST
有些网站的表单是用POST提交的,你可以打开浏览器开发者工具(F12),勾选复选框点击提交,查看网络请求的方法。如果是POST,把上面的session.get换成:
response = session.post('http://www.bom.gov.au/water/designRainfalls/revised-ifd/', data=params, cookies=cookies)
关于browsercookie不生效的额外提示
- 可能你加载的浏览器不对,比如用的是Edge却调用了
browsercookie.chrome(),试试browsercookie.load()自动检测; - 如果还是不行,可以手动从浏览器复制cookie,放到requests的cookies参数里(格式是字典:
{'cookie_name': 'cookie_value'})。
内容的提问来源于stack exchange,提问作者William TL
相关产品推荐
相关产品推荐

