链接读取:用 Python 读取任意公开网页的正文(apiCode=3262)
链接读取公开网页正文提取Python快速开始cURL # 链接读取:用 Python 读取任意公开网页的正文(apiCode=3262)
接口:链接读取(apiCode=3262)· 接入点:获取网页正文(3262-1)· 计费:50 厘/次 · 请求方式:POST / GET · 返回格式:JSON · 适用人群:第一次接入的开发者 · 阅读时间:约 7 分钟 · 最后实测核对:2026-09-15
## 核心要点
- 链接读取(apiCode=3262)只有一个业务参数 `url`,一次请求拿回整页正文。
- `output` 字段返回的是 **Markdown**,不是纯文本——标题、列表、表格、图片链接都在里面。
- `showapi_res_code` 为 `0` 表示请求已被受理;判断本次是否拿到内容,还要看 `output` 是否为空。
## 先看它解决什么问题
你手上有一批 URL,想批量拿到正文。做内容聚合、做 SEO 监控、或者往知识库里灌数据,都要先把公开网页变成文本。
自己写解析要处理三件事:访问限制(UA、Cookie、频率)、编码、正文定位(从一堆导航和广告里挑出正文)。链接读取把这三件事封进一个 POST 请求。
代价是每次 50 厘,也就是 0.05 元。跑通一条链路大概花你 10 分钟。
## 接口速览
| 项目 | 值 |
|------|-----|
| 接口地址 | `https://route.showapi.com/3262-1` |
| 请求方式 | POST / GET(两种方式返回结果一致,见文末 FAQ) |
| 鉴权 | `appKey` 放在 URL query 上 |
| 业务参数 | `url`(String,必填,要读取的公开网页 URL) |
| 可选请求头 | `content-type: application/x-www-form-urlencoded` |
| 接入点说明 | 适用于 UTF-8 编码的公开网页 |
| 超时配置 | 连接 5 秒、读取 10 秒(来自该接口的 OpenAPI 文档) |
| 返回结构 | `showapi_res_code`、`showapi_res_error`、`showapi_res_id`、`showapi_fee_num`、`showapi_res_body{ret_code, output}` |
| 计费 | 50 厘/次;9.90 元档只用本接入点可调 198 次 |
| 并发限制 | 2 次/秒 |
## 三步跑通
### 第一步:拿到 AppKey
到 [AppKey 管理](https://www.showapi.com/console#/myApp) 复制你的密钥。链接读取是付费接口,账号里得有可用资源包或者通用资源包。
### 第二步:发出第一个请求
三份代码把 `YOUR_APPKEY` 和 `url` 换掉就能直接跑。注意 `url` 要做 URL 编码——目标地址本身带 `?` 和 `&`,不编码会把参数截断。
```python
# Python 3 + requests:pip install requests
import requests
APPKEY = "YOUR_APPKEY"
API = "https://route.showapi.com/3262-1"
resp = requests.post(
API,
params={"appKey": APPKEY, "url": "https://www.showapi.com/apiGateway/view/3262"}, # requests 会自动做 URL 编码
timeout=(5, 10), # 对齐接口的 5 秒连接、10 秒读取
)
resp.raise_for_status()
data = resp.json()
# 第一层:网关级失败,例如 -1 must input url field
if data.get("showapi_res_code") != 0:
raise RuntimeError(f"网关/参数错误:{data.get('showapi_res_error')}")
output = (data.get("showapi_res_body") or {}).get("output") or ""
# 第二层:网关返回 0 时,用 output 是否为空判断本次有没有拿到内容
if not output:
raise RuntimeError("本次调用 output 为空,已按次计费,不要直接入库。")
print(f"拿到 {len(output)} 个字符,计费 {data.get('showapi_fee_num')} 次")
print(output[:200])
```
```bash
# cURL
curl -X POST "https://route.showapi.com/3262-1?appKey=YOUR_APPKEY&url=https%3A%2F%2Fwww.showapi.com%2FapiGateway%2Fview%2F3262" \
-H "content-type: application/x-www-form-urlencoded"
```
```javascript
// Node.js 18+(内置 fetch)
const APPKEY = "YOUR_APPKEY";
const API = "https://route.showapi.com/3262-1";
const qs = new URLSearchParams({ appKey: APPKEY, url: "https://www.showapi.com/apiGateway/view/3262" });
const resp = await fetch(`${API}?${qs}`, {
method: "POST",
signal: AbortSignal.timeout(10000), // 10 秒读取超时
});
const data = await resp.json();
if (data.showapi_res_code !== 0) {
throw new Error(`网关/参数错误:${data.showapi_res_error}`);
}
const output = data?.showapi_res_body?.output ?? "";
if (!output) {
throw new Error("本次调用 output 为空,已按次计费");
}
console.log(`拿到 ${output.length} 个字符`, output.slice(0, 200));
```
### 第三步:把 Markdown 渲染出来
`output` 是 Markdown,直接塞进任何支持 Markdown 的地方就能显示。
```python
# pip install markdown
import markdown
html = markdown.markdown(output, extensions=["tables", "fenced_code"])
open("page.html", "w", encoding="utf-8").write(
f"<!doctype html><meta charset='utf-8'>{html}"
)
```
后端渲染另一种选择是 `markdown-it-py`,前端直接用 `marked`。三条路都行,看你现有技术栈。
## 真实返回长什么样
下面是实测(2026-09-15)的真实响应。这次的目标地址是本接口自己的产品详情页,`output` 已截断以便阅读:
```json
{
"showapi_res_error": "",
"showapi_res_id": "6aa8b6c5fb638c2f69d8765a",
"showapi_res_code": 0,
"showapi_fee_num": 1,
"showapi_res_body": {
"ret_code": 0,
"output": "API市场/企业服务/链接读取\n\n链接读取\n\n# 链接读取\n\n官方自营\n\n……(实测返回共 1,938 字符,此处截断)"
}
}
```
字段说明:
| 字段 | 类型 | 含义 |
|------|------|------|
| `showapi_res_code` | Number | 网关级状态码。`0` 表示请求本身被受理,`-1` 表示参数或网关错误 |
| `showapi_res_error` | String | 网关级错误说明,正常时为空字符串 |
| `showapi_res_id` | String | 本次请求的唯一标识,排查问题时报给客服最有用 |
| `showapi_fee_num` | Number | 本次调用计费次数 |
| `showapi_res_body.ret_code` | Number | 业务返回码,实测正常与空值场景均为 `0` |
| `showapi_res_body.output` | String | 公开网页正文,Markdown 格式 |
## 计费与调用方式
计费按次:每次调用计 1 次,单价 50 厘。参数校验失败(`showapi_res_code: -1`)时 `showapi_fee_num` 为 `0`,不计费。
结果判断看三层:HTTP 状态正常 → `showapi_res_code` 为 `0` → `output` 非空。第三层是本接口判断"这次拿到内容了"的完整条件——前两层通过而 `output` 为空,本次调用同样按 1 次计费。
并发上限 2 次/秒,批量调用需要自行排队。限流时接口的具体返回形式本次未实测,留足退避重试的余量即可。
## 适用条件
适用于 UTF-8 编码的公开网页(HTML)。PDF、图片等非 HTML 资源不在处理范围内,这类文件需要另找方案。
接口可以处理含动态渲染的公开网页,其中内容完全依赖客户端渲染的页面,实测返回的 `output` 为空串;需要登录态的内容平台、大型百科类词条页同样返回空串。这两类页面建议在入队前按页面类型过滤掉,实测的按类型对照表见 [链接读取返回结构说明与结果判断](https://www.showapi.com/guides/link-read-empty-output-3262)。
## FAQ
**Q1:`showapi_res_code` 是 0 就算成功了吗?**
它表示请求已被网关受理。实测中目标域名不存在、页面有访问限制、页面非 HTML 时,`showapi_res_code` 依然是 `0`,但 `output` 是空串,而且这次调用照常计费。判断拿到内容的完整条件是:HTTP 状态正常 + `showapi_res_code == 0` + `output` 非空。
**Q2:为什么返回里有个 `showapi_fee_num`?**
它是本次调用的计费次数。实测正常读取时为 `1`;参数缺失(`showapi_res_code: -1`)时为 `0`,即不计费。
**Q3:POST 和 GET 哪个更好?**
两者结果完全一致。实测同一个 URL(某个综合门户首页)分别用 GET 和 POST 调用,两次 `output` 长度都是 24,463 字符,内容逐字相同。URL 很长时选 POST 更省事,不用操心编码。
**Q4:`output` 为什么不是纯文本?**
接口返回的正文被转成了 Markdown 结构,标题用 `#`、列表用 `- `、表格用管道符 `|---|`、图片保留为 ``。这对下游是好事——结构和文字一起拿到了。怎么处理这些结构见 [链接读取的 output 到底是什么格式](https://www.showapi.com/guides/link-read-markdown-output-3262)。
**Q5:能一次传多个 URL 吗?**
不能。接口只接受一个 `url` 参数,批量要自己循环,并且把并发控制在 2 次/秒以内。批量场景的队列设计见 [把链接读取接进 RAG 管道](https://www.showapi.com/guides/link-read-rag-pipeline-3262)。
## 下一步阅读
- `output` 的返回结构与结果判断 → [链接读取返回结构说明与结果判断](https://www.showapi.com/guides/link-read-empty-output-3262)
- `output` 里那些 Markdown 结构怎么处理 → [链接读取的 output 到底是什么格式](https://www.showapi.com/guides/link-read-markdown-output-3262)
- 想省掉自己写代码这一层 → [把链接读取接进 MCP](https://www.showapi.com/guides/link-read-mcp-integration-3262)
- **本系列共 6 篇**:查看[链接读取指南总目录](https://www.showapi.com/guides/link-read-guides-3262)