上一篇 下一篇 分享链接 返回 返回顶部

从零做一个会读网页的浏览器:AI浏览器入门与源码实战

发布人:慈云数据-客服中心 发布时间:2小时前 阅读量:0

AI浏览器 新手入门指南|附源码

随着大模型能力的快速发展,“AI浏览器”逐渐成为一个热门方向。它并不是传统意义上只负责打开网页、展示内容的浏览器,而是在浏览器的基础能力之上,叠加了人工智能能力,例如网页内容总结、网页问答、自动提取信息、辅助搜索、自动填写表单、网页内容翻译、任务规划与执行等。

对于新手来说,AI浏览器看起来很复杂:既涉及浏览器技术,又涉及大语言模型,还可能涉及网页解析、插件开发、前端界面、后端接口等内容。但实际上,如果从最小可用版本开始,我们完全可以用较少的代码搭建一个“简易AI浏览器”,帮助我们理解它的基本原理。

本文将从零开始介绍AI浏览器的核心概念、实现思路、技术选型,并附上一份可运行的入门级源码示例,适合初学者学习和二次开发。


一、什么是AI浏览器?

AI浏览器可以理解为:

一个能够理解网页内容,并通过AI帮助用户完成阅读、搜索、分析和操作任务的智能浏览器。

传统浏览器的核心功能是:

  • 输入网址;
  • 请求网页;
  • 渲染页面;
  • 提供标签页、书签、下载、历史记录等功能。

而AI浏览器在此基础上增加了智能能力,例如:

  • 自动总结当前网页内容;
  • 根据网页内容回答问题;
  • 提取网页中的关键数据;
  • 对网页内容进行翻译;
  • 生成阅读笔记;
  • 判断网页可信度;
  • 根据用户指令执行简单任务;
  • 结合搜索引擎完成信息聚合。

举个例子,当你打开一篇很长的技术文章时,传统浏览器只能展示内容,而AI浏览器可以帮你:

“用300字总结这篇文章,并列出适合新手学习的重点。”

当你打开一个商品详情页时,AI浏览器可以帮你:

“提取商品价格、优惠信息、用户评价优缺点,并告诉我是否值得购买。”

这就是AI浏览器的价值。


二、AI浏览器的典型应用场景

AI浏览器并不是一个单一产品形态,而是一类能力集合。常见应用场景包括以下几类。

1. 网页内容总结

这是最常见、最容易实现的AI浏览器功能。

用户打开网页后,AI自动读取网页正文,并生成摘要,例如:

  • 一句话总结;
  • 三段式总结;
  • 要点列表;
  • 面向小白的解释;
  • 面向专业人士的分析。

这种能力特别适合阅读新闻、论文、技术博客、政策文件和行业报告。


2. 网页问答

网页问答是指用户可以针对当前网页提问,例如:

  • 这篇文章主要讲了什么?
  • 作者的核心观点是什么?
  • 文中提到的三个方法分别是什么?
  • 这篇文章有没有给出具体案例?
  • 适合初学者阅读吗?

实现方式通常是:

  1. 抓取网页文本;
  2. 将文本传给大语言模型;
  3. 用户输入问题;
  4. 模型基于网页内容回答。

如果网页内容非常长,还可以引入分块、向量检索、RAG等技术。


3. 智能搜索与信息整合

AI浏览器可以把搜索引擎结果进行二次加工,不只是展示一堆链接,而是帮用户:

  • 汇总多个网页观点;
  • 对比不同来源信息;
  • 生成结构化结论;
  • 标注信息来源;
  • 给出推荐阅读顺序。

比如搜索“AI浏览器是什么”,AI浏览器可以自动阅读多个网页,然后生成一份结构清晰的说明文。


4. 自动化网页操作

更高级的AI浏览器可以具备“网页代理”能力,也就是让AI像人一样操作网页,例如:

  • 点击按钮;
  • 输入文字;
  • 选择下拉框;
  • 提交表单;
  • 下载文件;
  • 抓取页面数据。

这一类能力通常需要结合浏览器自动化工具,例如:

  • Playwright;
  • Selenium;
  • Puppeteer;
  • Chrome DevTools Protocol。

不过对新手来说,不建议一开始就做复杂网页自动化,最好先从网页总结和问答做起。


三、AI浏览器的基本架构

一个入门级AI浏览器通常可以拆分为以下几个模块:

用户输入网址
    ↓
网页请求模块
    ↓
网页内容解析模块
    ↓
