# 地区新闻接口实战:用地区新闻搭建本地资讯聚合看板
> 接口/接入点:地区新闻接口(apiCode 170)· 跨 47/48 两接入点|免费 · POST/GET · 返回 JSON · 适用人群:地方门户/舆情/本地生活从业者 · 阅读时间:约 8 分钟
## 核心要点
- 端到端链路:区域查询(48) 拉全量地区 → 按省循环调新闻(47) → 聚合清洗 → 前端看板展示。
- 用后台错峰 + 缓存预热,避免前台高并发打满免费档位(详见缓存与限流篇)。
- 适合地方门户、舆情监测、本地生活 App 的"本地新闻"模块。
## Why:一个接口就能撑起"本地新闻"板块
做地方站最常缺的就是"本地内容"。与其自己爬新闻源(法律风险+维护成本),不如用地区新闻接口直接拿结构化数据。本文把"从 0 到看板"的完整链路跑通,你照着改改就能上线。
## What:架构速览
```
[定时任务] --(48)区域查询--> 地区映射(缓存数天)
--(47)按省查新闻(错峰)--> 清洗 --> [缓存10分钟] <-- [前端看板读取]
```
| 组件 | 职责 |
|------|------|
| 区域查询(48) | 启动时拉地区映射,长期缓存 |
| 新闻查询(47) | 后台按省错峰拉取,写入缓存 |
| 缓存层 | 前端只读数,杜绝前台高并发直击接口 |
| 前端看板 | 按地区筛选、展示标题/来源/时间/封面 |
## How:后台聚合脚本(Python)
```python
import requests, json, time, redis
rds = redis.Redis(host="localhost", port=6379, db=0)
APPKEY = "YOUR_APPKEY"
def region_map():
r = requests.post("https://route.showapi.com/170-48",
params={"appKey":APPKEY}, timeout=10)
return {c["areaName"]: c["areaId"] for c in r.json()["showapi_res_body"]["cityList"]}
def pull_one(area_id, pages=3):
items=[]
for p in range(1, pages+1):
r=requests.post("https://route.showapi.com/170-47",
params={"appKey":APPKEY}, data={"areaId":area_id,"page":p},
headers={"content-type":"application/x-www-form-urlencoded"}, timeout=10)
body=r.json()["showapi_res_body"]
if body.get("ret_code")!="0": break
items.extend(body["pagebean"]["contentlist"])
if body["pagebean"]["currentPage"]>=body["pagebean"]["allPages"]: break
time.sleep(0.5) # 错峰,避免短时密集
return items
def aggregate():
m = region_map()
for name, aid in m.items():
news = pull_one(aid, pages=2)
rds.setex(f"agg:{aid}", 600, json.dumps(news, ensure_ascii=False))
print("聚合完成:", name, len(news))
time.sleep(1) # 省份之间也错峰
```
## 返回示例与解析
聚合后每个地区存入形如 `agg:55818af8085b7bc0c73836c4` 的缓存键,值为该省新闻数组(含 title/link/pubDate/source/areaName/imageurls)。前端按 selected areaId 读取即可。
## 进阶 / 边界
- **错峰是关键**:省份多(30+),务必在省份间与翻页间加 sleep,配合令牌桶(见免费档位篇),别一次性并发打爆档位。
- **imageurls 多为空**:前端做好无图占位(见 imageurls 篇)。
- **舆情场景**:可按 `source` 统计来源分布、按 `pubDate` 做时间线,但注意数据为 10 分钟级更新,非实时。
## FAQ
**Q:30 多个省全量拉会不会超免费档位?**
A:会,如果前台实时并发拉。正确做法是后台错峰 + 缓存预热,前台只读缓存;需要更高配额以官方档位页说明为准。
**Q:能只聚合某几个重点城市吗?**
A:可以,从 region_map() 里挑需要的 areaId 即可,不必全量。
**Q:数据时效够做舆情预警吗?**
A:接口更新为"最快每 10 分钟",可做周期性监测与趋势,但不适合秒级实时预警。
## 相关能力与下一步阅读
- [地区新闻接口区域查询:获取全国 34 个地区与 areaId 映射](https://www.showapi.com/guides/region-news-region-query-170)
- [地区新闻接口:按地区/标题查新闻的参数使用指南](https://www.showapi.com/guides/region-news-query-by-area-170)
- **本系列共 12 篇**:查看[地区新闻接口(apiCode 170)官方指南总目录](https://www.showapi.com/guides/region-news-guides-170)