跳转至

Jina Reader API 内容提取

一句话概述

Jina Reader 是一个免费的 API 服务,只需在任何 URL 前加上 r.jina.ai/ 前缀,就能把网页内容转成干净的 LLM 友好文本(Markdown),支持 JavaScript 渲染、PDF 解析、搜索模式和事实核查模式,是做 RAG 和 AI Agent 时获取网页内容最简单的方式。

核心知识点表格

知识点说明
项目地址https://github.com/jina-ai/reader
官网https://jina.ai/reader
核心功能URL → LLM 友好文本转换
使用方式URL 前缀 r.jina.ai/ 或 API 调用
三种模式Read(读取)/ Search(搜索)/ Ground(事实核查)
免费额度1000 万 token/月
支持格式HTML、PDF、DOCX
特色模型ReaderLM-v2(1.5B HTML→Markdown 专用模型)
重要事件2025年10月被 Elastic 收购

安装与配置

零安装:直接使用 URL 前缀

# Jina Reader 最简单的用法:在 URL 前加前缀
# 不需要安装任何东西,不需要 API Key

# 读取模式:r.jina.ai/
curl https://r.jina.ai/https://en.wikipedia.org/wiki/Metagenomics
# 自动返回 Markdown 格式的页面主要内容

# 搜索模式:s.jina.ai/
curl "https://s.jina.ai/?q=宏基因组分析流程"
# 搜索并返回前 5 条结果的完整内容

# 事实核查模式:g.jina.ai/
curl "https://g.jina.ai/?statement=人类肠道中有超过1000种细菌"
# 核查这个说法是否正确

Python 使用

import requests  # HTTP 请求库

# 最简单的调用方式:直接请求 URL
response = requests.get(
    "https://r.jina.ai/https://docs.python.org/3/tutorial/"  # 前缀 + 目标 URL
)

print(response.text)  # 输出干净的 Markdown 内容

带 API Key 使用(获取更多额度)

import requests

# 注册 Jina AI 获取 API Key(免费)
# https://jina.ai

headers = {
    "Authorization": "Bearer jina_xxxxxxxxxxxx",  # 你的 API Key
    "Accept": "application/json"                   # 返回 JSON 格式
}

response = requests.get(
    "https://r.jina.ai/https://example.com",
    headers=headers
)

data = response.json()          # 解析 JSON
print(data["data"]["content"])  # 提取内容
print(data["data"]["title"])    # 提取标题

MCP Server 集成

// 在 Claude Desktop 或 Cursor 中配置 Jina MCP Server
{
  "mcpServers": {
    "jina": {
      "url": "https://mcp.jina.ai/sse",
      "headers": {
        "Authorization": "Bearer jina_xxxxxxxxxxxx"
      }
    }
  }
}
// 配置后,AI 助手可以直接使用 read_url、search_web 等工具

基本使用

Read 模式(读取网页)

import requests

# 基本读取
url = "https://r.jina.ai/https://www.nature.com/articles/s41586-024-00001-1"
response = requests.get(url)
print(response.text)  # 论文内容变成 Markdown

# 使用 CSS 选择器提取特定内容
headers = {
    "X-Target-Selector": "article .c-article-body",  # 只提取文章正文
    "X-Remove-Selector": "nav, footer, .sidebar"      # 移除导航栏和侧边栏
}
response = requests.get(url, headers=headers)

# 等待动态内容加载
headers = {
    "X-Wait-For-Selector": ".dynamic-content"  # 等待这个元素出现再提取
}
response = requests.get(url, headers=headers)
import requests

# 搜索模式:返回搜索结果及其完整内容
response = requests.get(
    "https://s.jina.ai/",
    params={"q": "metagenome assembled genomes MAGs"},  # 搜索关键词
    headers={"Accept": "application/json"}               # JSON 格式
)

data = response.json()
for result in data["data"]:
    print(f"标题: {result['title']}")          # 搜索结果标题
    print(f"URL: {result['url']}")              # 来源 URL
    print(f"内容预览: {result['content'][:200]}")  # 内容前 200 字
    print("---")

Ground 模式(事实核查)

import requests

# 事实核查模式:验证一个说法是否正确
response = requests.get(
    "https://g.jina.ai/",
    params={
        "statement": "Shannon多样性指数越高,微生物群落越多样"  # 要核查的说法
    },
    headers={"Accept": "application/json"}
)

data = response.json()
print(f"结论: {data['data']['factuality']}")     # 正确/错误/部分正确
print(f"解释: {data['data']['explanation']}")     # 详细解释
print(f"来源: {data['data']['references']}")      # 引用来源

读取 PDF 文件

import requests

# Jina Reader 可以直接读取在线 PDF
pdf_url = "https://r.jina.ai/https://arxiv.org/pdf/2401.12345.pdf"
response = requests.get(pdf_url)
print(response.text)  # PDF 内容转成 Markdown

