容器即服务的网页抓取工具 Scrapeless
Lead Scraping Automation Engineer
TL;DR:
- 作为服务的容器管理抓取工人的运行时。 您的应用程序仍然定义目标,验证响应,并决定记录所属的位置。
- Scrapeless Web Unlocker 在工人容器外处理网络访问请求。 此工作流程需要一个 HTTP 客户端,而不是本地安装的浏览器。
- 完成的过程并不能证明数据有用。 在写入接受的记录之前,请检查目标内容。
- 运行时秘密和持久存储应在映像之外。 替换容器应该从配置开始,而不是从旧文件系统恢复凭据。
- 免费开始。 创建一个 Scrapeless 账户,利用可用的免费积分评估小型工作负载。
介绍:容器应执行一个可预见的工作
抓取工人有很大一部分时间在等待另一个系统。它发送请求,等待页面,检查响应,并写入结果。将这些步骤打包在一个容器中,使执行环境可重复。这并不决定返回的页面是否包含应用程序所需的信息。
作为服务的容器,或 CaaS,为团队提供了管理基础设施,用于部署和运行这些容器。有用的设计问题是将每个责任放置在哪里。运行时调度工人。工人拥有任务。网络访问服务处理目标请求。存储在工人退出后保留证据。
本教程围绕 Scrapeless Web Unlocker 开发一个小型的 Python 工人,并展示如何将其打包为容器平台。同样的分离在一个 竞争定价管道 中也是有用的,其中页面检索仅仅是数据标准化和分析之前的一个阶段。
作为服务的容器实际管理的内容
作为服务的容器管理容器执行,而您的应用程序保留对其工作负载和数据的责任。根据平台的不同,管理层可以覆盖调度、资源分配、网络、健康检查和扩展。
Dockerfile 描述了如何构建一个镜像。镜像是打包的应用程序。容器是一个正在运行的实例。协调器决定实例在哪里和何时运行。这些概念相互配合,但是单独的 Dockerfile 并不能提供一个管理平台。Dockerfile 构建模型 是打包下面工人的起点。
| 责任 | 此设计中的拥有者 | 保留的证据 |
|---|---|---|
| 调度任务 | 您的应用程序或作业调度器 | 任务标识符和批准的 URL |
| 运行工人 | 容器平台 | 退出状态和资源使用情况 |
| 请求页面 | Scrapeless Web Unlocker | 原始响应和服务结果 |
| 验证内容 | 您的工人 | 预期内容检查 |
| 保存接受的数据 | 您的存储集成 | 记录键和写入确认 |
当同一工人必须在多个环境中反复运行或任务量需要多个工人时,CaaS 是有用的。一个单一的本地脚本可能足以用于偶尔的导出。当其操作收益证明了部署和监控工作的合理性时,选择管理运行时。
管道一瞥
该管道将一个批准的 URL 转换为一个存储的页面响应,并做出明确的验证决策。每个进程开始时只有一个任务,然后在任务合同稳定后添加队列。
顺序是:任务输入 → Web Unlocker 请求 → 响应捕获 → 预期内容检查 → 接受记录。演示写入一个挂载的输出目录。生产实现应该用持久存储或适合所选平台的持久卷替换该目录。
Scrapeless Web Unlocker 位于访问步骤中。它不是一个容器调度器、队列或数据库。保持该边界清晰使得可以在不重写提取政策的情况下更改部署平台。
先决条件
您需要 Python、Requests 包、一个有效的 Scrapeless API 密钥,以及一个您被授权收集的公共目标。在运行时环境中设置 SCRAPELESS_API_KEY、TARGET_URL 和 EXPECTED_TEXT。最后一个值是应该出现在目标页面中的短语,而不是一个通用挑战检测器。
容器执行还需要 Docker 或兼容的构建运行时。部署需要一个容器注册表和一个配置好的 CaaS 账户或集群。经过身份验证的 Scrapeless 执行和容器构建是该示例的环境相关先决条件;此处没有断言成功的服务响应或托管部署。
对于本地 Python 依赖,运行 python -m pip install requests。 Web 解锁请求合同 定义了下面使用的参与者和请求信封。
第 1 阶段:编写一个有界页面工作者
工作者提交一个请求并保留其原始响应,然后决定页面是否可接受。将以下内容保存为 worker.py。
注意:此块需要您的 Scrapeless API 密钥和一个经过批准的目标。该示例未执行经过身份验证的请求;在部署之前请根据您的帐户验证响应。
python
import hashlib
import json
import os
import time
from pathlib import Path
import requests
url = os.environ["TARGET_URL"]
expected = os.environ["EXPECTED_TEXT"]
output = Path(os.environ.get("OUTPUT_DIR", "/output"))
output.mkdir(parents=True, exist_ok=True)
response = requests.post(
"https://api.scrapeless.com/api/v2/unlocker/request",
headers={"x-api-token": os.environ["SCRAPELESS_API_KEY"]},
json={
"actor": "unlocker.webunlocker",
"input": {"url": url, "method": "GET", "redirect": False},
"proxy": {"country": "ANY"},
},
timeout=120,
)
response.raise_for_status()
body = response.content
capture_id = hashlib.sha256(body).hexdigest()
(output / f"{capture_id}.response").write_bytes(body)
if expected.casefold() not in response.text.casefold():
raise RuntimeError("Expected page content was not found")
record = {
"requested_url": url,
"collected_at_unix": int(time.time()),
"response_sha256": capture_id,
"response_bytes": len(body),
"http_status": response.status_code,
"validation": "expected_text_present",
}
(output / f"{capture_id}.json").write_text(json.dumps(record, indent=2))
print(json.dumps(record))
该记录是一个应用程序定义的输出,而不是关于 Scrapeless 响应字段的声明。原始响应被保留,并不假定每个目标都产生相同的内容类型。配置的超时时间限制了客户端的等待;它不定义服务级别的保证。
预期短语是最小检查。对于结构化数据,将其替换为一个解析器,该解析器要求必要字段并验证其类型。出现在错误消息中的标题不应视为有效的产品记录。 HTTP 响应语义 描述协议结果;业务验证属于您的应用程序。
开始使用 Scrapeless 抓取数据
使用 Scrapeless 提升您的网页抓取和自动化工作流程!
今天注册并获得 5 美元的免费积分 — 无需信用卡。立即在 Scrapeless 控制面板 领取您的免费积分。
第 2 阶段:打包不带凭据的工作者
该镜像应包含代码和依赖,而运行时提供秘密。将此 Dockerfile 放在 worker.py 旁边。
注意:构建此配置需要安装的容器运行时和注册表访问权限。镜像构建和容器执行仍然是部署的先决条件;此配置不是已捕获的部署结果。
dockerfile
FROM python:3.12-slim
WORKDIR /app
RUN pip install --no-cache-dir requests
COPY worker.py /app/worker.py
CMD ["python", "/app/worker.py"]
这个最小镜像故意保持依赖管理可见。对于发布,解析并锁定构建环境中的依赖版本,扫描生成的镜像,并部署您批准的镜像摘要。请勿将 API 密钥放入 Dockerfile、构建参数或复制的环境文件中。 运行时秘密配置 将凭证交付与镜像分开。
对于本地容器检查,在您的 shell 中准备环境变量,并在运行下面的命令之前创建一个可写的 output 目录。通过名称传递环境变量可以避免将其值写入命令中。
注意:这些命令需要 Docker、上述文件和经过身份验证的运行时配置。在此示例中未在本地 Docker 引擎上运行。
bash
docker build -t scrapeless-page-worker .
mkdir -p output
docker run --rm \
-e SCRAPELESS_API_KEY -e TARGET_URL -e EXPECTED_TEXT \
-v "$PWD/output:/output" \
scrapeless-page-worker
零退出代码意味着该工作者已到达其最终打印语句。确认原始捕获和元数据文件均存在,检查页面内容,并在将示例视为接受之前检查配置的目标是否与预期来源匹配。
第 3 阶段:作为作业部署,然后引入队列
作业是处理有界输入并退出的工作者的自然部署形态。 Kubernetes 作业工作负载 代表了基于 Kubernetes 平台的这种执行模式;其他托管容器系统以不同的配置暴露类似的任务或作业概念。
选择一个平台并配置其镜像引用、命令、秘密注入、输出目标和任务截止日期。运行与本地使用相同的小目标集。在增加工作者数量之前,比较接受的记录、被拒绝的响应和总服务使用情况。
当作业需要共享调度时,队列变得有用。定义一个在同一调度观察交付多次时保持稳定的任务标识符。如果目的是在时间内收集快照,请在该标识符中包含观察期。否则,仅包含 URL 的键可能会错误地合并不同的观察。
第四阶段:测量已接受记录和资源成本
工人监控应该区分流程健康和数据质量。跟踪已接受的记录、被拒绝的响应、队列年龄以及等待服务的时间。仅凭 CPU 使用率可能不足以作为主要等待网络响应的应用程序的扩展信号。
保持初始并发量小,并限制每个目标的工作量。每个主机最多三个工人的内部起始限制是一个保守的示例设置,而不是普遍的网站允许值。站点政策和帐户限制可能要求更低的值。
在定价页面上将容器运行时成本与实际 Scrapeless 使用进行比较。不要根据工人的正常运行时间推断 API 消耗:正在运行的容器可以处于空闲状态,而短作业可以执行多个可收费操作。
根据原始响应的内容进行保护。请求头、Cookie 和任何授权的会话材料需要比公共页面文本更严格的处理。仅保留提取任务所需的证据。
结论:部署您可以验证的合同
有用的 CaaS 抓取工作流程具有小的任务合同、一个检查其输出的工人,以及能够在流程终止后存活的存储。从单页面工人开始,使用您的帐户验证其响应处理,然后在添加编排之前在容器内运行相同的代码。
下一个部署里程碑是带有其来源和捕获证据的已接受记录。工人数量在该结果可重复之后确定。
准备好构建您的网络数据管道了吗?
加入在Discord和Telegram上进行网络数据收集的开发人员。
创建一个Scrapeless帐户,并根据您自己的批准数据源调整工作流程。
常见问题
问:从容器抓取与运行本地脚本在法律上有何不同?
容器部署并不会改变对目标的访问权限或数据使用义务。请查看适用的条款和涉及的来源及数据的规则。
问:CaaS 平台是否为此工人提供代理?
该工人将其目标请求委托给 Web Unlocker,并在该请求中使用文档中的代理配置。容器自身的出站 IP 不会自动成为住宅代理。
问:当响应是访问拒绝页面时应发生什么?
将该页面视为任务数据拒绝,并保留最小的诊断记录。在授权另一项采集工作之前,请检查目标范围和支持的访问路径。
问:当网站的 HTML 更改时会发生什么变化?
更新并验证提取合同。将代码打包在容器中并不会使选择器或预期内容免受页面更改的影响。
问:一次应该运行多少个工人?
从小的有界工作负载开始,并测量每个目标的已接受输出。示例中每个主机最多三个工人的上限是一个应用设置,受更严格的目标和帐户限制的约束。
问:这个工作流程需要 AI 代理吗?
不需要。Python 工人和容器命令在没有语言模型的情况下运行。代理可以创建任务,但不应替代工人的确定性内容检查。
在Scrapeless,我们仅访问公开可用的数据,并严格遵循适用的法律、法规和网站隐私政策。本博客中的内容仅供演示之用,不涉及任何非法或侵权活动。我们对使用本博客或第三方链接中的信息不做任何保证,并免除所有责任。在进行任何抓取活动之前,请咨询您的法律顾问,并审查目标网站的服务条款或获取必要的许可。



