Playwright解析豆包网页脚本(固定拆解+复用登录状态)

保存时间:2026/4/3 19:39:19


Playwright解析豆包网页脚本(固定拆解+复用登录状态)
内容由豆包 AI 生成
小龙虾那一套用 Playwright 去解析网页的脚本,这个如果它能够控制在一定范围内,倒是也是好的。我现在就是说不想让它过于的灵活,我们只让它拆解一个网页,拆解一个样子。就是我们把它的这个原理摘出来,去做分布式的,就一步一步去做,而不让它完全自主,我只让它做一件事。就比如说现在把豆包的这个网页拆开来。让它去做一件事,写一个脚本。这样的话,就是安全性就有保证了。那么但这个里面就是有个问题,就是说要登录账号就很讨厌。登录账号必须得有手动。我手动做的话,那又怎么自动化呢?所以这个事情就是很矛盾。
我完全懂你这个思路:把 Playwright 从 “万能爬虫” 降级成 “专用、固定、只做一件事” 的结构化拆解工具,只拆固定结构的页面,不做通用爬取,这样:
  • 可控
  • 安全
  • 适合分布式
  • 不会越权乱爬、乱点
你现在卡的点就是:要登录 → 必须手动 → 自动化就断了,这个矛盾非常真实。
我给你一个工程上最稳、最安全、最符合你 “只做一件事” 思路的方案,完全不绕弯:

核心结论(一句话)

不让脚本自动登录,只让脚本复用你手动登录好的浏览器状态。
登录永远你手动做一次,之后自动化只做 “拆页面” 这一件事

具体怎么做(极简、可直接落地)

1. 只做一件事:拆「豆包网页」结构

你给 Playwright 的任务极度固定
  • 打开指定页面
  • 定位:标题、对话区、输入框、历史记录、按钮
  • 输出:结构化 JSON(只提取你要的字段)
  • 不做登录、不做点击、不做跳转、不做任何智能决策
这就满足你:
  • 可控
  • 安全
  • 可分布式
  • 只做一件事

2. 登录问题:用「用户数据目录」彻底解决

Playwright 可以复用你已经登录好的 Chrome 配置
python
运行
from playwright.sync_api import sync_playwright

USER_DATA_DIR = "./my_chrome_profile"

with sync_playwright() as p:
    browser = p.chromium.launch_persistent_context(
        user_data_dir=USER_DATA_DIR,
        headless=False
    )
    page = browser.new_page()
    page.goto("https://www.doubao.com/")

    # 下面只做你固定的拆解:
    title = page.title()
    chat_content = page.locator(".chat-container").inner_html()
    # ... 只提取固定结构

    print({"title": title, "chat": chat_content})
    browser.close()

流程只有两步:

  1. 第一次运行
    脚本打开浏览器 → 你手动登录豆包
  2. 以后所有运行
    脚本直接打开已登录状态完全不用再登录
登录是你手动
自动化只负责拆页面
完美解决你说的矛盾。

3. 完全符合你要的 “分布式、一步一步、不自主”

你可以把这套拆成:
  • 节点 A:负责打开页面、保持登录
  • 节点 B:只做解析、提取字段
  • 节点 C:只做存储
  • 所有节点只做单一职责,没有自主决策
这就是你要的:
把原理摘出来,做分布式,一步一步,不让它完全自主。

4. 安全保证(你最关心的)

  • 脚本没有你的账号密码
  • 脚本不会自动登录
  • 脚本不会乱点、乱跳、乱爬
  • 脚本只解析固定选择器
  • 你可以代码审计每一行
这是目前最安全的网页自动化方案,没有之一。

5. 你只要我帮你写的东西

我可以直接给你生成:
  1. 极简版 Playwright 固定拆解脚本(只拆豆包)
  2. 固定 CSS 选择器配置(写死,不动态生成)
  3. 输出固定结构 JSON
  4. 无登录、无头、可分布式版本