正文提取与清洗
    ↓
AI模型处理
    ↓
结果展示

如果做成更完整的产品,可以进一步扩展为:

前端界面
    ↓
后端服务
    ↓
网页抓取服务
    ↓
内容解析服务
    ↓
大模型服务
    ↓
数据库 / 缓存 / 向量库

其中最核心的是三个部分:

  1. 网页获取:根据URL获取网页HTML;
  2. 内容解析:从HTML中提取可读文本;
  3. AI处理:调用大模型进行总结、问答或分析。

四、技术选型建议

对于新手来说,建议使用Python实现第一个版本,因为Python生态成熟、代码量少、上手快。

本文示例使用以下技术:

技术 作用
Python 主要开发语言
requests 请求网页内容
BeautifulSoup 解析HTML
Streamlit 快速搭建网页界面
OpenAI兼容接口 调用大语言模型
python-dotenv 管理环境变量

当然,你也可以用其他技术栈:

  • 前端:Vue、React、Next.js;
  • 后端:FastAPI、Flask、Node.js;
  • 浏览器插件:Chrome Extension;
  • 自动化:Playwright、Selenium;
  • 本地模型:Ollama、LM Studio、vLLM。

为了降低学习门槛,本文选择最轻量的方案:Streamlit + Python脚本


五、项目功能说明

我们要实现的入门级AI浏览器具备以下功能:

  1. 输入一个网页URL;
  2. 自动抓取网页内容;
  3. 提取网页标题和正文;
  4. 点击按钮生成网页摘要;
  5. 支持针对网页内容提问;
  6. 在页面上展示AI回答。

它不是完整意义上的Chrome或Edge浏览器,但已经具备AI浏览器的核心雏形:读取网页 + 理解内容 + 与用户交互


六、项目目录结构

建议创建如下目录:

ai-browser-demo/
├── app.py
├── requirements.txt
├── .env
└── README.md

每个文件的作用如下:

文件 说明
app.py 主程序源码
requirements.txt 项目依赖
.env 存放API Key等配置
README.md 项目说明文档

七、安装依赖

首先创建项目目录:

mkdir ai-browser-demo
cd ai-browser-demo

然后创建虚拟环境:

python -m venv venv

激活虚拟环境。

macOS / Linux:

source venv/bin/activate

Windows:

venv\Scripts\activate

创建 requirements.txt

streamlit
requests
beautifulsoup4
python-dotenv
openai

安装依赖:

pip install -r requirements.txt

八、配置环境变量

在项目根目录创建 .env 文件:

OPENAI_API_KEY=你的API_KEY
OPENAI_BASE_URL=https://api.openai.com/v1
OPENAI_MODEL=gpt-4o-mini

如果你使用的是其他兼容OpenAI格式的模型服务,也可以修改 OPENAI_BASE_URLOPENAI_MODEL

例如某些本地模型服务可能类似:

OPENAI_API_KEY=ollama
OPENAI_BASE_URL=http://localhost:11434/v1
OPENAI_MODEL=qwen2.5

具体取决于你使用的模型服务是否支持OpenAI兼容接口。


九、完整源码:app.py

下面是一个可直接运行的入门版AI浏览器源码。

import os
import re
import requests
import streamlit as st
from bs4 import BeautifulSoup
from dotenv import load_dotenv
from openai import OpenAI

# =========================
# 1. 加载环境变量
# =========================

load_dotenv()

API_KEY = os.getenv("OPENAI_API_KEY")
BASE_URL = os.getenv("OPENAI_BASE_URL", "https://api.openai.com/v1")
MODEL = os.getenv("OPENAI_MODEL", "gpt-4o-mini")

client = OpenAI(
    api_key=API_KEY,
    base_url=BASE_URL
)


# =========================
# 2. 网页抓取函数
# =========================

def fetch_html(url: str) -> str:
    """
    根据URL请求网页HTML
    """
    headers = {
        "User-Agent": (
            "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) "
            "AppleWebKit/537.36 (KHTML, like Gecko) "
            "Chrome/120.0.0.0 Safari/537.36"
        )
    }

    response = requests.get(url, headers=headers, timeout=15)
    response.raise_for_status()

    # 尝试设置正确编码
    if response.encoding == "ISO-8859-1":
        response.encoding = response.apparent_encoding

    return response.text


# =========================
# 3. 网页正文提取函数
# =========================

def clean_text(text: str) -> str:
    """
    清洗文本,去除多余空白字符
    """
    text = re.sub(r"\s+", " ", text)
    return text.strip()


