技术博客
链接读取:用 Python 读取任意公开网页的正文(apiCode=3262)

链接读取:用 Python 读取任意公开网页的正文(apiCode=3262)

作者: 万维易源
2026-09-15
链接读取公开网页正文提取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 结构,标题用 `#`、列表用 `- `、表格用管道符 `|---|`、图片保留为 `![alt](url)`。这对下游是好事——结构和文字一起拿到了。怎么处理这些结构见 [链接读取的 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)