# 上传本地 PDF
with open("paper.pdf", "rb") as f:
    response = requests.post(
        "https://r.jina.ai/",
        files={"file": f},                     # 上传文件
        headers={"Accept": "text/markdown"}    # Markdown 格式
    )
print(response.text)

高级用法

批量处理多个 URL

import requests
from concurrent.futures import ThreadPoolExecutor  # 线程池

def read_url(url):
    """读取单个 URL 的内容"""
    response = requests.get(f"https://r.jina.ai/{url}")
    return {"url": url, "content": response.text}

# 要处理的 URL 列表
urls = [
    "https://docs.python.org/3/tutorial/",
    "https://bioconductor.org/packages/release/bioc/",
    "https://snakemake.readthedocs.io/en/stable/",
]

# 并发请求(3 个线程同时处理)
with ThreadPoolExecutor(max_workers=3) as executor:
    results = list(executor.map(read_url, urls))

for r in results:
    print(f"URL: {r['url']}")
    print(f"内容长度: {len(r['content'])} 字符")
    print("---")

自定义 JavaScript 执行

import requests

headers = {
    "Authorization": "Bearer jina_xxx",
    "X-Set-Cookie": "lang=zh-CN",         # 设置 Cookie
    "X-With-Shadow-Dom": "true",           # 提取 Shadow DOM
    "X-With-Iframe": "true",               # 提取 iframe 内容
    "X-Run-Js": "document.querySelector('.show-more').click()"  # 执行 JS
}

response = requests.get(
    "https://r.jina.ai/https://example.com/dynamic-page",
    headers=headers
)

构建 RAG 管道

import requests
import openai

def rag_search_and_answer(question):
    """基于 Jina Reader 的简单 RAG 管道"""

    # 第一步:用 Jina Search 搜索相关内容
    search_response = requests.get(
        "https://s.jina.ai/",
        params={"q": question},
        headers={"Accept": "application/json"}
    )
    search_data = search_response.json()

    # 第二步:拼接上下文
    context = ""
    for item in search_data["data"][:3]:  # 取前 3 条结果
        context += f"来源: {item['url']}\n{item['content'][:1000]}\n\n"

    # 第三步:用 LLM 生成回答
    client = openai.Client(base_url="http://localhost:11434/v1", api_key="ollama")
    response = client.chat.completions.create(
        model="llama3.1:8b",
        messages=[
            {"role": "system", "content": f"根据以下搜索结果回答问题。\n\n{context}"},
            {"role": "user", "content": question}
        ]
    )
    return response.choices[0].message.content

# 使用
answer = rag_search_and_answer("什么是宏基因组 binning?")
print(answer)

常见报错与解决

报错信息原因解决方法
402 Quota exceeded免费额度用完注册账号获取更多额度,或等待月初刷新
Empty content页面被反爬或内容动态加载使用 X-Wait-For-Selector 等待内容加载
Timeout目标网页响应超时检查目标 URL 是否可访问
404 Not FoundURL 格式错误确保 URL 格式正确:r.jina.ai/https://...
Content too long页面内容超过限制使用 CSS 选择器只提取需要的部分
中文乱码编码问题添加 headers={"Accept-Charset": "utf-8"}

速查表

# === Jina Reader 速查 ===

# 读取网页(curl)
curl https://r.jina.ai/https://example.com

# 搜索(curl)
curl "https://s.jina.ai/?q=关键词"

# 事实核查(curl)
curl "https://g.jina.ai/?statement=要核查的说法"

# 读取 PDF
curl https://r.jina.ai/https://example.com/file.pdf

# 带 API Key
curl -H "Authorization: Bearer jina_xxx" https://r.jina.ai/https://example.com

# JSON 格式输出
curl -H "Accept: application/json" https://r.jina.ai/https://example.com

# CSS 选择器提取
curl -H "X-Target-Selector: article" https://r.jina.ai/https://example.com

# 移除元素
curl -H "X-Remove-Selector: nav,footer" https://r.jina.ai/https://example.com

# Python 一行代码
import requests; print(requests.get("https://r.jina.ai/https://example.com").text)

与同类工具对比

特性Jina ReaderFirecrawlCrawl4AI直接 requests
使用难度极简(加前缀)简单(SDK)中等需要自己解析
免费额度1000万 token/月500 积分/月无限无限
JS 渲染自动自动支持不支持
PDF 解析支持支持不支持不支持
搜索模式内置内置
事实核查内置
自托管开源可部署开源可部署开源不适用
MCP 支持官方 MCP Server官方 MCP Server

选择建议:如果你只是偶尔需要获取网页内容做 RAG,Jina Reader 的免费额度和极简用法是最好的选择。大规模爬取用 Firecrawl 或 Crawl4AI。