def extract_content(html: str) -> dict:
    """
    从HTML中提取标题和正文
    """
    soup = BeautifulSoup(html, "html.parser")

    # 删除无关标签
    for tag in soup(["script", "style", "noscript", "iframe", "svg"]):
        tag.decompose()

    # 提取标题
    title = ""
    if soup.title and soup.title.string:
        title = clean_text(soup.title.string)

    # 优先提取article标签内容
    article = soup.find("article")
    if article:
        body_text = article.get_text(separator=" ")
    else:
        # 如果没有article,则提取body文本
        body = soup.find("body")
        body_text = body.get_text(separator=" ") if body else soup.get_text(separator=" ")

    body_text = clean_text(body_text)

    return {
        "title": title,
        "content": body_text
    }


# =========================
# 4. 文本截断函数
# =========================

def truncate_text(text: str, max_chars: int = 12000) -> str:
    """
    防止网页内容过长,超过模型上下文限制
    """
    if len(text) <= max_chars:
        return text
    return text[:max_chars] + "\n\n[内容过长,已截断]"


# =========================
# 5. 调用AI模型
# =========================

def ask_ai(system_prompt: str, user_prompt: str) -> str:
    """
    调用OpenAI兼容接口
    """
    if not API_KEY:
        return "错误:请先在 .env 文件中配置 OPENAI_API_KEY。"

    response = client.chat.completions.create(
        model=MODEL,
        messages=[
            {
                "role": "system",
                "content": system_prompt
            },
            {
                "role": "user",
                "content": user_prompt
            }
        ],
        temperature=0.3
    )

    return response.choices[0].message.content


def summarize_page(title: str, content: str) -> str:
    """
    总结网页内容
    """
    system_prompt = """
你是一个专业的网页阅读助手,擅长从网页文本中提取关键信息。
请用中文回答,要求结构清晰、表达准确,不要编造网页中没有的信息。
"""

    user_prompt = f"""
请阅读以下网页内容,并生成一份高质量中文摘要。

网页标题:
{title}

网页正文:
{truncate_text(content)}

请按照以下格式输出:

## 一句话总结
用一句话概括网页核心内容。

## 核心要点
用项目符号列出3到6个关键要点。

## 适合人群
说明这篇内容适合哪些读者。

## 阅读建议
给出简短阅读建议。
"""

    return ask_ai(system_prompt, user_prompt)


def answer_question(title: str, content: str, question: str) -> str:
    """
    基于网页内容回答用户问题
    """
    system_prompt = """
你是一个严谨的网页问答助手。
你只能根据用户提供的网页内容回答问题。
如果网页内容中没有相关信息,请明确说明“网页中未提供相关信息”,不要凭空猜测。
请用中文回答。
"""

    user_prompt = f"""
网页标题:
{title}

网页正文:
{truncate_text(content)}

用户问题:
{question}

请基于网页内容回答问题。
"""

    return ask_ai(system_prompt, user_prompt)


# =========================
# 6. Streamlit界面
# =========================

st.set_page_config(
    page_title="AI浏览器 Demo",
    page_icon="🤖",
    layout="wide"
)

st.title("🤖 AI浏览器 Demo")
st.caption("输入网页URL,让AI帮你总结网页、回答问题。")

if "page_title" not in st.session_state:
    st.session_state.page_title = ""

if "page_content" not in st.session_state:
    st.session_state.page_content = ""

if "current_url" not in st.session_state:
    st.session_state.current_url = ""

url = st.text_input(
    "请输入网页URL",
    placeholder="例如:https://example.com/article"
)

col1, col2 = st.columns([1, 4])

with col1:
    fetch_button = st.button("读取网页", type="primary")

if fetch_button:
    if not url.strip():
        st.warning("请输入有效的网页URL。")
    else:
        try:
            with st.spinner("正在读取网页内容..."):
                html = fetch_html(url.strip())
                data = extract_content(html)

                st.session_state.page_title = data["title"]
                st.session_state.page_content = data["content"]
                st.session_state.current_url = url.strip()

            st.success("网页读取成功!")

        except Exception as e:
            st.error(f"网页读取失败:{e}")

