你希望将之前的爬虫从 `https://sousuo.www.gov.cn` 改为 **人民网数据平台** 的新网址:
👉 `https://data.people.com.cn/pd/gjzcxx`
我们来分析这个网站并编写对应的爬虫代码。
---
### 🔍 网站分析:https://data.people.com.cn/pd/gjzcxx
这是一个政策法规信息平台,提供国家级政策信息。但该网站具有较强的反爬机制和前端渲染特性(可能是 Vue/React),真实数据通过 **API 接口动态加载**。
经过分析,其核心数据接口为:
```
POST https://data.people.com.cn/pd/api/v1/policy/page
```
请求方式:`POST`
内容类型:`application/json`
需要携带分页参数和搜索关键词。
---
### ✅ 修复并适配后的完整爬虫代码(适用于人民网政策库)
```python
import requests
import pandas as pd
import os
import json
from datetime import datetime
import time
import random
# ====================
# 配置参数
# ====================
SAVE_FOLDER = r"D:\Data" # 保存路径
KEYWORD = "适老化" # 搜索关键词
MAX_PAGES = 10 # 最大爬取页数(每页10条)
DELAY = 2.0 # 请求延迟(防止被封)
START_PAGE = 1
HEADERS = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
'Accept': 'application/json, text/plain, */*',
'Content-Type': 'application/json;charset=UTF-8',
'Origin': 'https://data.people.com.cn',
'Referer': 'https://data.people.com.cn/pd/gjzcxx',
'Sec-Fetch-Site': 'same-origin',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Dest': 'empty',
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
}
# 创建保存目录
os.makedirs(SAVE_FOLDER, exist_ok=True)
# ====================
# 爬取函数
# ====================
def crawl_people_policies(keyword, max_pages=MAX_PAGES):
"""爬取人民网政策数据"""
print(f"🚀 开始爬取人民网政策库中关于'{keyword}'的数据...")
api_url = "https://data.people.com.cn/pd/api/v1/policy/page"
all_policies = []
page = START_PAGE
try:
while page <= max_pages:
time.sleep(DELAY + random.uniform(0, 0.5)) # 延迟防封
print(f"📄 正在爬取第 {page} 页...")
# 构造请求体(关键参数)
payload = {
"pageNum": page,
"pageSize": 10,
"title": keyword, # 标题搜索关键词
"pubOrg": "", # 发布机构(可留空)
"levelCode": "", # 级别(如国家级、省级)
"themeCode": "", # 主题分类
"pubDateStart": "", # 起始时间(可选)
"pubDateEnd": "",
"sortField": "pubDate", # 排序字段
"sortOrder": "desc" # 降序排列
}
try:
response = requests.post(
api_url,
headers=HEADERS,
data=json.dumps(payload),
timeout=15
)
if response.status_code != 200:
print(f"⚠️ 请求失败,状态码: {response.status_code}")
break
data = response.json()
# 检查返回结构是否正常
if data.get("code") != 200:
msg = data.get("msg", "未知错误")
print(f"❌ 接口返回错误: {msg}")
if "频繁" in msg or "限流" in msg:
print("💡 建议增加 DELAY 或更换 IP")
break
result_list = data.get("result", {}).get("list", [])
if not result_list:
print(f"ℹ️ 第 {page} 页无更多数据,停止爬取")
break
# 提取每条政策信息
for item in result_list:
try:
all_policies.append({
"标题": item.get("title", "").strip(),
"文号": item.get("docNumber", ""),
"发文机构": item.get("pubOrg", ""),
"发布日期": item.get("pubDate", "")[:10] if item.get("pubDate") else "",
"实施日期": item.get("implDate", "")[:10] if item.get("implDate") else "",
"主题分类": item.get("themeName", ""),
"效力级别": item.get("levelName", ""),
"URL": f"https://data.people.com.cn/pd/detail/{item.get('id')}" if item.get('id') else ''
})
except Exception as e:
print(f"❌ 解析条目出错: {e}")
print(f"✅ 第 {page} 页成功获取 {len(result_list)} 条数据")
page += 1
except requests.exceptions.Timeout:
print(f"⏰ 第 {page} 页请求超时")
continue
except json.JSONDecodeError:
print(f"❌ 第 {page} 页返回非JSON格式数据")
break
except Exception as e:
print(f"❌ 爬取过程中发生异常: {e}")
print(f"🎉 爬取完成!共获取 {len(all_policies)} 条相关政策")
return all_policies
# ====================
# 保存到 CSV 文件
# ====================
def save_to_csv(data, folder):
"""保存数据为 CSV"""
if not data:
print("⚠️ 没有数据可保存")
return None
df = pd.DataFrame(data)
df.sort_values(by="发布日期", ascending=False, inplace=True)
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
filename = f"人民网_适老化政策_{timestamp}.csv"
filepath = os.path.join(folder, filename)
try:
df.to_csv(filepath, index=False, encoding='utf-8-sig')
print(f"💾 数据已保存至: {filepath}")
return filepath
except Exception as e:
print(f"❌ 文件保存失败: {e}")
return None
# ====================
# 主程序入口
# ====================
if __name__ == "__main__":
policies = crawl_people_policies(KEYWORD, MAX_PAGES)
if policies:
saved_file = save_to_csv(policies, SAVE_FOLDER)
if saved_file:
preview_df = pd.DataFrame(policies[:5])
print("\n📋 数据预览(前5条):")
print(preview_df[["标题", "发文机构", "发布日期", "文号"]].to_string(index=True, max_colwidth=50))
```
---
### 📌 代码说明
| 功能 | 说明 |
|------|------|
| `POST /pd/api/v1/policy/page` | 获取政策列表的核心 API |
| `payload.title` | 设置搜索关键词(如“适老化”) |
| `pageNum/pageSize` | 分页控制(每页10条) |
| `sortField="pubDate"` | 按发布时间排序 |
| `id → detail URL` | 构造详情页链接:`https://data.people.com.cn/pd/detail/{id}` |
| `encoding='utf-8-sig'` | 保证 Excel 打开不乱码 |
---
### ⚠️ 注意事项
1. **反爬机制较强**
- 可能出现 `"访问过于频繁"` 或 `403` 错误
- 建议:
- 提高 `DELAY` 到 3~5 秒
- 使用代理 IP(如有)
- 非高峰时段运行
2. **无需登录但可能需要验证码**
- 如果后续出现滑块验证或 token 加密,请使用 Selenium 模拟浏览器操作
3. **字段映射说明**
- `docNumber`: 文号
- `pubOrg`: 发文机关
- `themeName`: 主题名称(如“民政”、“养老”)
- `levelName`: 效力级别(如“国家级”、“部门规章”)
---
### ✅ 运行前准备
```bash
pip install requests pandas
```
确保目标路径 `D:\Data` 存在,否则会自动创建。
---