用途
Apify Core Workflow B 是一份技能文档,聚焦 Apify 平台的存储管理与多 Actor 流水线编排。它面向需要通过 apify-client JS SDK 以编程方式操作 Apify 存储、并把多个 Actor 串联成完整流程的开发者。
主要能力
文档围绕 Apify 的三种存储类型展开:
- 数据集(Dataset):适合存放同类条目列表(如商品、页面),类比为只追加的表。
- 键值存储(Key-Value Store):适合存放配置、截图、摘要或任意文件,类比为 S3 桶。
- 请求队列(Request Queue):适合存放待抓取的 URL(由 Crawlee 管理),类比为任务队列。
命名存储可长期保留;未命名(默认运行)存储 7 天后过期。
文档还覆盖:存储的增删改查操作、数据导出(CSV/JSON/XLSX)、自动分页、二进制记录、以及多 Actor 流水线(抓取→转换→导出)和 Actor 运行状态/成本/中止监控。
使用方式
前置条件:安装 apify-client(npm install apify-client);拥有 Apify 账号令牌并以 APIFY_TOKEN 环境变量导出;熟悉 apify-core-workflow-a(Actor 调用与运行生命周期)。
认证方式:所有操作使用 Apify API 令牌认证,切勿硬编码,应从环境读取并只构造一次客户端:
import { ApifyClient } from 'apify-client'; const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
令牌可在 Apify Console → Settings → Integrations 生成,然后导出(export APIFY_TOKEN=apify_api_...)或从密钥管理器加载。
数据集示例:
const dataset = await client.datasets().getOrCreate('product-catalog'); const dsClient = client.dataset(dataset.id); await dsClient.pushItems([{ sku: 'ABC123', name: 'Widget', price: 9.99 }]); const { items, total } = await dsClient.listItems({ limit: 100, offset: 0 });
键值存储示例:
const store = await client.keyValueStores().getOrCreate('scraper-config'); const kvClient = client.keyValueStore(store.id); await kvClient.setRecord({ key: 'settings', value: { maxRetries: 3 }, contentType: 'application/json' }); const record = await kvClient.getRecord('settings');
请求队列示例:
const queue = await client.requestQueues().getOrCreate('my-crawl-queue'); const rqClient = client.requestQueue(queue.id); await rqClient.addRequest({ url: 'https://example.com/page1', uniqueKey: 'page1' });
导出数据集为 CSV 示例:
const csvBuffer = await client.dataset('product-catalog').downloadItems('csv'); require('fs').writeFileSync('products.csv', csvBuffer);
读取 Actor 运行的 OUTPUT 记录示例:
const run = await client.actor('apify/web-scraper').call(input); const output = await client.keyValueStore(run.defaultKeyValueStoreId).getRecord('OUTPUT');
输出格式
- 数据集:listItems() 返回 { items, total, count, offset, limit };downloadItems(format) 返回 csv/json/xlsx 格式的 Buffer。
- 键值存储:getRecord() 返回 { key, value, contentType };listKeys() 返回 { items }(每项为 { key, size })。
- 请求队列:get() 返回 { pendingRequestCount, handledRequestCount, ... }。
- 流水线:返回命名导出数据集 id;运行监控每次运行返回 { status, statusMessage, stats, usage, usageTotalUsd }。
适用场景
适合需要以编程方式读写 Apify 存储、导出抓取数据、管理可恢复的抓取 URL 队列,以及把多个 Actor 串联成抓取→转换→导出流程的开发者。
限制与错误处理
- 数据集未找到:未命名存储超过 7 天过期,应使用命名数据集以持久化。
- 记录过大:键值存储单条记录上限 9MB,应拆分为多条记录。
- 推送失败:数据集单批条目超过 9MB,应分批推送。
- 请求已存在:uniqueKey 重复,属预期行为,队列会自动去重。
更完整的操作集(自动分页循环、CSV/JSON/XLSX 导出、字段过滤、二进制记录、键列表、读取运行默认 OUTPUT、批量添加与队列统计、runPipeline() 函数与运行监控代码)见参考文件 storage-operations.md 与 pipelines.md。