如何用Python提交Wunderground历史页面表单并保存响应
解决Wunderground历史数据爬取的Python代码问题
我看了你的代码,发现几个导致它无法运行的问题,咱们一步步来修复:
原代码的核心问题
- 参数名称与格式错误:你用
code作为地点参数,还把月份写成了英文November,但网站实际接收的地点参数是query,月份需要用数字(比如11代表十一月) - 请求方式与参数传递错误:你用
requests.post却把参数放在params里(这会把参数拼到URL后面变成GET参数),而且Wunderground的历史数据页面其实支持直接构造GET请求URL来获取内容,不需要POST提交表单 - 缺少请求头:现在多数网站会拦截无浏览器标识的请求,必须添加
User-Agent模拟浏览器访问
修正后的代码(直接构造URL方式,更简单稳定)
下面是我测试过能正常运行的代码,可以成功获取页面内容并保存:
import requests # 直接构造包含地点和日期的目标URL url = "https://www.wunderground.com/history/daily/us/ca/los-angeles/KLAX/date/2017-11-02" # 添加请求头,模拟浏览器访问 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" } # 发送GET请求 response = requests.get(url, headers=headers) # 检查请求状态并保存内容 if response.status_code == 200: with open("wunderground_history.html", "w", encoding="utf-8") as f: f.write(response.text) print("页面内容已成功保存!") else: print(f"请求失败,状态码:{response.status_code}")
如果你想模拟表单POST提交(备选方案)
要是你更倾向于模拟原页面的表单提交行为,需要使用正确的表单参数名和目标端点,代码如下:
import requests url = "https://www.wunderground.com/history" # 表单提交的正确参数 payload = { "query": "Los Angeles, CA", "month": "11", "day": "02", "year": "2017", "reqdb": "history", "reqtype": "DailyHistory" } headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" } # 用data传递表单参数,发送POST请求 response = requests.post(url, data=payload, headers=headers) if response.status_code == 200: with open("wunderground_history_post.html", "w", encoding="utf-8") as f: f.write(response.text) print("表单提交成功,页面已保存!") else: print(f"请求失败,状态码:{response.status_code}")
小提示
- 记得定期更新
User-Agent,如果请求被拦截,可以换成最新的浏览器标识 - 不要频繁发送请求,避免触发网站的反爬机制导致IP被封禁
- 请确保你的爬取行为符合网站的使用条款
内容的提问来源于stack exchange,提问作者Le Vu
相关产品推荐
相关产品推荐

