본문으로 건너뛰기

Apify 플랫폼

Apify는 대규모 고성능 웹 스크래핑과 자동화를 위해 설계된 플랫폼입니다. 컴퓨팅 인스턴스(액터), 요청 및 결과 저장소, 프록시, 스케줄링, 웹훅 등 다양한 기능을 웹 인터페이스나 API를 통해 쉽게 사용할 수 있습니다.

Apify 플랫폼은 매우 유용하며 무료 계정을 만드는 것이 좋지만, Crawlee는 오픈소스이며 항상 그럴 것입니다. 로컬 환경이나 클라우드 인프라에서 자유롭게 실행할 수 있습니다.

노트

Lambda나 Raspberry PI와 같은 특정 아키텍처에서는 Crawlee를 테스트하지 않습니다. 작동하도록 노력하고 있지만 보장할 수는 없습니다.

Crawlee에서 Apify 플랫폼 로그인하기​

Apify 계정에 접근하려면 API 토큰이 필요합니다. Apify CLI를 사용하거나 환경 변수를 통해 인증할 수 있습니다.

인증이 완료되면 액터 호출, 클라우드 저장소 저장, Apify 프록시 사용, 웹훅 설정 등 Apify 플랫폼의 모든 기능을 사용할 수 있습니다.

CLI로 로그인하기​

Apify CLI를 사용하면 컴퓨터에서 Apify 계정에 로그인할 수 있습니다. CLI로 스크래퍼를 실행하면 자동으로 인증 정보가 추가됩니다.

npm install -g apify-cli
apify login -t YOUR_API_TOKEN

환경 변수로 로그인하기​

또는 APIFY_TOKEN 환경 변수에 API 토큰을 설정하여 스크래퍼에 인증 정보를 제공할 수 있습니다.

APIFY_PROXY_PASSWORD 환경 변수도 있습니다. 액터는 토큰에서 자동으로 이를 유추하지만, 토큰이 나타내는 계정과 다른 계정의 프록시에 접근해야 할 때 유용할 수 있습니다.

설정으로 로그인하기​

Configuration 인스턴스를 사용하여 API 토큰을 설정하는 방법도 있습니다.

import { Actor } from 'apify';

const sdk = new Actor({ token: 'your_api_token' });

액터란 무엇인가​

스크립트를 Apify 플랫폼에 배포하면 액터가 됩니다. 액터는 입력을 받아 출력을 생성하는 서버리스 마이크로서비스입니다. 몇 초에서 몇 시간, 또는 무기한으로 실행될 수 있습니다. 웹 양식 작성이나 이메일 전송과 같은 간단한 작업부터 전체 웹사이트 크롤링과 대규모 데이터셋의 중복 제거와 같은 복잡한 작업까지 수행할 수 있습니다.

액터는 Apify 스토어에서 공유하여 다른 사람들이 사용할 수 있게 할 수 있습니다. 걱정하지 마세요. 스토어에서 액터를 공유하고 다른 사람이 사용하더라도 여러분의 계정이 아닌 사용자의 계정에서 실행됩니다.

관련 링크

로컬에서 액터 실행하기​

먼저 새로운 액터의 기본 구조를 만들어보겠습니다. Apify CLI를 사용하여 다음과 같이 실행할 수 있습니다:

apify create my-hello-world

CLI는 프로젝트 보일러플레이트 템플릿을 선택하라는 메시지를 표시합니다 - "Hello world"를 선택해보겠습니다. 도구는 Node.js 프로젝트 파일이 포함된 my-hello-world 디렉토리를 생성합니다. 다음과 같이 액터를 실행할 수 있습니다:

cd my-hello-world
apify run

Crawlee 코드를 액터로 실행하기​

Apify 플랫폼에서 Crawlee 코드를 액터로 실행하려면 다음 중 하나를 선택해야 합니다:

참고
  • Apify 플랫폼에서 액터로 실행하는 데 필요한 중요한 두 가지는 Actor.init()와 Actor.exit()입니다. Actor.init()은 액터를 초기화하는 데 필요하고(예: 올바른 스토리지 구현 설정), Actor.exit() 없이는 프로세스가 종료되지 않습니다.
  • Actor.main()은 내부적으로 Actor.init()과 Actor.exit()를 호출하는 대안입니다.

빠른 시작 가이드의 CheerioCrawler 예제를 살펴보겠습니다:

import { Actor } from 'apify';
import { CheerioCrawler } from 'crawlee';

