屏幕抓取:工具、Python 示例与自动化

商品页面会显示标题、价格和库存状态,但你需要把这些信息整理成可以更新、可以对比的数据集。
本指南使用 CyberYozh 的 Yozh Scraper 来演示屏幕抓取,从单个页面开始,逐步过渡到可重复执行的数据采集。
你将学会如何选择提取方式、检查输出是否与页面一致,以及保存有用的记录。接着,我们会介绍用于重复执行任务的 Python 和自动化方案,以及在地理位置或连接一致性很重要时的代理设置。
理解这些术语:屏幕抓取、网页抓取与解析
屏幕抓取是提取通过可视化界面呈现的信息,例如渲染后的网页、没有导出功能的旧式桌面应用程序,或用光学字符识别(OCR)读取的截图。
在网页项目中,这些术语存在交叉。网页抓取涵盖网站数据的采集,包括获取页面并提取其内容。屏幕抓取侧重于通过界面呈现的信息,这类信息通常无需 OCR,直接从页面元素中就能读取。解析是对 HTML、文本或其他数据进行解读,以识别出各个值;随后再通过清洗和验证,让这些值可以投入使用。
什么是屏幕抓取
屏幕抓取是自动提取通过用户界面呈现的信息。屏幕抓取工具读取这些信息,并将其转换为其他系统可以使用的数据,例如电子表格中的行或 JSON 文件中的字段。
数据来源决定了抓取工具的工作方式:
网页:浏览器加载商品页面,然后抓取工具从渲染后的内容中采集标题、价格和库存状态。
旧式应用程序:自动化程序从缺少可用导出选项的旧业务系统中读取库存或客户信息。
图像:光学字符识别(OCR)将截图或扫描图像中的文字转换为机器可读的字符。
屏幕抓取如何工作?
以亚马逊这样的商品页面为例:浏览器加载界面,提取规则识别各个值,验证环节检查结果是否可用。整个流程分为五个阶段:
打开页面。使用任务所需的位置和会话设置,访问商品 URL。
等待所需内容。在采集之前,确认价格和库存状态已经加载完成。
定位并提取字段。用选择规则抓取商品标题、价格、币种和库存状态。
验证各个值。检查是否有字段缺失、币种是否异常,以及是否误把错误信息当作商品数据抓取。
保存输出。将记录连同来源 URL 和采集时间一起存储,方便日后对比结果。
你的 Amazon 抓取工具可以在返回提取字段的同时附带截图。两者一并保留有助于排查差异:你可以把缺失或错误的值与浏览器实际显示的内容对照,找出提取环节出错的位置。
屏幕抓取与网页抓取、API 的对比
请选择能以最少多余处理获得所需字段的方法。先从能提供所需数据的最简单方法入手。先查看是否有官方 API 或内置的目录导出功能,例如 CSV 文件、Excel 价目表或 XML 订阅源。
如果这些都不适用,就检查服务器返回的 HTML,看它是否包含所需字段,还是这些字段由 JavaScript 加载。这有助于判断是否需要浏览器渲染或交互。
方法 | 读取内容 | 适用场景 | 主要维护要求 |
API 或导出 | 结构化响应或可下载的文件 | 数据源提供你所需的字段 | 跟进架构变更、访问要求和配额 |
直接提取 HTML | 服务器返回的 HTML | 无需运行 JavaScript 即可获得数据 | 标记变化时更新提取规则 |
基于浏览器的提取 | 渲染或交互之后的页面元素 | 内容取决于 JavaScript、筛选条件或会话状态 | 维护选择器、加载条件和会话 |
OCR 或桌面自动化 | 图像像素、终端文本或应用程序控件 | 界面能提供数据,但没有可用的导出功能 | 检查布局变化、控件标识符和识别准确率 |
屏幕抓取与网页抓取存在交叉。渲染网站并读取其页面元素仍属于网页抓取;使用浏览器并不意味着一定要解读像素。
Yozh Scraper 支持基于浏览器的抓取:它能渲染由 JavaScript 驱动的页面,在已配置的会话内跨请求复用存储在 cookie 和 localStorage 中的登录状态,并为重复性的提取任务保存选择器预设。
屏幕抓取工具:按数据源选择
合适的网页屏幕抓取工具取决于数据出现在哪里,以及你如何访问它。开源屏幕抓取工具涵盖浏览器自动化和 OCR,而更全面的平台还支持桌面流程。
Yozh Scraper:开箱即用的浏览器提取服务
Yozh Scraper 是一款免费、可自行托管的 REST API,基于 Playwright 构建。它在真实浏览器中渲染网页,并返回通过 CSS 或 XPath 选取的字段、供大语言模型(LLM)使用的整洁 Markdown、原始 HTML 以及整页截图。内置预设和自定义预设可复用提取规则,异步任务队列则负责处理单页和批量请求。
完成初始的代码仓库和环境设置后,docker compose up --build 会同时启动抓取工具及其配套的爬虫。可选的 Scraper Tester 需要 Node.js,并需单独启动,它提供一个用于测试选择器和检查结果的网页界面。
该项目采用 MIT 许可证,因此你可以在本地运行它,无需支付软件许可费用,也无需付费集成。计算资源由你自行提供;托管、付费代理以及可选的 LLM API 用量在使用时(包括测试期间)会产生单独的费用。下一节将介绍如何配置提取并验证结果。
Playwright:通过 Python 直接控制浏览器
如果你想用 Python 编写点击、筛选和导航脚本,可以选择 Playwright。它提供浏览器自动化,而提取、验证和存储由你的代码来定义。选择器和加载条件需要你自行维护。
Tesseract:识别图像中的文字
Tesseract 是一款免费的开源 OCR 引擎,可将图像中的文字转换为机器可读的输出。它适用于扫描文档,或只以像素形式存在的信息,例如嵌入图像或绘制在画布上的价格、电话号码或 SKU。请先截取相关图像,再检查识别出的文字是否有错误,然后保存。
UiPath:跨应用程序界面的自动化
UiPath 是一个面向桌面和网页应用程序的机器人流程自动化(RPA)平台。它适用于涉及旧式 Windows 仓储或会计系统、且这些系统没有可用导出功能的工作流。自动化程序可以在应用程序窗口之间切换,读取可访问的界面控件,并在文本仅显示于屏幕上时使用 OCR。提取出的表格数据仍需检查是否存在识别错误,以及行列是否对齐。
如何使用 Yozh Scraper 进行屏幕抓取
先从 Books to Scrape 开始,这是一个专为抓取练习搭建的沙盒书店。它的 A Light in the Attic 商品页面字段可预期、内容静态,适合在处理动态网站之前熟悉各项操作。
1. 定义输出
创建一条包含商品标题、价格、库存状态、来源 URL 和采集时间的记录。前三项从页面中提取;URL 和 UTC 时间戳在保存记录时添加。
2. 启动抓取工具
在已安装 Git 和 Docker 的前提下,按照 Yozh Scraper 安装指南操作:
git clone https://github.com/CyberYozh-data/yozh-scraper
git clone https://github.com/CyberYozh-data/yozh-scraper
cd yozh-scraper
cp .env.example .env
docker compose up --build最后一条命令会同时启动 8000 端口上的抓取工具和 8001 端口上的配套爬虫。请保持 Docker 运行。在 http://localhost:8000/docs 打开抓取工具的 API 文档;爬虫的文档位于 http://localhost:8001/docs。
3. 打开可视化测试器
测试器需单独启动,并要求 Node.js 18+。在另一个终端中,进入 yozh-scraper 仓库文件夹并运行:
cd scraper-tester
npm install
node server.js打开 http://localhost:7000。在页眉中确认 Scraper URL 为 http://localhost:8000,然后点击旁边的 Check。绿色的健康状态标识表示抓取工具可以访问。
4. 配置提取
在 Scrape Page 中输入练习用 URL,选择直连(none),并使用以下规则配置 CSS 提取:
字段 | CSS 选择器 |
标题 | .product_main h1 |
价格 | .product_main .price_color |
库存状态 | .product_main .availability |
读取每个元素的文本,并将这些字段标记为必填。将 wait_for_selector 设置为 .product_main .price_color。启用截图输出,并保持图片拦截处于关闭状态。
5. 运行小规模样本
打开 Presets 并使用 Preset Builder。粘贴同一个商品 URL,点击 Fetch sample,然后选择 Manual 并输入已验证的 CSS 规则。点击 Verify,并在保存之前检查提取出的值。
请起一个具有描述性的名称;测试器会自动添加 user_ 前缀。在 Scrape Page 中选择保存好的预设,并在扩大采集范围之前,先测试另一个图书页面。配置完成后,也可以使用 AI 辅助的字段选择。
对于之后需要区域访问的任务,请在 .env 中设置 CYBERYOZH_API_KEY,应用更新后的 Docker 配置,并选择你已购买的代理连接。使用 res_rotating 配合 proxy_geo.country_code 来指定国家。Yozh Scraper 会自动让浏览器的语言区域、时区和 Accept-Language 标头与该国家保持一致。在采集更大的数据集之前,请核实出口 IP 的位置和所显示的内容。
6. 保存可复用的预设
打开 Presets,获取同一个样本,选择 Manual,并输入已验证的规则。使用 Verify,然后以具有描述性的名称保存预设。在 Scrape Page 中选择它,并在扩大采集范围之前,先测试另一个图书页面。配置完成后,也可以使用 AI 辅助的字段选择。
当后续目标需要区域访问时,请配置你的 CyberYozh API 密钥和已购买的代理连接。轮换住宅代理支持定位和地理定位;在采集更大的数据集之前,请检查返回的地区。
Python 屏幕抓取:提取并保存页面数据
用 Python 进行屏幕抓取,可以让你掌控页面导航、提取和存储。本示例使用与可视化演练相同的 Books to Scrape 商品页面和选择器,然后将验证通过的记录保存为 JSON。
使用 python -m pip install playwright 安装 Playwright,然后运行 python -m playwright install chromium。将脚本保存为 scrape_product.py,并运行 python scrape_product.py。
如需使用 CyberYozh 连接(可选),请在运行脚本的 shell 中设置以下环境变量:
CYBERYOZH_PROXY_SERVER:你的 HTTP 代理地址,格式为 http://HOST:PORT。
CYBERYOZH_PROXY_USERNAME:你的代理用户名。
CYBERYOZH_PROXY_PASSWORD:你的代理密码。
如果没有设置 server 变量,脚本将直接连接。Playwright 支持为浏览器或单个浏览器上下文配置代理。
import json
import os
from datetime import datetime, timezone
from playwright.sync_api import sync_playwright, TimeoutError
URL = "https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html"
FIELDS = {
"title": ".product_main h1",
"price": ".product_main .price_color",
"availability": ".product_main .availability",
}
options = {}
if server := os.getenv("CYBERYOZH_PROXY_SERVER"):
options["proxy"] = {
"server": server,
"username": os.getenv("CYBERYOZH_PROXY_USERNAME", ""),
"password": os.getenv("CYBERYOZH_PROXY_PASSWORD", ""),
}
with sync_playwright() as p:
browser = p.chromium.launch(**options)
try:
page = browser.new_page()
response = page.goto(URL, wait_until="domcontentloaded")
if response is None or not response.ok:
raise SystemExit("Page request failed; check the URL and connection.")
record = {}
for field, selector in FIELDS.items():
element = page.locator(selector)
try:
element.wait_for(state="visible", timeout=10000)
value = " ".join(element.inner_text().split())
except TimeoutError:
raise SystemExit(f"Required field missing or not ready: {field}")
if not value:
raise SystemExit(f"Required field is empty: {field}")
record[field] = value
record.update(
source_url=page.url,
collected_at=datetime.now(timezone.utc).isoformat(),
)
with open("product.json", "w", encoding="utf-8") as output:
json.dump(record, output, ensure_ascii=False, indent=2)
print("Saved product.json")
finally:
browser.close()脚本会等待每个必填元素,去除多余的空白字符,并保留页面显示的币种。如果字段缺失或为空,运行会在写入新记录之前中止,并给出明确的提示信息。成功的输出包含来源 URL 和 UTC 采集时间;重新运行会覆盖 product.json。
小贴士:如需了解更多关于选择字段和整理提取值的内容,请参阅数据解析指南。
如果你已经配置了 Yozh Scraper,Python 可以通过其 REST API 复用你保存的预设:
将其提交到 POST /api/v1/scrape/preset/page,并保留返回的 job_id。
轮询 GET /api/v1/scrape/{job_id} 直至任务完成,同时设置整体超时,并处理失败或已取消的任务。
获取 GET /api/v1/scrape/{job_id}/results,验证字段并保存。
借助爬虫、定时任务和 AI 工具实现屏幕抓取自动化
第一次商品页面提取成功之后,下一个挑战是在整个商品目录中采集最新数据。请围绕这套已测试通过的配置构建自动化流程,包括对页面发现的限制、定时运行,以及保存结果前的检查。
使用 Yozh Crawler 发现更多页面
Yozh Crawler 是运行在 8001 端口上的配套服务,它会发现链接,并通过 Yozh Scraper 获取页面。将某个分类页面作为 seed_url 提供,然后把 scope.mode 设置为 same-domain,或使用带有包含和排除模式的 regex 来限制发现范围。设置 scope.max_pages 和 scope.max_depth,以限制页面数量和链接深度。启用 enable_scraping 并提供提取规则,即可在保留已发现 URL 的同时保留提取出的字段。
在电商网站上,同一个商品 URL 可能带有结尾斜杠,或者相同的查询参数以不同顺序出现。URL 规范化会将这些变体归一为同一个指纹,以减少重复访问。在 same-domain 模式下,爬虫还会把带 www 和不带 www 的主机名视为等同。改变参数的值(例如排序选项或商品变体)与调整参数顺序不同,不会自动使这些 URL 等同。
通过 scope.per_domain_rps 控制请求频率,通过 scope.per_domain_concurrency 控制并发请求数。先将上限设为 10 到 20 个页面,检查发现的 URL,并排除博客文章或联系页面等无关栏目,然后再扩大采集范围。
使用 n8n 安排定时采集
将 n8n 连接到可访问的 Yozh REST API 端点,并构建以下流程:
定时触发 → 提交抓取任务 → 检查是否完成 → 验证结果 → 保存数据。
使用 n8n 的 Schedule Trigger 来设定间隔,并用 HTTP Request 节点提交任务。保留其任务 ID,然后通过“等待并检查”的循环来监控任务是否完成。添加整体超时和失败分支,以便对失败的任务及时处理。
保存之前,检查必填字段并附上采集时间。这一集成使用 Yozh 的 API 和 n8n 的标准节点,定时由 n8n 管理。
小贴士:如需了解安排周期性采集的其他方式,请参阅网页抓取自动化指南。
通过 MCP 连接 AI 助手
模型上下文协议(MCP)让 Claude 等 AI 助手可以调用外部工具。对于本地部署,请使用 Streamable HTTP 将 Claude Code 连接到 [http://localhost:8000/mcp](http://localhost:8000/mcp)。之后你可以提问:“抓取这个商品页面,并用表格汇总价格。”助手可以提交抓取任务、检查进度、获取结果,并整理提取出的值。:chatgpt-content-reference{index="0"}
Yozh Scraper 还支持 AI 生成的预设。使用 from_prompt,可以用自然语言描述你需要的字段;使用 from_schema,可以提供字段名称和数据类型。结合示例页面,这些输入可以让模型生成选择器,你在保存之前可以进行验证。:chatgpt-content-reference{index="1"}
若要自动修复选择器,请配置 self_heal,并为预设运行提供 LLM 配置。如果某个必填字段返回为空,抓取工具会尝试根据当前页面标记重新生成其选择器。修复后的选择器可以保存回用户预设;内置预设保持只读。请将修复后的值与页面截图对照,因为即使字段有内容,仍可能包含错误的价格或商品详情。:chatgpt-content-reference{index="2"}
要启用 Yozh 的 AI 生成和修复功能,请在 .env 中配置 OpenAI、Anthropic、Google Gemini 或 OpenRouter 的 API 密钥,并选择兼容的模型。API 用量按你所选服务商的定价单独计费。:chatgpt-content-reference{index="3"}
根据任务选择连接和会话设置
在屏幕抓取网站时,请根据所需的位置、会话时长以及重复访问页面的频率来选择连接设置。CyberYozh 的代理选项适合不同的需求:
轮换住宅代理($4/GB,按量付费):使用区域 IP 采集彼此独立的商品页面;当相互关联的步骤需要保持连续性时,可使用最长 24 小时的 sticky 会话。未用完的流量可结转,套餐越大,每 GB 单价越低。
获取 1 亿个真实住宅 IP。
静态 ISP 代理($5.29/月起):选择不限流量的固定 IP,适用于重复访问、需登录的采集,以及需要保持一致网络地址的任务。
租用你的静态 ISP 代理,在整个租期内使用同一个地址。
移动 LTE/4G/5G(共享套餐 $1.70/天起):对于 Google 搜索抓取以及其他流量过滤严格的目标,可以考虑运营商连接。运营商级 NAT (CGNAT)让许多普通移动用户共用一个公网 IP,因此封禁整个地址也可能影响到正常访客。这使得运营商连接值得测试,不过共享 IP 仍可能遇到验证码(CAPTCHA)或速率限制。当浏览器渲染需要反复下载脚本、样式和图片时,不限流量可让带宽成本保持可控。若要并行采集,可以租用多个移动通道,并将浏览器工作进程分配到这些通道上,同时根据连接容量和目标的限制调整并发数。
获取你的移动代理,IP 干净,无需额外修补。
数据中心代理:适用于合适的公开数据源,前提是小规模测试已确认访问和提取均可正常进行。
获取高速独享 IPv4/IPv6 数据中心代理,正常运行时间 99.99%。
对于需要登录或需要固定配送邮编的页面,会话的连续性取决于已保存的浏览器状态和代理 IP 的持久性两个方面。Cookie 和 localStorage 可以保留身份验证信息和区域偏好,具体取决于网站的存储方式。
Yozh Scraper 允许你通过 POST /api/v1/sessions 创建会话,通过 POST /api/v1/sessions/{id}/login 进行身份验证,并在后续抓取请求中传入返回的 session_id。这样可以复用已保存的浏览器状态,并保持会话的代理配置一致。当对外地址必须保持稳定时,请搭配静态 IP 或配置得当的 sticky 连接。固定 IP 无法刷新已过期的登录令牌,而已保存的 cookie 也无法保证网站会接受突然变化的 IP。
在任务开始前,CyberYozh IP Checker 可以帮助检查信誉和位置信号。其 API 支持提交 IP 信誉检查并获取报告。请将这些结果与小规模测试请求结合使用:每个目标都有自己的访问规则,因此一份良好的报告并不能保证目标会如何响应。
常见的屏幕抓取问题及解决方法
当一次运行产生的记录不完整或不一致时,请将保存的截图与同一任务的示例输出进行对比。这有助于区分是页面加载问题,还是提取或格式化错误。
问题 | 检查与修复要点 |
字段缺失 | 等待所需内容加载,对照当前页面验证选择器,并在保存前标记为空的必填字段。 |
价格不正确 | 确认币种、配送地点和所选变体。在将价格转换为数字之前,检查小数分隔符。 |
页面内容异常 | 检查登录状态、同意弹窗和重定向。确认语言和区域设置与预期的视图一致。 |
重复记录 | 规范化等效的 URL,并使用稳定的商品标识符。保留变体、地区和采集时间之间有意义的差异。 |
频繁触发速率限制 | 找出返回 429 的服务。降低请求频率和并发数,遵守 Retry-After,并以递增的延迟限制重试次数。 |
布局变化 | 更新提取规则,或使用已配置的预设修复功能,然后对照页面手动核实修订后的输出。 |
修改 Yozh 预设后,请先重新运行一个小样本,再重新启动完整采集。有关重试处理的详细信息,请参阅 429 请求过多。
屏幕抓取合法吗?
屏幕抓取可以是合法的,但合法性取决于数据来源、访问方式、数据类型、司法管辖区和预期用途。能够查看某个页面,并不意味着自动获得任何形式的采集或再利用的授权。
在运行任务之前,请查阅网站的合同条款、访问限制,以及任何所需的许可或授权。请遵守其 robots.txt 指令,但请记住,Allow 规则本身并不授予采集或再利用内容的法律许可。在重新发布或出售提取的材料之前,请核查适用的版权和数据库权利。
如果你采集个人信息,请遵守适用的数据保护法规,包括适用时的 GDPR。正如国际隐私监管机构所强调的,公开可见的信息仍可能受到保护。请确立处理个人数据的有效合法依据,并且只收集为实现既定目的所必需的个人数据。
隐私方面的义务同样需要关注。国际隐私监管机构强调,可公开获取的个人信息仍可能受到数据保护法律的保护。
就本示例而言,请将 Yozh Scraper 限定在所选的练习页面和商品字段范围内。对于生产环境的工作,请记录获准的范围,只收集必要的数据,限制对已存储记录的访问,并制定保留和删除规则。保存的 HTML 和截图也应纳入这些管控,因为它们可能包含额外的信息。
