본문으로 건너뛰기

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

데이터셋 데이터 내보내기

DatasetApify 플랫폼에 저장되어 있을 때, 데이터를 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_TOKENCRAWLEE_STORAGE_DIR의 조합

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

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

환경 변수API스토리지
없음 또는 CRAWLEE_STORAGE_DIR아니오로컬
APIFY_TOKENApify 플랫폼
APIFY_TOKENCRAWLEE_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 또는 자체(타사) 프록시의 두 가지 모드를 가집니다.

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

관련 링크