await Actor.main(async () => {
const crawler = new CheerioCrawler({
async requestHandler({ request, $, enqueueLinks }) {
const { url } = request;

// 페이지의 HTML 제목을 추출합니다
const title = $('title').text();
console.log(`Title of ${url}: ${title}`);

// 지정된 패턴과 일치하는 URL을 크롤링 대기열에 추가합니다
await enqueueLinks({
globs: ['https://www.iana.org/*'],
});

// 추출된 데이터를 데이터셋에 저장합니다
await Actor.pushData({ url, title });
},
});

// 초기 요청을 대기열에 추가하고 크롤러를 실행합니다
await crawler.run(['https://www.iana.org/']);
});

Apify 플랫폼에 액터 배포하기​

이제 (Apify 계정에 로그인되어 있다고 가정하면) 다음 명령어로 코드를 Apify 플랫폼에 쉽게 배포할 수 있습니다:

apify push

스크립트가 Apify 플랫폼에 업로드되어 빌드되므로 플랫폼에서 실행할 수 있게 됩니다. 자세한 내용은 Apify Actor 문서를 참조하세요.

Apify 플랫폼에서의 사용​

플랫폼의 온라인 코드 에디터에서 직접 액터를 개발할 수도 있습니다(Apify 계정이 필요합니다). 앱의 Actors 페이지로 이동하여 Create new를 클릭한 다음 Source 탭으로 이동하여 코드를 작성하거나 Examples 섹션의 예제 중 하나를 붙여넣으세요.

스토리지​

여기서 언급할 만한 몇 가지 중요한 사항이 있습니다.

기본 Key-Value Store와 Dataset을 위한 헬퍼 함수​

기본 스토리지에 쉽게 접근하기 위해 각 스토리지 클래스의 헬퍼 함수 대신 다음을 사용할 수 있습니다:

로컬 액터에서 플랫폼 스토리지 사용하기​

로컬에서 액터를 개발하고 실행하면서 플랫폼 스토리지를 사용하려면 Actor.openKeyValueStore(), Actor.openDataset(), Actor.openRequestQueue()를 사용하여 각각의 스토리지를 열어야 합니다.

이러한 메서드는 각각 두 번째 인자로 OpenStorageOptions를 전달할 수 있으며, 이는 선택적 속성 forceCloud만을 가집니다. true로 설정하면 로컬 디스크의 폴더 대신 클라우드 스토리지가 사용됩니다.

노트

액터를 로컬에서 실행할 때 플랫폼 스토리지를 강제로 사용할 계획이 없다면 Actor 클래스를 사용할 필요가 없습니다. Crawlee의 KeyValueStore.open(), Dataset.open(), RequestQueue.open()이 동일하게 작동합니다.

플랫폼 스토리지 항목의 공개 URL 얻기​

Apify 플랫폼의 Key-Value Store에 저장된 파일의 링크를 공유해야 할 경우, getPublicUrl() 메서드를 사용할 수 있습니다. 이 메서드는 공유하고자 하는 항목의 key 하나만을 매개변수로 받습니다.

import { KeyValueStore } from 'apify';

const store = await KeyValueStore.open();
await store.setValue('your-file', { foo: 'bar' });
const url = store.getPublicUrl('your-file');
// https://api.apify.com/v2/key-value-stores/<your-store-id>/records/your-file

데이터셋 데이터 내보내기​

Dataset이 Apify 플랫폼에 저장되어 있을 때, 데이터를 HTML, JSON, CSV, Excel, XML, RSS 형식으로 내보낼 수 있습니다. 데이터셋은 액터 실행 상세 페이지와 Apify 콘솔의 Storage 섹션에서 확인할 수 있습니다. 실제 데이터는 Get dataset items Apify API 엔드포인트를 사용하여 내보내집니다. 이를 통해 크롤링 결과를 쉽게 공유할 수 있습니다.

관련 링크

환경 변수​

다음은 Apify 플랫폼과 관련된 추가 환경 변수입니다. Crawlee와 관련된 더 많은 환경 변수는 Environment Variables 가이드에서 확인할 수 있습니다.

노트

CRAWLEE_ 환경 변수를 APIFY_ 환경 변수로 바꿀 필요가 없다는 점을 주목하세요. 마찬가지로 Crawlee는 Actor.init() 호출 후 또는 Actor.main()을 사용할 때 APIFY_ 환경 변수를 이해합니다.

APIFY_TOKEN​

