mcpField
A
apify-sdk-integration

apify-sdk-integration

github.com/apify开发2.5k3.2k 次安装1 周前更新
代码仓库

关于 apify-sdk-integration

这项开发技能介绍如何用 JavaScript、TypeScript 或 Python 的 apify-client,或其他语言的 REST API,在应用中运行 Apify Actor。内容涵盖运行控制、结果获取和集成实践。

主要功能

  1. 01使用 apify-client 运行 Actor
  2. 02支持同步或异步执行
  3. 03获取数据集和键值存储内容
  4. 04通过其他语言调用 REST API
  5. 05处理运行状态与错误

适用场景

  1. 01为应用添加网页抓取
  2. 02将 Actor 输出接入数据管道
  3. 03将 Apify 集成为应用后端

MCP 相关

建议使用 search-actors、fetch-actor-details 等 Apify MCP 工具查找 Actor,并查看输入架构、输出和定价。

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/apify/agent-skills --skill apify-sdk-integration

安装后在 Claude Code 中输入/apify-sdk-integration确认已加载。

详细介绍

Apify SDK 集成

将 Apify Actor 执行功能添加到现有应用中。本技能介绍适用于 JS/TS 和 Python 的 apify-client 包,以及适用于其他语言的 REST API。

何时使用本技能

  • 为现有应用添加网页抓取或自动化功能
  • 从应用代码中以编程方式调用 Apify Actor
  • 构建使用 Apify 作为后端服务的产品
  • 将 Actor 结果集成到数据管道中

重要:包名称

apify-client 是用于从应用中调用 Actor 的 API 客户端。 apify 是用于构建 Actor 的 SDK(本使用场景不应使用此包)。

始终安装 apify-client。集成时切勿安装 apify。

前提条件

用户需要一个 APIFY_TOKEN。请引导他们前往 https://console.apify.com/settings/integrations 中的 Console > Settings > Integrations 创建令牌。如果他们还没有账号,请访问 https://console.apify.com/sign-up(免费,无需信用卡)。

安全存储令牌——使用环境变量或密钥管理器,切勿将令牌硬编码。

查找合适的 Actor

编写集成代码之前,先找到符合用户需求的 Actor。若 MCP 工具可用,请使用:

  • search-actors — 按关键字搜索 Apify Store
  • fetch-actor-details — 获取 Actor 的输入架构、输出格式和定价

也可以浏览 https://apify.com/store。在任意 Actor 的 Store URL 后添加 .md,即可获取 Markdown 格式的文档。

JavaScript / TypeScript

安装
npm install apify-client
同步执行(等待结果)
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });

const run = await client.actor('apify/web-scraper').call({
    startUrls: [{ url: 'https://example.com' }],
    maxPagesPerCrawl: 10,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();

.call() 会一直阻塞,直到 Actor 执行完毕。适用于运行时间较短的 Actor(几分钟以内)。

异步执行(启动后再轮询/检索)
const run = await client.actor('apify/web-scraper').start({
    startUrls: [{ url: 'https://example.com' }],
});

// Poll for completion
const finishedRun = await client.run(run.id).waitForFinish();

// Retrieve results
const { items } = await client.dataset(finishedRun.defaultDatasetId).listItems();

对于长时间运行的 Actor,或需要立即获取运行 ID 的情况,请使用 .start() + .waitForFinish()。

检索结果
// Dataset items (structured data from pushData)
const { items } = await client.dataset(run.defaultDatasetId).listItems({
    limit: 100,
    offset: 0,
});

// Key-value store (files, screenshots, etc.)
const record = await client.keyValueStore(run.defaultKeyValueStoreId).getRecord('OUTPUT');
错误处理
try {
    const run = await client.actor('apify/web-scraper').call(input);

    if (run.status !== 'SUCCEEDED') {
        const log = await client.log(run.id).get();
        throw new Error(`Actor failed with status ${run.status}: ${log}`);
    }

    const { items } = await client.dataset(run.defaultDatasetId).listItems();
} catch (error) {
    if (error.message?.includes('not found')) {
        // Actor ID is wrong or Actor was deleted
    } else if (error.statusCode === 401) {
        // Invalid or missing APIFY_TOKEN
    }
    throw error;
}

Python

安装
pip install apify-client
同步执行
from apify_client import ApifyClient
import os

client = ApifyClient(token=os.environ['APIFY_TOKEN'])

run = client.actor('apify/web-scraper').call(run_input={
    'startUrls': [{'url': 'https://example.com'}],
    'maxPagesPerCrawl': 10,
})

items = client.dataset(run['defaultDatasetId']).list_items().items
异步执行
run = client.actor('apify/web-scraper').start(run_input={
    'startUrls': [{'url': 'https://example.com'}],
})

# Poll for completion
finished_run = client.run(run['id']).wait_for_finish()

items = client.dataset(finished_run['defaultDatasetId']).list_items().items
异步客户端(asyncio)
from apify_client import ApifyClientAsync

client = ApifyClientAsync(token=os.environ['APIFY_TOKEN'])

run = await client.actor('apify/web-scraper').call(run_input={
    'startUrls': [{'url': 'https://example.com'}],
})

items = (await client.dataset(run['defaultDatasetId']).list_items()).items

REST API(任何语言)

对于没有官方客户端的语言,请直接使用 REST API。

启动一次运行
POST https://api.apify.com/v2/actors/{actorId}/runs
Authorization: Bearer <APIFY_TOKEN>
Content-Type: application/json

{ "startUrls": [{ "url": "https://example.com" }] }
获取运行状态
GET https://api.apify.com/v2/actor-runs/{runId}
Authorization: Bearer <APIFY_TOKEN>
获取数据集条目
GET https://api.apify.com/v2/datasets/{datasetId}/items?format=json
Authorization: Bearer <APIFY_TOKEN>

完整 API 参考:https://docs.apify.com/api/v2

最佳实践

  • 设置超时: 在 Actor 输入中传入 timeoutSecs,或在 .call() 中使用 waitSecs,以避免无限期等待。
  • 对大型数据集分页: 检索数据集条目时使用 limit 和 offset。默认限制为 250K 个条目。
  • 复用客户端: 创建一个 ApifyClient 实例,并在多次调用中复用。
  • 处理 Actor 特定的输入: 每个 Actor 都有自己的输入架构。构造输入前,请使用 fetch-actor-details MCP 工具,或在 Actor 的 Store URL 后添加 .md,获取其架构。

文档

如果 Apify MCP 服务可用,请在开发过程中使用 search-apify-docs 和 fetch-apify-docs 工具查找上下文相关的文档。

评论

支持 Markdown