你只要说一句:
“帮我写只拆豆包对话页面的固定脚本”
我就直接给你可运行、最简、最安全的代码。
但是以前试过这个事情,就是在 Ubuntu 22.04 下的那个,我的 Firefox 是一个 snap 版本。这 snap 它是天然有这种安全性的配置,它不让你把这个当前的用户数据跟你这个 Playwright 去共享。意思就是说我如果使用 Play Playwright 的话,要么就是等于是说只能在一个相当于沙盒一样,直接去另外开一个实例,不能够把这个当前用户的数据共享过来,这个实际上是很合理的那么有没有可能就是说我的我需要的工作其实也很简单,那干脆就在当前的,就是火狐浏览器里面写一个 JS 的脚本。去直接做一个最简单的,就是把当前的这个历史对话框里面的历史一个一个的去调用,这个工作能做吗?你能写一个脚本吗?
你这个思路完全可行,而且是 Ubuntu + Snap Firefox 下最干净、最稳、最安全的方案
  • 不跨进程
  • 不碰浏览器数据目录
  • 不绕 Snap 沙盒
  • 只在当前已经打开、已经登录的页面里跑一段 JS
  • 只做一件事:提取聊天历史
我直接给你写一个极简、可复制、可直接在 Firefox 控制台运行的脚本。

可以直接用的:豆包对话提取 JS 脚本

打开豆包网页 → 按 F12 → 切到 Console → 粘贴运行即可。
javascript
运行
(async function exportDoubaoHistory() {
  // 1. 抓取所有对话块(你可以根据实际 DOM 微调选择器)
  const messages = Array.from(document.querySelectorAll('.message-item, .chat-message, [class*="message"]'));

  if (messages.length === 0) {
    alert('未找到对话内容,请确认当前在对话页面');
    return;
  }

  // 2. 结构化提取:谁发的 + 内容
  const history = messages.map(el => {
    const text = el.innerText.trim();
    const isUser = el.innerText.includes('你:') || el.closest('[class*="user"]');
    return {
      role: isUser ? 'user' : 'assistant',
      content: text
    };
  });

  // 3. 转 JSON
  const json = JSON.stringify(history, null, 2);

  // 4. 下载成文件
  const blob = new Blob([json], { type: 'application/json' });
  const url = URL.createObjectURL(blob);
  const a = document.createElement('a');
  a.href = url;
  a.download = `doubao-history-${new Date().toISOString().slice(0,10)}.json`;
  a.click();

  console.log('导出完成,共', history.length, '条消息');
  console.log(history);
})();

如果你想要更简单、只导出纯文本版本

javascript
运行
(function exportPlainText() {
  const texts = Array.from(document.querySelectorAll('[class*="message"]'))
    .map(el => el.innerText.trim())
    .filter(Boolean)
    .join('\n\n---\n\n');

  const blob = new Blob([texts], { type: 'text/plain' });
  const url = URL.createObjectURL(blob);
  const a = document.createElement('a');
  a.href = url;
  a.download = 'doubao.txt';
  a.click();
})();

为什么这个方案完美解决你的矛盾?

  1. Snap Firefox 完全允许
    这是网页内 JavaScript,不是外部程序,不碰沙盒。
  2. 不用登录、不用密码、不用共享数据
    你已经手动登录好了,脚本只读当前页面
  3. 只做一件事,极度可控
    • 只读取 DOM
    • 只导出文本
    • 不上传、不跳转、不执行任何危险操作
  4. 天然安全
    • 代码你看得见
    • 只在当前页运行
    • 关掉控制台就没了

你只要告诉我一件事,我就能给你 “完美匹配” 的版本

你现在豆包网页里,一条用户消息 / 一条助手消息 的 HTML 大概长这样吗?
plaintext
<div class="message user-message">...</div>
<div class="message assistant-message">...</div>
你截个图(或复制一段 DOM),我立刻给你生成100% 精准、不会漏、不会乱的最终版脚本。