Apify 계정의 API 토큰입니다. Apify API에 접근할 때 사용되며, 예를 들어 클라우드 스토리지에 접근하거나 Apify 플랫폼에서 액터를 실행할 때 필요합니다. API 토큰은 Account Settings / Integrations 페이지에서 확인할 수 있습니다.

APIFY_TOKEN과 CRAWLEE_STORAGE_DIR의 조합​

CRAWLEE_STORAGE_DIR 환경 변수에 대한 설명은 Environment Variables 가이드에서 확인할 수 있습니다.

환경 변수를 다양하게 조합하여 액터의 동작을 크게 제어할 수 있습니다.

환경 변수API스토리지
없음 또는 CRAWLEE_STORAGE_DIR아니오로컬
APIFY_TOKEN예Apify 플랫폼
APIFY_TOKEN과 CRAWLEE_STORAGE_DIR예로컬 + 플랫폼

When using both APIFY_TOKEN and CRAWLEE_STORAGE_DIR, you can use all the Apify platform features and your data will be stored locally by default. If you want to access platform storages, you can use the { forceCloud: true } option in their respective functions.

import { Actor } from 'apify';
import { Dataset } from 'crawlee';

// or Dataset.open('my-local-data')
const localDataset = await Actor.openDataset('my-local-data');
// but here we need the `Actor` class
const remoteDataset = await Actor.openDataset('my-dataset', { forceCloud: true });

APIFY_PROXY_PASSWORD​

IP 주소 변경을 위한 Apify Proxy의 선택적 비밀번호입니다. Apify 계정이 이미 생성되어 있다면 Apify 콘솔의 Proxy 페이지에서 비밀번호를 확인할 수 있습니다. 비밀번호는 APIFY_TOKEN 환경 변수를 통해 자동으로 유추되므로 대부분의 경우 수정할 필요가 없습니다. Apify API에 접근하지 않고 Apify Proxy에만 접근해야 하거나, 토큰이 나타내는 계정과 다른 계정의 프록시에 접근해야 할 때 사용해야 합니다.

프록시 관리​

Crawlee와 함께 사용하는 자체 프록시 서버나 타사 제공업체의 프록시 서버 외에도 Apify Proxy를 스크래핑에 활용할 수 있습니다.

Apify Proxy​

이미 Apify Proxy를 구독 중이라면 몇 줄의 코드만으로 즉시 사용을 시작할 수 있습니다(로컬에서 사용하려면 먼저 Apify 계정에 로그인해야 합니다).

import { Actor } from 'apify';

const proxyConfiguration = await Actor.createProxyConfiguration();
const proxyUrl = await proxyConfiguration.newUrl();

Crawlee에서 자체 프록시를 사용하는 것과 달리, ProxyConfiguration 인스턴스를 생성할 때 생성자를 사용해서는 안 됩니다. Apify Proxy를 사용하려면 대신 Actor.createProxyConfiguration() 함수를 사용해야 합니다.

Apify Proxy 설정​

Apify Proxy를 사용하면 특정 프록시 그룹이나 연결할 국가를 선택할 수 있습니다. 이를 통해 초기 조사 후 더 나은 프록시 성능을 얻을 수 있습니다.

import { Actor } from 'apify';

const proxyConfiguration = await Actor.createProxyConfiguration({
groups: ['RESIDENTIAL'],
countryCode: 'US',
});
const proxyUrl = await proxyConfiguration.newUrl();

이제 크롤러는 미국의 레지덴셜 프록시만 사용합니다. 프록시 그룹을 사용하기 전에 먼저 해당 그룹에 대한 접근 권한을 얻어야 합니다. 프록시 대시보드에서 사용 가능한 프록시 그룹을 확인할 수 있습니다.

Apify Proxy vs 자체 프록시​

ProxyConfiguration 클래스는 Apify Proxy와 사용자 정의 프록시 URL을 모두 지원하므로 프록시 제공자 간에 쉽게 전환할 수 있습니다. 하지만 일부 기능은 Apify Proxy 사용자만 사용할 수 있습니다. 주로 Apify Proxy가 슈퍼 프록시이기 때문입니다. 단일 프록시 서버가 아닌 수백만 개의 다른 IP 주소를 통한 연결을 허용하는 API 엔드포인트입니다. 따라서 이 클래스는 기본적으로 Apify Proxy 또는 자체(타사) 프록시의 두 가지 모드를 가집니다.

차이점은 기억하기 쉽습니다.

관련 링크