Python3.10+Requests+BeautifulSoup爬取汇率数据:页面无法更新
解决sanarate.ir指定波斯历日期汇率抓取问题
问题核心是你只传递了日期参数,但网站的POST请求需要多个动态生成的参数(比如CSRF令牌、页面状态参数等)才能正确触发数据查询,仅传日期会被服务器判定为无效请求,返回首页数据。
解决步骤:
抓取完整POST参数
用Chrome开发者工具重新监控请求:- 打开网站,输入测试日期(比如1401/11/16),点击查询按钮
- 在Network面板里找到对应的POST请求(通常提交到当前页面或特定接口)
- 查看
Form Data或Payload部分,记录所有参数(比如可能有csrfmiddlewaretoken、date、隐藏字段等)
从初始页面提取动态参数
这些动态参数(比如CSRF令牌)通常嵌入在首页HTML中,需要先发送GET请求获取首页,用正则或BeautifulSoup提取。构造完整POST请求
将提取到的动态参数和目标波斯历日期一起放入请求体,发送POST请求。
代码示例(Python + requests):
import requests from bs4 import BeautifulSoup # 目标网站URL base_url = "http://www.sanarate.ir/" target_date = "1401/11/16" # 测试日期 # 第一步:获取首页,提取动态参数 session = requests.Session() # 用Session维持会话,自动处理Cookie response = session.get(base_url) soup = BeautifulSoup(response.text, "html.parser") # 提取CSRF令牌(根据实际页面字段名调整,比如可能是csrfmiddlewaretoken) csrf_token = soup.find("input", {"name": "csrfmiddlewaretoken"})["value"] # 第二步:构造完整POST参数(根据开发者工具抓到的参数补充) post_data = { "csrfmiddlewaretoken": csrf_token, "date": target_date, "submit": "جستجو" # 替换成页面查询按钮的实际value(波斯语查询) # 补充其他抓到的参数,比如隐藏字段、状态参数等 } # 第三步:发送POST请求 headers = { "Referer": base_url, # 必须带上Referer模拟浏览器行为 "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" } result_response = session.post(base_url, data=post_data, headers=headers) # 处理返回结果,提取汇率数据 result_soup = BeautifulSoup(result_response.text, "html.parser") # 根据页面实际结构提取表格数据,示例如下 exchange_table = result_soup.find("table") if exchange_table: rows = exchange_table.find_all("tr")[1:] # 跳过表头 for row in rows: cols = row.find_all("td") if len(cols) >= 2: currency = cols[0].text.strip() rate = cols[1].text.strip() print(f"{currency}: {rate}")
注意事项:
- 必须根据开发者工具抓到的实际参数补充
post_data,比如部分网站会有__VIEWSTATE这类ASP.NET动态参数,都要从首页提取 - 保持会话(Session)连贯,Cookie中可能包含会话状态信息
- 请求头尽量贴近浏览器,避免被反爬拦截
内容的提问来源于stack exchange,提问作者George
相关产品推荐
相关产品推荐