if st.session_state.page_content:
    st.divider()

    st.subheader("网页信息")
    st.write(f"**URL:** {st.session_state.current_url}")
    st.write(f"**标题:** {st.session_state.page_title or '未识别到标题'}")
    st.write(f"**正文长度:** {len(st.session_state.page_content)} 字符")

    with st.expander("查看提取到的网页正文"):
        st.write(st.session_state.page_content[:5000])

    st.divider()

    st.subheader("AI总结")

    if st.button("生成网页摘要"):
        with st.spinner("AI正在总结网页内容..."):
            summary = summarize_page(
                st.session_state.page_title,
                st.session_state.page_content
            )
        st.markdown(summary)

    st.divider()

    st.subheader("网页问答")

    question = st.text_input(
        "请输入你想问的问题",
        placeholder="例如:这篇文章的核心观点是什么?"
    )

    if st.button("提交问题"):
        if not question.strip():
            st.warning("请输入问题。")
        else:
            with st.spinner("AI正在思考..."):
                answer = answer_question(
                    st.session_state.page_title,
                    st.session_state.page_content,
                    question.strip()
                )
            st.markdown(answer)

十、运行项目

在项目根目录执行:

streamlit run app.py

运行成功后,浏览器会自动打开类似地址:

http://localhost:8501

你可以输入一个网页URL,例如:

https://example.com

然后点击“读取网页”,再点击“生成网页摘要”,即可看到AI生成的网页总结。


十一、代码核心逻辑讲解

1. 网页请求

response = requests.get(url, headers=headers, timeout=15)

这里使用 requests 请求网页。为了减少被网站拒绝访问的概率,我们设置了 User-Agent,模拟普通浏览器访问。

需要注意的是,有些网站有反爬虫机制,或者内容由JavaScript动态渲染,这种情况下 requests 可能拿不到完整正文。如果要处理动态网页,可以改用 Playwright。


2. HTML解析

soup = BeautifulSoup(html, "html.parser")

BeautifulSoup可以把HTML转换成可查询的对象结构。我们可以通过它删除无关标签,提取标题、正文等内容。

示例中优先提取 article 标签,因为很多新闻、博客、文档网站会把正文放在 article 中。如果没有 article,就退而求其次提取 body


3. 文本清洗

网页文本中经常包含大量换行、空格、菜单项、版权信息等内容。示例中使用正则表达式做了基础清洗:

text = re.sub(r"\s+", " ", text)

这一步虽然简单,但对模型理解内容很有帮助。

如果想进一步优化,可以增加:

  • 删除导航栏文本;
  • 删除页脚;
  • 删除重复句子;
  • 提取正文密度最高的区域;
  • 使用 readability-lxml 等正文提取库。

4. AI总结

summary = summarize_page(title, content)

总结功能的关键是提示词设计。我们在Prompt中明确要求模型输出:

  • 一句话总结;
  • 核心要点;
  • 适合人群;
  • 阅读建议。

这比简单地说“总结一下”效果更稳定,也更适合产品化。


5. 网页问答

网页问答的关键原则是:只基于网页内容回答,不要胡编乱造。

因此系统提示词中写了:

如果网页内容中没有相关信息,请明确说明“网页中未提供相关信息”

这是构建可靠AI应用时非常重要的约束。


十二、新手常见问题

1. 为什么有些网页读取失败?

可能原因包括:

  • URL不正确;
  • 网站禁止爬虫访问;
  • 网站需要登录;
  • 网站内容由JavaScript动态加载;
  • 网络连接超时;
  • SSL证书问题。

解决方法:

  • 换一个网页测试;
  • 增加请求头;
  • 使用Playwright模拟真实浏览器;
  • 对需要登录的网站使用Cookie;
  • 做异常处理和重试机制。

2. 为什么提取到的正文很乱?

因为不同网站HTML结构差异很大,有些网页包含导航、广告、推荐文章、评论区等内容。基础版本只做了简单提取,难免会混入噪音。

优化方案包括:

  • 使用 readability-lxml
  • 根据标签密度提取正文;
  • 删除常见无关区域,如 navfooteraside
  • 针对特定网站写解析规则;
  • 使用AI二次清洗正文。

3. 网页太长怎么办?

大语言模型通常有上下文长度限制。如果网页太长,直接全部传给模型可能失败或费用较高。

常见处理方法:

  1. 截断文本;
  2. 分段总结;
  3. 先局部总结,再汇总总结;
  4. 使用向量数据库做检索问答;
  5. 使用长上下文模型。

本文示例采用最简单的截断方式,适合入门学习,但生产环境建议使用分块处理。


4. 能不能做成浏览器插件?

