def fetch_announcements(start_date, end_date, page_num=1, page_size=30): url = "https://www.cninfo.com.cn/new/hisAnnouncement/query" body = { "pageNum": page_num, "pageSize": page_size, "column": "szse", "tabName": "fulltext", "plate": "", "stock": "", "searchkey": "", "secid": "", "category": "category_ndbg_szsh", "trade": "", "seDate": f"{start_date}~{end_date}", "sortName": "", "sortType": "", "isHLtitle": "true" } # 发送 POST 请求 response = requests.post(url, headers=headers, data=body)
时间: 2025-05-25 10:08:13 浏览: 30
### 如何使用 Python 通过 POST 请求从 https://www.cninfo.com.cn 获取公告数据
要实现从指定网站获取公告信息的功能,可以按照以下方法编写代码。此过程涉及模拟 HTTP 请求并处理可能存在的加密逻辑。
#### 准备工作
为了成功发送请求并解析返回的数据,需准备以下几个部分:
1. **目标 URL**: `https://www.cninfo.com.cn/new/cninfo-search-announcement/search` 是用于搜索公告的接口。
2. **请求头 (Headers)**: 包括必要的字段如 `User-Agent`, `Content-Type`, 和其他动态生成的内容(如果存在)。
3. **表单数据 (Form Data)**: 提供筛选条件,例如关键字、时间范围等。
4. **解密机制**: 如果服务器端对某些参数进行了加密,则需要逆向分析其加密算法,并利用工具如 `execjs` 或者 `PyExecJS` 来运行 JavaScript 代码完成加解密操作。
以下是基于上述需求的一个基本示例:
```python
import requests
from datetime import datetime
url = "https://www.cninfo.com.cn/new/cninfo-search-announcement/search"
headers = {
'Accept': '*/*',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
'Connection': 'keep-alive',
'Host': 'www.cninfo.com.cn',
'Origin': 'https://www.cninfo.com.cn',
'Referer': 'https://www.cninfo.com.cn/new/disclosure/scrollAnnouncement?pageNum=1&pageSize=30&tabName=announcements&sortName=&sortType=&searchText=%E5%85%A8%E9%83%A8&secCode=&plate=szzb&channelId=&category=&tradeType=&column=szse_mainboard&stock=&area=&startTime=&endTime=&limitTime=&showTitle=&isRead=&firstBoard=&raiseFormat=&pageNo2=&relationSeccode=&keyword=' ,
'Sec-Fetch-Dest': 'empty',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Site': 'same-origin',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36'
}
data = {
"pageNum": 1,
"pageSize": 30,
"column": "szse",
"tabName": "fulltext",
"searchkey": "", # 可选填入关键词
"secid": "",
"Plate": "",
"ChannelID": "",
"category": "",
"trade": "",
"seDate": f"{datetime.now().strftime('%Y-%m-%d')}~{datetime.now().strftime('%Y-%m-%d')}" # 时间区间设置为当天
}
response = requests.post(url=url, headers=headers, json=data)
if response.status_code == 200:
announcements_data = response.json()
print(announcements_data)
else:
print(f"Failed to fetch data with status code {response.status_code}")
```
以上脚本定义了一个简单的爬虫程序来访问 cninfo 的公告 API 并提取 JSON 响应中的内容[^1]。注意实际应用时还需要考虑更多细节比如异常捕获、分页加载以及应对反爬措施等问题。
#### 处理复杂场景下的 mcode 参数
当遇到类似之前提到过的 mcode 这样的特殊验证项时,通常它是由前端执行的一段 JS 脚本来计算得出的结果。此时可以通过如下方式解决:
- 利用浏览器开发者工具定位到具体的加密函数;
- 将该函数复制下来保存成单独 .js 文件形式;
- 在本地项目里借助 ExecJS 库调用这段原始 js 实现同样的效果。
下面给出一段伪代码展示如何集成此类功能:
```python
import execjs
def generate_mcode():
ctx = execjs.compile("""
function getMCode(){
var result;
// paste your javascript here which generates the mcode value.
return result;
}
""")
return ctx.call("getMCode")
custom_headers['mcode'] = generate_mcode()
```
这样就可以动态生成所需的额外认证令牌了[^2]。
#### 数据清洗与存储
最后一步是对抓取回来的信息做进一步加工整理以便后续分析或者入库存档等工作流环节衔接顺畅无阻塞现象发生。这里推荐采用 Pandas DataFrame 结构化表格样式呈现最终成果物样貌特征更加直观清晰明了易懂便于分享交流学习探讨研究深入挖掘潜在价值所在之处[^3]。
阅读全文
相关推荐















