新時空 API
完整請求(Base URL:https://www.newtimespace.com):
GET https://www.newtimespace.com/api/v1/article/getArticles?language=zh-cn&format=json
無需認證,支持 GET 與 POST(POST 可傳 JSON body)。最簡形式/api/v1/article/getArticles即可返回最新 10 條簡體中文資訊。列表僅返回摘要 summary,不含正文全文;閱讀全文需再調「資訊詳情查詢」接口。響應示例:
{
"status": "success",
"articles": [
{
"article_id": "1445506",
"title": "华夏纳指(03086.HK)盘中涨0.20%,平均价60.389港元",
"summary": "截至2026年9月9日13:51,华夏纳指(03086.HK)上涨0.20%,报60.400港元。",
"publish_time": "2026-09-09T14:54:55+08:00",
"url": "https://www.newtimespace.com/zh-cn/etf/1445506.html",
"category": "ETF"
}
],
"pagination": { "page": 1, "limit": 10, "total": 28775, "total_pages": 2878 },
"request_id": "a1b2c3d4e5f60718",
"server_time": "2026-09-23T09:30:00+08:00",
"applied_filters": {
"q": "", "category": "", "category_ids": [], "language": "zh-cn",
"start_date": "", "end_date": "", "sort": "publish_time", "order": "desc",
"format": "json", "fields": []
},
"warnings": []
}
響應爲標準 UTF-8 JSON(不帶 BOM),Content-Type: application/json,可直接 json.loads 解析。每條響應都帶 request_id(與響應頭 X-Request-Id 同值),排障或反饋問題時請一並提供。
import json, urllib.request
raw = urllib.request.urlopen(
"https://www.newtimespace.com/api/v1/article/getArticles?format=json"
).read()
data = json.loads(raw.decode("utf-8"))
for a in data["articles"]:
print(a["article_id"], a["publish_time"], a["title"])
print(data["pagination"]) # {'page': 1, 'limit': 10, 'total': 28775, 'total_pages': 2878}
| 参数 | 类型 | 必填 | 描述 | 默认值 |
|---|---|---|---|---|
q | string | 否 | 检索关键词,模糊匹配「标题」与「摘要」;建议仅传单个核心词(如「小米」),避免空格与 AND/OR/NOT 运算符 | '' |
category | string | 否 | 分类名称精确匹配,区分大小写,须与 language 配对(见下) | '' |
language | string | 否 | zh-cn / zh-hk / en,其他值回退 zh-cn | zh-cn |
start_date | string | 否 | 起始日期 YYYY-MM-DD(含当天 00:00:00) | '' |
end_date | string | 否 | 结束日期 YYYY-MM-DD(含当天 23:59:59) | '' |
page | integer | 否 | 页码,从 1 开始。超出总页数返回空数组,不报错 | 1 |
limit | integer | 否 | 每页数量,1–100;越界返回 HTTP 400(PARAMETER_OUT_OF_RANGE)。建议 10-20 以节省 Token | 10 |
sort | string | 否 | 排序字段:publish_time(发布时间)或 id;兼容旧参数 sortBy(date→publish_time、id→id) | publish_time |
order | string | 否 | 排序方向:desc(倒序)或 asc(升序) | desc |
fields | string | 否 | 稀疏字段集(逗号分隔),裁剪列表输出以节省 Token。可选 article_id,title,summary,publish_time,url,category;article_id 恒返回;留空返回全部 | '' |
format | string | 否 | json / xml,其他值按 json 返回。Accept 请求头不影响格式,请始终显式传 | json |
向後兼容:舊參數 title 會並入 q;舊參數 date 視作單日區間(start_date=end_date=date);舊參數 sortBy 等價於 sort(date→publish_time)。
category 可用值(須與 language 配對)
| language | 可用 category |
|---|---|
| zh-cn | ETF、财经、新股、科技、出海、新时空研究院 |
| zh-hk | ETF、新股、科技、出海。财经、新时空研究院 在 zh-hk 下返回空结果(简体、繁体写法均如此) |
| en | ETF、Finance、IPO、Research、Tech、Overseas |
不匹配的組合(如 zh-cn 配 IPO)返回 HTTP 200 + 空數組,不報錯;分類值不存在時同樣返回空數組,並在 warnings 中列出該 language 下的合法分類供自我修正。注意:zh-hk 的列表結果中存在 category 爲 財經 / 新時空研究院 的文章,但按這兩個值篩選 zh-hk 時返回空數組——需要這兩類繁體內容時,請用 language=zh-hk 不帶 category 拉取後再按 category 字段自行過濾。
articles 數組中每篇文章僅含以下 6 個精簡字段(爲節省 Token 已去除正文全文與冗餘元數據):
| 字段 | 类型 | 说明 |
|---|---|---|
article_id | string | 文章唯一 ID;调「资讯详情查询」接口时使用此 ID |
title | string | 标题(已按 language 本地化,zh-hk 自动转繁体) |
summary | string | 摘要/描述,非全文;阅读全文需调详情接口 |
publish_time | string | ISO-8601 发布时间,北京时间(GMT+8),如 2026-09-09T14:54:55+08:00 |
url | string | 文章绝对 URL;引用原文直接使用,勿自行拼接 |
category | string | 分类名称(已按 language 本地化) |
頂層信封字段:
| 字段 | 说明 |
|---|---|
status | 恒为 "success"(错误响应见下节 RFC 7807 结构) |
articles | 文章数组(见上) |
pagination | 分页对象 { page, limit, total, total_pages } |
request_id | 本次请求追踪 ID(与响应头 X-Request-Id 同值),排障时提供 |
server_time | 服务器时间(ISO-8601) |
applied_filters | 服务端实际生效的过滤/排序条件回显(q、category、category_ids、language、start_date、end_date、sort、order、format、fields),供校验参数是否被正确识别 |
warnings | 非致命自愈提示数组(如分类未命中列出合法分类、en 摘要缺失回退简体、q 含空格/布尔词建议) |
message | 可选,附加提示(如“未找到符合条件的新闻数据。”) |
當 format=xml 時返回文章列表 XML(Content-Type: text/xml),各字段以 CDATA 包裹;注意 XML 僅含文章節點,不含 pagination 與信封字段:
<?xml version="1.0" encoding="UTF-8"?>
<articles>
<article>
<article_id><![CDATA[1445506]]></article_id>
<title><![CDATA[华夏纳指(03086.HK)盘中涨0.20%,平均价60.389港元]]></title>
<summary><![CDATA[截至2026年9月9日13:51,华夏纳指(03086.HK)上涨0.20%,报60.400港元。]]></summary>
<publish_time><![CDATA[2026-09-09T14:54:55+08:00]]></publish_time>
<url><![CDATA[https://www.newtimespace.com/zh-cn/etf/1445506.html]]></url>
<category><![CDATA[ETF]]></category>
</article>
</articles>
pagination 包含 page(當前頁)、limit(每頁數量)、total(符合條件總數)、total_pages(總頁數)。示例: {"page": 1, "limit": 10, "total": 28775, "total_pages": 2878}。
終止條件用 total_pages,不要等空數組。頁碼超出總頁數時接口返回 HTTP 200 + 空數組、不報錯,靠“返回空數組”判斷結束會浪費請求,應以 page >= total_pages 停止翻頁。
搜索無結果 / 組合不匹配 / 頁碼越界時,返回 HTTP 200 + 空數組,按正常結果處理,不要重試:
{ "status": "success", "articles": [], "pagination": { "page": 1, "limit": 10, "total": 0, "total_pages": 0 }, "warnings": [] }
參數錯誤返回 HTTP 400,錯誤響應遵循 RFC 7807(Content-Type: application/problem+json),並保留 code/message 兼容舊客戶端:
{
"type": "about:blank",
"title": "Bad Request",
"status": 400,
"detail": "limit 参数越界:每页数量必须在 1-100 之间。",
"error_code": "PARAMETER_OUT_OF_RANGE",
"request_id": "a1b2c3d4e5f60718",
"instance": "/api/v1/article/getArticles?limit=200",
"code": 400,
"message": "limit 参数越界:每页数量必须在 1-100 之间。"
}
| 触发条件 | HTTP | error_code |
|---|---|---|
| limit 不在 1–100 | 400 | PARAMETER_OUT_OF_RANGE |
| 超过每 IP 每 60 秒 60 次 | 429 | RATE_LIMIT_EXCEEDED(响应携带 Retry-After,按其等待) |
| 服务器内部错误 | 500 | INTERNAL_SERVER_ERROR |
參數錯誤請修正後再請求,不要對相同錯誤參數反復重試;429 時按 Retry-After 等待後重試。
import json, urllib.request, urllib.parse
BASE = "https://www.newtimespace.com/api/v1/article/getArticles"
def search(keyword, max_pages=3):
results = []
for page in range(1, max_pages + 1):
url = BASE + "?" + urllib.parse.urlencode(
{"q": keyword, "language": "zh-cn", "format": "json", "page": page})
raw = urllib.request.urlopen(url).read()
data = json.loads(raw.decode("utf-8"))
results += data["articles"]
if page >= data["pagination"]["total_pages"]: # 以 total_pages 为终止条件
break
return results
for a in search("人工智能"):
print(a["publish_time"], a["title"]) # publish_time 为 ISO-8601(GMT+8)
print(" 摘要:", a["summary"][:60]) # 列表仅含摘要,非全文
print(" 原文:", a["url"]) # 引用时使用该 url
# 读全文:用 article_id 调详情接口(返回清洗后的极简 Markdown)
# GET /api/v1/article/detail?article_ids=%s&format=json" % a["article_id"]