可以。Chrome浏览器插件通常由以下部分组成:

  • manifest.json:插件配置;
  • content script:读取当前网页内容;
  • background service worker:处理后台逻辑;
  • popup.html:插件弹窗界面;
  • 后端API:调用大模型。

插件版AI浏览器的优势是可以直接读取用户当前正在浏览的网页,不需要用户复制URL。但开发复杂度比Streamlit版本更高。


十三、进一步升级方向

当你完成这个Demo后,可以从以下方向继续扩展。

1. 增加历史记录

可以把用户访问过的网页、摘要结果、问答记录保存到SQLite数据库中,方便之后查看。

可增加字段:

  • URL;
  • 网页标题;
  • 正文摘要;
  • 创建时间;
  • 问答记录。

2. 支持网页翻译

增加一个“翻译当前网页”按钮,将英文网页翻译成中文,或者将中文网页翻译成英文。

提示词示例:

请将以下网页内容翻译成自然流畅的中文,保留标题层级和列表结构。

3. 支持多网页对比

用户输入多个URL,AI分别读取内容,然后进行对比分析。

适合场景:

  • 商品对比;
  • 新闻观点对比;
  • 技术方案对比;
  • 政策文件对比;
  • 竞品分析。

4. 接入向量数据库

如果你想让AI浏览器支持长文档问答,可以加入向量数据库,例如:

  • FAISS;
  • Chroma;
  • Milvus;
  • Weaviate;
  • pgvector。

基本流程是:

网页正文
  ↓
文本分块
  ↓
生成Embedding
  ↓
存入向量数据库
  ↓
用户提问
  ↓
检索相关片段
  ↓
交给大模型回答

这就是常见的RAG架构。


5. 使用Playwright处理动态网页

很多现代网页使用React、Vue、Next.js等框架,页面内容需要浏览器执行JavaScript后才会出现。此时可以用Playwright。

安装:

pip install playwright
playwright install

示例:

from playwright.sync_api import sync_playwright

def fetch_dynamic_html(url: str) -> str:
    with sync_playwright() as p:
        browser = p.chromium.launch(headless=True)
        page = browser.new_page()
        page.goto(url, wait_until="networkidle")
        html = page.content()
        browser.close()
        return html

将原来的 fetch_html 替换成这个函数,就可以获取动态渲染后的页面HTML。


十四、AI浏览器产品设计建议

如果你想把这个Demo继续做成真正的产品,可以重点关注以下几点。

1. 用户体验要简单

AI浏览器不应该让用户学习复杂操作。理想体验应该是:

  • 打开网页;
  • 点击AI按钮;
  • 自动生成结果;
  • 用户继续追问。

越简单,越容易被用户接受。


2. 输出结果要结构化

不要只输出一大段文字。更好的方式是:

  • 摘要;
  • 要点;
  • 表格;
  • 结论;
  • 风险提示;
  • 推荐操作。

结构化结果更容易阅读,也更像一个成熟产品。


3. 注意隐私与安全

AI浏览器可能读取用户正在浏览的网页内容,因此必须重视隐私:

  • 不要默认上传敏感页面;
  • 对密码、Token、手机号等信息做过滤;
  • 明确告知用户数据会如何处理;
  • 尽量支持本地模型;
  • 对API Key进行安全管理。

4. 避免AI幻觉

AI可能会编造不存在的信息。降低幻觉的方法包括:

  • 明确要求基于网页内容回答;
  • 对答案引用原文片段;
  • 对不确定内容说“不确定”;
  • 不让模型回答网页外的问题;
  • 使用RAG检索相关片段。

十五、总结

AI浏览器的本质,是把传统网页浏览能力和大语言模型理解能力结合起来。它不是简单地“给浏览器加一个聊天框”,而是让AI真正参与到信息获取、阅读理解、内容分析和任务执行的过程中。

对于新手来说,学习AI浏览器不必一开始就追求复杂功能。本文提供的Demo已经覆盖了最核心的流程:

  1. 输入URL;
  2. 抓取网页;
  3. 提取正文;
  4. 调用大模型;
  5. 生成摘要;
  6. 基于网页内容问答。

掌握这个流程后,你就可以继续扩展浏览器插件、网页自动化、RAG问答、多网页分析、智能搜索等高级能力。

如果你正在学习AI应用开发,这个项目非常适合作为入门练手项目。它代码量不大,但涵盖了网页抓取、文本处理、Prompt设计、模型调用和界面展示等多个关键知识点。只要在此基础上持续迭代,你完全可以做出一个属于自己的AI浏览器工具。

目录结构
全文