如何使用Scrapeless Scraping浏览器抓取Qwen AI的回答
Lead Scraping Automation Engineer
关键要点:
- 一个 composer,一个发送按钮,一个答案节点。 chat.qwen.ai(“Qwen Studio”)使用单一的 composer
textarea.message-input-textarea;在其中输入内容,点击.message-input-right-button-send,然后从.response-message-content.phase-answer中读取回复。整个过程,提示“法国的首都是什么?”返回的结果是“法国的首都巴黎。” - 访客会话仅有一轮;下一轮需要登录。 匿名的 Qwen 会话只回答一个问题,随后出现“欢迎 / 登录”的墙,才能进行第二次交流。对话历史、文件上传和图像生成都在那面墙之后——将其视为经过身份验证的前提,而不是访客调用。
- 在答案页脚上等待,而不是用秒表。 Qwen 按顺序流式传输回复。可靠的“完成”信号是消息底部的响应页脚(复制控制
.copy-response-button)——固定的睡眠时间会捕获半写完的句子。 - 推理卡片与答案是独立的节点。 Qwen 在答案正文上方呈现可折叠的“思考完成”卡片(
.qwen-chat-thinking-status-card-title-text)。单独检测它,以避免推理文本渗入你的答案字段。 - 固定住宅出口,并将每个任务保持在一个 shell 中。 chat.qwen.ai 通过 IP 进行个性化和速率限制,Scraping Browser 处理代理、指纹识别和渲染作为会话级别的关注点,因此你的代码只需处理选择器和等待。
- 免费开始。 新的 Scrapeless 账户包括免费的 Scraping Browser 运行时——可在 app.scrapeless.com 注册。
介绍:将 Qwen 的答案转化为结构化数据
Qwen(阿里巴巴的通义家族)是最广泛使用的大语言模型助手之一,团队希望将其答案作为数据:模型评估和回归集、品牌和类别答案监控、多语言基础语料库,以及并排提示测试。关键在于这些答案并不位于开放的 HTML 页面上。它们被流式传输到 chat.qwen.ai 的一个充水反应应用程序中——界面自称为“Qwen Studio”——并且回复仅在应用程序呈现并完成流式传输后存在于 DOM 中。
这使得普通的 HTTP 获取变得无用:你得到的是一个空的应用程序外壳,没有答案。composer、发送控制和答案容器都是应用特定的类名,当 Qwen 发布 UI 更新时这些类名会变化,而第二个问题则会遭遇登录墙。因此,真正的任务是像浏览器一样驱动聊天 UI,等待流稳定后,从实时 DOM 中提取答案(以及推理卡,如果呈现的话)。
这篇文章是在 Scrapeless Scraping Browser 上的一个以终端为中心的分步指南。它创建一个云会话,打开 Qwen Studio,在 composer 中输入一个提示,等待回复完成,然后将其作为 JSON 读取。下面的每个选择器和信号都来自于对 chat.qwen.ai 进行的真实 Scraping Browser 运行。相关的搜索和 AI 答案指南在最后附上。
你可以用它做什么
- 构建 Qwen 评估数据集。 针对每个时间戳固定问题/答案对,以跟踪答案漂移并为模型回归套件提供数据。
- 品牌和类别监控。 观察 Qwen 如何回答有关你的产品、你的领域或一个受监管主题的问题,并对几周内的回应进行差异化比较。
- 多语言答案基础。 捕获 Qwen 用中文和英文的回复用于跨语言检索评估。
- 提示 A/B 测试。 在多个措辞中运行相同的问题并比较返回结果。
- 推理跟踪标志。 记录查询是否触发了“思考完成”的推理过程,以便将快速答案与经过深思熟虑的答案分开。
- 引用收集。 当一个提示促使 Qwen 以网络来源支撑其答案时,收集它所提供的来源链接。
为什么选择 Scrapeless Scraping Browser
Scrapeless Scraping Browser 是一个可定制的、反检测的云浏览器,专为网络爬虫和 AI 代理设计。特别是针对 chat.qwen.ai,它提供:
- 195+ 个国家的住宅代理(
--proxy-country,--proxy-state,--proxy-city)—— chat.qwen.ai 通过 IP 进行个性化和限制,因此住宅出口是持续收集的基本要素。 - 云中的 JavaScript 渲染—— Qwen Studio 是一个充水的单页面应用;答案节点仅在应用装载并流式传输后存在,静态 HTML 见不到。
- 每个会话的反检测指纹识别——这个反检测的云浏览器由自开发的 Chromium 驱动,呈现为真正的 Chrome 给聊天应用。
- 会话持久性和用户配置——保持一个登录的 Qwen cookie 在调用中有效,这就是在第 5 步中解锁多轮路径的关键。
- 单一的命令行界面——一个
scrapeless-scraping-browser二进制文件驱动导航、输入、点击、等待和评估,从而使整个流程在一个 shell 中进行。
在 app.scrapeless.com 的免费计划中获取您的 API 密钥。 Scraping Browser 产品页面 涉及运行时间,而完整的命令集在 Scrapeless 文档 中。
先决条件
- Node.js 18 或更新版本。
- 一个 Scrapeless 账户和 API 密钥 — 在 app.scrapeless.com 注册。
- 用于 JSON 解析的
jq(可选;下面展示了一个 grep 备选方案)。 - 对于多轮提取:您控制的一个 Qwen 账户。单轮访客流程无需登录;第一条答案之后的所有内容都需要登录(步骤 5)。
- 对终端的基本熟悉。
安装
下面的方案在 scrapeless-scraping-browser CLI 上运行。设置分为四个简短的步骤 — CLI 用户需要 #1、#2 和 #4;AI 代理用户需要添加 #3。
1. 安装 CLI 包
bash
npm install -g scrapeless-scraping-browser
这提供了每个步骤调用的 scrapeless-scraping-browser 二进制文件。该技能不附带自己的运行时——它将命令模式加载到您的 AI 代理中,但必须先安装 CLI。
2. 配置您的 API 密钥
从 app.scrapeless.com 获取您的令牌,然后将其存储在 CLI 可以读取的位置:
bash
scrapeless-scraping-browser config set apiKey your_api_token_here
scrapeless-scraping-browser config get apiKey # 验证
配置文件位于 ~/.scrapeless/config.json,访问权限限制为当前用户,并且优先于环境变量。对于 CI 运行器,更建议使用环境变量:
bash
export SCRAPELESS_API_KEY=your_api_token_here
3. 在您的 AI 代理中安装 Scrapeless 技能
这是与 #1 分开的步骤。步骤 1 安装了 CLI 二进制文件 — 您的代理调用的运行时。技能是教您的代理如何正确调用它(发现 → 提交 → 等待 → 提取模式、Qwen 选择器、等待策略)。这两者是不同的,您需要两者才能进行基于提示的工作流。
技能是一个包含 SKILL.md + skill.json + references/ 的文件夹。规范来源是 scrapeless-ai/scrapeless-agent-browser → skills/scraping-browser-skill GitHub 仓库;每个代理的安装命令在 Scrapeless 文档 中。安装后重新加载您的代理以使技能生效。
4. 验证安装
在接触 Qwen 之前用一个安全提示进行烟雾测试:
"使用 Scrapeless 技能,打开 https://example.com 并告诉我页面标题。"
您的代理应该创建一个会话,打开页面,并回复 "示例域"。如果有效,您就准备好驾驶 Qwen Studio。
您如何实际使用它:提示您的代理
安装后,您通过 与您的代理交谈 而非复制粘贴 bash 来抓取 Qwen。该技能将 Qwen composer/send/answer 选择器和流完成检查加载到代理的上下文中,因此一行提示返回干净的答案 JSON。
您可以粘贴的提示
| 您对代理说 | 您得到的回复 |
|---|---|
| "问 Qwen '法国的首都是什么?' 只给我答案。" | 渲染消息主体中的答案字符串 |
| "问 Qwen '用两句话解释 RAG' 并返回 JSON 包含答案 + 推理标志。" | { answer, reasoning, model } |
| "通过 Qwen 运行这 5 个问题并保存为 qwen-eval.json。" | 一个 JSON 文件,每行一个问题/答案 |
| "用新加坡 IP 问 Qwen '法国的首都是什么' 用中文。" | 创建会话,使用 --proxy-country SG,以中文发送提示 |
| "问 Qwen '詹姆斯韦布望远镜最新消息' 还抓取它引用的任何来源链接。" | { answer, citations: [...] } |
| "Qwen 对 '证明 sqrt(2) 是无理数' 进行了推理通行吗?" | reasoning: "思考完成" 或 null |
实际示例:将 Qwen 的答案作为文本
您输入:
"问 Qwen '法国的首都是什么?用一句短句回答。' 只返回答案作为文本。"
代理的计划(用普通英语表述):
- 创建一个住宅会话(美国出口是 Qwen Studio 的一个不错的默认值)。
- 打开
https://chat.qwen.ai/,然后等待直到出现创作框textarea.message-input-textarea。 - 在创作框中填入问题并点击
.message-input-right-button-send。 - 轮询直到响应页脚 (
.copy-response-button) 加载完成——这意味着流已经结束。 - 读取
.response-message-content.phase-answer并返回其文本。
返回的内容:
法国的首都是巴黎。
这就是用户可见的全部内容。步骤1-4中的选择符发现、完成轮询和JSON结构化是技能让代理运行的内容——您不需要输入其中任何一项。
结构化提示:如何控制返回的内容
| 表达方式 | 效果 |
|---|---|
| "…仅答案" / "…带有推理标志" | 返回哪些字段 |
| "…作为JSON" / "…作为纯文本" | 输出格式 |
| "…用中文" / "…用英文" | 提示语言 |
| "…在新加坡IP上" / "…来自德国" | 设置 --proxy-country |
| "…保存到 qwen-eval.json" | 写入文件 |
| "…运行所有10个问题" | 循环——每个问题新会话 |
下面的步骤1-6是后台参考——阅读一次以了解打开→提交→等待→提取模式是如何组成的,然后相信您的代理来应用它。在代理之外进行脚本编写的效果与所示完全相同;技能只是更快的路径。
步骤1 — 连接到Scrapeless Scraping Browser
在打开任何页面之前使用住宅出口创建一个会话。代理地理位置在会话生命周期内是固定的。
bash
SESSION=$(scrapeless-scraping-browser new-session \
--name "qwen-us" \
--ttl 1800 \
--proxy-country US \
--json | jq -r '.data.taskId')
echo "Session: $SESSION"
没有jq的便携式后备:
bash
SESSION=$(scrapeless-scraping-browser new-session \
--name "qwen-us" --ttl 1800 --proxy-country US --json \
| grep -oE '"taskId":"[^"]*"' | cut -d'"' -f4)
美国住宅出口可以干净地渲染Qwen Studio。Qwen是一个全球产品,因此任何稳定的住宅国家都可以使用;将地理位置与您希望Qwen回答的语言匹配。
步骤2 — 打开Qwen Studio并选择合适的等待策略
打开chat.qwen.ai,然后确定等待策略。聊天应用保持实时连接以便于流式传输,因此 --load networkidle 很少达到安静窗口——它往往会挂起。可靠的模式是固定的 wait,后跟计数创作框的准备检查。
bash
scrapeless-scraping-browser --session-id $SESSION open "https://chat.qwen.ai/"
scrapeless-scraping-browser --session-id $SESSION wait 4000
# 就绪信号:单个创作框textarea已经加载。
scrapeless-scraping-browser --session-id $SESSION eval \
'document.querySelectorAll("textarea.message-input-textarea").length' # 期望为 1
| 策略 | 在Qwen Studio上的行为 | 推荐 |
|---|---|---|
wait --load networkidle |
流连接保持网络繁忙;很少会稳定 | 避免使用chat.qwen.ai |
wait 4000(固定) |
确定性—应用程序此时已完成加载 | 默认 |
eval 创作框计数 === 1 |
真正的就绪—输入是可交互的 | 在输入前作为门控使用 |
页面标题为“Qwen Studio”,横幅显示活动模型标签(例如,Qwen3.7-Plus),旁边有设置为Auto的模式选择器。您无需更改它们即可读取答案。
步骤3 — 提交提示
Qwen Studio仅暴露一个创作框,textarea.message-input-textarea。发送控件只有在创作框中包含真实的按键输入时才会启动——程序化的 fill 设置值而不会触发创作框的输入状态,因此按钮保持不活跃。逐字输入提示,给用户界面一点时间,然后点击发送。
如果您正在针对新的构建进行连接,请先发现选择符,而不是逐字信任这些选择符——Qwen会在不同版本中轮换类名:
bash
# 发现:在驱动之前确认创作框和任何发送控件是否存在。
scrapeless-scraping-browser --session-id $SESSION get html "main"
然后提交:
bash
PROMPT="法国的首都是哪个城市?用一句简短的句子回答。"
scrapeless-scraping-browser --session-id $SESSION type \
"textarea.message-input-textarea" "$PROMPT"
# 一旦真实输入到达创作框,发送按钮才会激活。
scrapeless-scraping-browser --session-id $SESSION wait 600
scrapeless-scraping-browser --session-id $SESSION click ".message-input-right-button-send"
在聚焦的创作框中按Enter提交相同的提示——在)type之后 按Enter是一种等价路径,当发送按钮尚未激活时很方便。
提交后,Qwen将网址从/重定向到/c/new-chat,再到/c/guest,并将您的问题呈现为用户消息,助手的回复显示在下面。
获取免费计划的 API 密钥:app.scrapeless.com
第 4 步 — 等待流,然后提取答案
Qwen 逐个标记地流式传输回复,因此过早读取 DOM 会给你部分句子。干净的完成信号是每条消息的脚注装载 —— 复制控制(.copy-response-button)仅在流结束后出现。轮询它,然后运行一个提取器。
bash
# 完成轮询:答案完全渲染时复制控制装载。
for i in 1 2 3 4 5 6 7 8; do
DONE=$(scrapeless-scraping-browser --session-id $SESSION eval '
document.querySelector(".chat-response-message .copy-response-button") ? "done" : "streaming"
' | tail -1 | tr -d '"')
[ "$DONE" = "done" ] && break
sleep 1
done
# 提取:答案主体、推理标志和任何来源链接 — 按字段保护。
scrapeless-scraping-browser --session-id $SESSION eval '
(function(){
const msg = document.querySelector(".qwen-chat-message-assistant, .chat-response-message");
if (!msg) return JSON.stringify({ answer: null });
const body = msg.querySelector(".response-message-content.phase-answer, .custom-qwen-markdown");
const reasoning = msg.querySelector(".qwen-chat-thinking-status-card-title-text");
const cites = Array.from(msg.querySelectorAll(".qwen-markdown a[href^=\"http\"]"))
.map(a => ({ url: a.href, text: a.textContent.trim().slice(0, 80) }));
return JSON.stringify({
url: location.href,
reasoning: reasoning ? reasoning.textContent.trim() : null,
answer: body ? body.textContent.trim() : null,
citations: cites,
});
})()
'
在验证运行中,这返回了真实的答案文本 法国的首都是巴黎。,一个 reasoning 值为 思想完成(折叠的推理卡片存在),以及一个空的 citations 数组 —— 短的事实提示并未推动 Qwen 与网络资源建立联系。
选择器说明:
- 助手消息包裹在
.qwen-chat-message-assistant中(也可以通过.chat-response-message到达);答案文本位于.response-message-content.phase-answer,以.qwen-markdown段落呈现。 - 推理卡片(
.qwen-chat-thinking-status-card-title-text)是答案主体的同级元素,而不是它的子元素 —— 单独查询它,这样“思想完成”标签就不会出现在你的answer字段中。 - 将
citations视为可为空。仅在 Qwen 显示网络依据提示的来源链接时填充。
第 5 步 — 经过身份验证的多轮会话(先决条件)
访客界面回答确切的一个问题。在第一次回复后,Qwen 弹出 “欢迎” 模态 —— “登录或注册以与 Qwen 聊天,上传文件和图像,生成图像或视频等” —— 具有 登录、注册 和 保持退出 按钮。“保持退出” 允许你继续阅读你已经拥有的单个答案,但第二轮、会话历史、文件上传和图像或视频生成均需要帐户。
这个登录墙是一个 先决条件,不是伪造的东西。要提取多轮对话:
- 保持登录状态,因为会话在连接关闭时结束。 使用 CLI 的
cookies set注入您从您拥有的帐户导出的 Qwen 会话 cookie,或将凭据一次保存到 Auth Vault(auth save <name>),然后在新的会话中使用auth login <name>重播它们 — 请参阅 Scrapeless 文档 以获取 cookie 和身份验证标志。 - 在每次调用时重用该状态,而不是在每轮中重新身份验证。
- 通过与步骤 3-4 相同的类型 → 点击 → 等待 → 提取循环驱动对话; 每个新回合都会附加另一个
.qwen-chat-message-assistant节点,你以相同的方式读取它。对于必须超越单个连接的多轮会话,@scrapeless-ai/sdkTypeScript 路径持有 CLI 不具备的持久连接。
将凭据保存在环境变量或您的秘密管理器中,永远不要在脚本中存储。单轮访客答案不需要这些;仅在管道确实需要多于一轮时再追求经过身份验证的流程。
第 6 步 — 扩展:隔离每个工作线程的 CLI 状态
同时在一个主机上运行多个 Qwen 作业需要谨慎,因为 CLI 在多个 Shell 之间共享守护进程状态。能够在并发负载下保持稳定的基本内容:
- 单个 shell 链接。 在一个原子 shell 调用中运行一个作业的整个序列,这样其他工作者就无法在您的步骤之间插入。链操作符的一个警告是:
open即使在成功导航时也会退出非零(某些页面在页面已经可用后使底层的page.goto抛出异常),因此将其用;而不是&&分隔,并使用eval 'location.href'检查状态,而不是根据其退出代码进行控制 —new-session && open "https://chat.qwen.ai/" ; wait 4000 && type … && click … && eval …。这个单个 shell 原子性是支撑整个操作的基本元素。 - 每个工作者独特的会话名称。 守护进程在各个 shell 之间共享状态,因此唯一的会话名称可以防止一个工作者的调用路由到另一个的会话中。
- 每个主机最多 ~3 个并发工作者。 超过这个数目,竞争会加剧。为了增加并发性,可以将工作者分片到不同的主机上 — 守护进程的状态是每个主机独立的,而不是每个账户。
对于稳定的评估管道,基于主机的顺序处理是简单且足够的:一次提出一个 Qwen 问题,其余放入队列。
收获
第 4 步提取器返回 url、reasoning、answer 和 citations;在此基础上,query、model 和 authenticated 字段得到丰富 — 您发送的提示、第 2 步读取的横幅模型标签、以及会话是否已登录。下面的每个值均来自真实捕获。
json
{
"query": "法国的首都是哪里?用一句简短的句子回答。",
"url": "https://chat.qwen.ai/c/guest",
"model": "Qwen3.7-Plus", // 从横幅模型标签读取;牢记它,以便评估行保持可比性
"reasoning": "思考已完成", // 当查询未触发推理时为 null
"answer": "法国的首都是巴黎。",
"citations": [], // 仅当 Qwen 用网络资源支撑其答案时填充
"authenticated": false // 访客 = 一次转动;当您重用已登录会话时为 true
}
诚实观察:
- 答案流入,因此只在响应页脚加载后读取(第 4 步) — 否则您可能捕获到半写的句子。
- 对于许多短小的事实提示,
reasoning为null。Qwen 仅在运行推理过程时呈现“思考已完成”卡片,因此应将其用作信号,而非保证。 - 除非提示促使 Qwen 用网络资源支撑其答案,否则
citations保持为空。请在下游不允许为空的字段上做保护。 authenticated: false是有效状态,而不是失败 — 访客界面回答一个问题,而登录墙(第 5 步)是更多内容的边界。- 横幅模型标签反映了 Qwen Studio 默认的模型;每行记录,以便模型更换时不会静默混淆您的评估集。
结论
抓取 Qwen 就是将 chat.qwen.ai 视为它自己的流应用:创建一个住宅云会话,打开 Qwen Studio,输入内容到一个作曲器,等待答案页脚加载,然后从充气的 DOM 中读取回复。用真实信号保护每个字段 — 答案正文与推理卡分开,引用作为可空 — 这样您的模式在 Qwen 进行 UI 更改时仍然可信。记住边界:访客会话适用于一个干净的答案,所有超出该范围的内容都在登录墙后,因此仅在真正需要多轮时寻求经过身份验证的、持久 cookies 的流。关于同一模式的搜索和 AI 答案,请参见 如何使用 Scrapeless 抓取 Google 搜索结果,并在 定价页面 上比较运行时间和计划。
准备好构建您的 AI 驱动的数据管道了吗?
加入我们的社区,领取免费的计划,并与正在构建 LLM 答案提取管道的开发者联系: Discord · Telegram。
在 app.scrapeless.com 注册,获取免费的抓取浏览器运行时间,并根据您的管道所需的 Qwen 提示、地区和经过身份验证的对话适应上述模式。
常见问题
问:抓取 Qwen 合法吗?
答:在大多数司法管辖区,出于分析、模型评估和研究目的收集公开可见的答案是普遍允许的,但仍适用 Qwen 和阿里巴巴的服务条款,并且法律因地区而异。在商业部署之前,请审阅目标条款并咨询律师,尤其是关于存储生成内容或任何涉及个人数据的内容。
问:我需要代理吗?
A: 是的,chat.qwen.ai 通过 IP 进行个性化设置和速率限制,单个原始 IP 会迅速被限制。使用 --proxy-country 固定住宅出口(第一步);将国家与您希望 Qwen 使用的语言匹配。
Q: Qwen 显示“欢迎 / 登录”墙——我如何获得干净的渲染?
A: 对于单个答案,访客界面无需登录——首先打开 https://chat.qwen.ai/ 来预热会话,并确认组合器已挂载(第二步),然后再输入,并保持住宅出口固定。只有多轮路径需要一个账户;这是第 5 步中的身份验证前提,其中注入的 Cookies 或身份验证库会在调用之间保持登录状态。
Q: 在 Qwen 更新后选择器停止匹配——现在该怎么办?
A: Qwen Studio 在发布中旋转类名。使用 get html "main" 重新发现实时 DOM,并根据实际渲染的内容收紧选择器。依赖于稳定的锚点:单个组合器 textarea.message-input-textarea、助手包装器 .qwen-chat-message-assistant 和答案主体 .response-message-content.phase-answer。
Q: 我可以同时运行多少个 Qwen 会话?
A: 每个主机保持大约三个工作进程,将每个作业的 CLI 调用链在一个 shell 中运行,并给每个工作进程一个唯一的会话名称(第 6 步)。要想提高吞吐量,请在主机之间分片,而不是在一个主机上堆叠工作进程。
Q: 我可以在没有 AI 代理的情况下做到这一点吗?
A: 是的。上面的 bash 可以独立运行。此技能仅允许您的代理从单行提示中驱动相同的开放 → 提交 → 等待 → 提取循环,这是推荐路径,但不是必需的。
Q: 我如何捕获 Qwen 的推理轨迹?
A: 使用 .qwen-chat-thinking-status-card-title-text 检测推理卡片;折叠的“思考完成”标签表示推理过程已运行。与 .response-message-content.phase-answer 分开查询,以便推理文本和最终答案保留在不同字段中,如需链本身,请展开卡片。
Q: Qwen 会用中文还是英文回答?
A: 这取决于提示语言以及账户或代理的地区。用目标语言提问,并固定一个匹配的 --proxy-country 以保持多语言评估集中的答案一致。
在Scrapeless,我们仅访问公开可用的数据,并严格遵循适用的法律、法规和网站隐私政策。本博客中的内容仅供演示之用,不涉及任何非法或侵权活动。我们对使用本博客或第三方链接中的信息不做任何保证,并免除所有责任。在进行任何抓取活动之前,请咨询您的法律顾问,并审查目标网站的服务条款或获取必要的许可。



