API 예제
이 가이드는 ActiCrawl API의 일반적인 사용 사례에 대한 실용적인 예제를 제공합니다. 각 예제에는 여러 프로그래밍 언어의 완전한 코드 스니펫이 포함되어 있습니다.
기본 웹 스크래핑
기사 콘텐츠 추출
블로그 게시물이나 뉴스 기사를 스크래핑하고 깔끔하고 읽기 쉬운 콘텐츠를 얻습니다:
python
import requests
api_key = 'YOUR_API_KEY'
response = requests.post(
'https://api.acticrawl.com/v1/scrape',
headers={'X-API-Key': api_key},
json={
'url': 'https://techcrunch.com/2024/01/15/openai-gpt-5/',
'formats': ['markdown'],
'options': {
'onlyMainContent': True
}
}
)
article = response.json()
print(article['data']['markdown'])
스크린샷 생성
모든 웹페이지의 스크린샷 캡처:
javascript
const axios = require('axios');
async function captureScreenshot(url) {
const response = await axios.post('https://api.acticrawl.com/v1/scrape', {
url: url,
formats: ['screenshot'],
options: {
waitFor: 3000 // 페이지 로드를 위해 3초 대기
}
}, {
headers: { 'X-API-Key': 'YOUR_API_KEY' }
});
// 스크린샷을 파일로 저장
const fs = require('fs');
const buffer = Buffer.from(response.data.data.screenshot, 'base64');
fs.writeFileSync('screenshot.png', buffer);
}
captureScreenshot('https://stripe.com');
전자상거래 데이터 추출
제품 정보 스크래핑
전자상거래 사이트에서 구조화된 제품 데이터 추출:
python
import requests
import json
def scrape_product(product_url):
response = requests.post(
'https://api.acticrawl.com/v1/scrape',
headers={'X-API-Key': 'YOUR_API_KEY'},
json={
'url': product_url,
'formats': ['json', 'screenshot'],
'options': {
'waitFor': 5000, # 동적 콘텐츠 대기
'onlyIncludeTags': [
'h1', # 제품 제목
'.price', # 가격
'.description', # 설명
'.product-image', # 이미지
'.reviews' # 리뷰
]
}
}
)
return response.json()
# 사용 예시
product = scrape_product('https://amazon.com/dp/B08N5WRWNW')
print(f"제목: {product['data']['metadata']['title']}")
print(f"가격: {product['data']['json']['price']}")
가격 변동 모니터링
시간에 따른 제품 가격 추적:
javascript
const cron = require('node-cron');
const axios = require('axios');
const fs = require('fs');
async function checkPrice(url) {
const response = await axios.post('https://api.acticrawl.com/v1/scrape', {
url: url,
formats: ['json'],
options: {
onlyIncludeTags: ['.price', '.product-title']
}
}, {
headers: { 'X-API-Key': 'YOUR_API_KEY' }
});
const data = response.data.data;
const price = data.json.price;
const timestamp = new Date().toISOString();
// CSV에 가격 기록
fs.appendFileSync('prices.csv', `${timestamp},${price}\n`);
return price;
}
// 매시간 가격 확인
cron.schedule('0 * * * *', () => {
checkPrice('https://example.com/product');
});
뉴스 및 콘텐츠 수집
여러 뉴스 기사 스크래핑
뉴스 웹사이트에서 기사 수집:
python
import requests
from datetime import datetime
def scrape_news_site(base_url, max_articles=10):
# 먼저 홈페이지를 가져와서 기사 링크 찾기
response = requests.post(
'https://api.acticrawl.com/v1/crawl',
headers={'X-API-Key': 'YOUR_API_KEY'},
json={
'url': base_url,
'match': f'{base_url}/article/**',
'selector': 'article a[href]',
'limit': max_articles,
'depth': 1,
'formats': ['markdown'],
'options': {
'onlyMainContent': True
}
}
)
articles = response.json()['data']
# 기사 처리
for article in articles:
print(f"제목: {article['metadata']['title']}")
print(f"URL: {article['url']}")
print(f"게시일: {article['metadata']['publishedTime']}")
print(f"내용: {article['markdown'][:200]}...")
print("-" * 80)
return articles
# 사용 예시
news = scrape_news_site('https://news.ycombinator.com', max_articles=5)
모든 웹사이트를 RSS 피드로 변환
모든 웹사이트를 RSS 피드로 변환:
javascript
const axios = require('axios');
const RSS = require('rss');
async function websiteToRSS(siteUrl) {
// 최근 게시물을 위해 웹사이트 크롤링
const response = await axios.post('https://api.acticrawl.com/v1/crawl', {
url: siteUrl,
match: `${siteUrl}/blog/**`,
limit: 20,
depth: 1,
formats: ['markdown'],
options: {
onlyMainContent: true
}
}, {
headers: { 'X-API-Key': 'YOUR_API_KEY' }
});
// RSS 피드 생성
const feed = new RSS({
title: `${siteUrl} RSS 피드`,
description: `${siteUrl}의 최신 게시물`,
feed_url: `${siteUrl}/rss`,
site_url: siteUrl,
});
// 피드에 항목 추가
response.data.data.forEach(article => {
feed.item({
title: article.metadata.title,
description: article.markdown.substring(0, 300) + '...',
url: article.url,
date: article.metadata.publishedTime || new Date()
});
});
return feed.xml();
}
연구 및 데이터 수집
학술 논문 수집
연구 논문과 메타데이터 수집:
python
import requests
import pandas as pd
def collect_research_papers(search_url, query):
response = requests.post(
'https://api.acticrawl.com/v1/search',
headers={'X-API-Key': 'YOUR_API_KEY'},
json={
'url': search_url,
'query': query,
'limit': 50,
'depth': 2
}
)
papers = response.json()['data']['results']
# 분석을 위해 DataFrame으로 변환
df = pd.DataFrame([{
'title': p['title'],
'url': p['url'],
'excerpt': p['excerpt'],
'relevance': p['relevance_score']
} for p in papers])
# CSV로 저장
df.to_csv(f'research_{query}.csv', index=False)
return df
# 사용 예시
papers = collect_research_papers(
'https://arxiv.org',
'machine learning transformers'
)
웹사이트 변경 감지
웹사이트 변경 사항 모니터링:
javascript
const axios = require('axios');
const crypto = require('crypto');
const nodemailer = require('nodemailer');
async function checkForChanges(url, selector) {
// 현재 콘텐츠 스크래핑
const response = await axios.post('https://api.acticrawl.com/v1/scrape', {
url: url,
formats: ['html'],
options: {
onlyIncludeTags: [selector]
}
}, {
headers: { 'X-API-Key': 'YOUR_API_KEY' }
});
const content = response.data.data.html;
const hash = crypto.createHash('md5').update(content).digest('hex');
// 저장된 해시와 비교
const fs = require('fs');
const hashFile = 'content-hashes.json';
let hashes = {};
if (fs.existsSync(hashFile)) {
hashes = JSON.parse(fs.readFileSync(hashFile));
}
if (hashes[url] && hashes[url] !== hash) {
// 콘텐츠가 변경됨!
await sendNotification(url, content);
}
// 해시 업데이트
hashes[url] = hash;
fs.writeFileSync(hashFile, JSON.stringify(hashes));
}
async function sendNotification(url, newContent) {
// 이메일 알림 전송
const transporter = nodemailer.createTransport({
// 이메일 서비스 구성
});
await transporter.sendMail({
to: 'your-email@example.com',
subject: `웹사이트 변경됨: ${url}`,
html: `웹사이트가 업데이트되었습니다:<br><br>${newContent}`
});
}
SEO 및 마케팅
경쟁사 분석
경쟁사 웹사이트 분석:
python
import requests
from collections import Counter
def analyze_competitor(competitor_url):
# 사이트 구조 가져오기
map_response = requests.post(
'https://api.acticrawl.com/v1/map',
headers={'X-API-Key': 'YOUR_API_KEY'},
json={
'url': competitor_url,
'limit': 100,
'depth': 3
}
)
site_structure = map_response.json()['data']
# 페이지 샘플 분석
sample_urls = site_structure['urls'][:10]
keywords = []
for url in sample_urls:
page_response = requests.post(
'https://api.acticrawl.com/v1/scrape',
headers={'X-API-Key': 'YOUR_API_KEY'},
json={
'url': url,
'formats': ['json'],
'options': {
'onlyMainContent': True
}
}
)
metadata = page_response.json()['data']['metadata']
if metadata.get('keywords'):
keywords.extend(metadata['keywords'])
# 키워드 분석
keyword_freq = Counter(keywords)
return {
'total_pages': len(site_structure['urls']),
'site_structure': site_structure['structure'],
'top_keywords': keyword_freq.most_common(20)
}
# 사용 예시
analysis = analyze_competitor('https://competitor.com')
print(f"전체 페이지 수: {analysis['total_pages']}")
print(f"상위 키워드: {analysis['top_keywords']}")
콘텐츠 아이디어 생성
업계의 트렌드 토픽 찾기:
javascript
async function findTrendingTopics(industrySites) {
const allArticles = [];
// 여러 사이트에서 최근 기사 스크래핑
for (const site of industrySites) {
const response = await axios.post('https://api.acticrawl.com/v1/crawl', {
url: site,
match: `${site}/**`,
selector: 'article a, .post a',
limit: 20,
depth: 1,
formats: ['markdown'],
options: {
onlyMainContent: true
}
}, {
headers: { 'X-API-Key': 'YOUR_API_KEY' }
});
allArticles.push(...response.data.data);
}
// 주제와 키워드 추출
const topics = {};
allArticles.forEach(article => {
const keywords = article.metadata.keywords || [];
keywords.forEach(keyword => {
topics[keyword] = (topics[keyword] || 0) + 1;
});
});
// 빈도순 정렬
const trending = Object.entries(topics)
.sort((a, b) => b[1] - a[1])
.slice(0, 10);
return trending;
}
// 사용 예시
const sites = [
'https://techcrunch.com',
'https://theverge.com',
'https://wired.com'
];
findTrendingTopics(sites).then(trends => {
console.log('트렌드 토픽:');
trends.forEach(([topic, count]) => {
console.log(`- ${topic}: ${count}번 언급됨`);
});
});
오류 처리 및 모범 사례
강력한 오류 처리
항상 적절한 오류 처리를 구현하세요:
python
import requests
import time
from requests.exceptions import RequestException
def scrape_with_retry(url, max_retries=3):
for attempt in range(max_retries):
try:
response = requests.post(
'https://api.acticrawl.com/v1/scrape',
headers={'X-API-Key': 'YOUR_API_KEY'},
json={'url': url, 'formats': ['markdown']},
timeout=30
)
if response.status_code == 200:
return response.json()
elif response.status_code == 429:
# 속도 제한 - 대기 후 재시도
retry_after = int(response.headers.get('Retry-After', 60))
print(f"속도 제한됨. {retry_after}초 대기 중...")
time.sleep(retry_after)
else:
print(f"오류 {response.status_code}: {response.text}")
except RequestException as e:
print(f"요청 실패: {e}")
if attempt < max_retries - 1:
time.sleep(2 ** attempt) # 지수 백오프
return None
배치 처리
여러 URL을 효율적으로 처리:
javascript
async function batchScrape(urls, batchSize = 5) {
const results = [];
// URL을 배치로 처리
for (let i = 0; i < urls.length; i += batchSize) {
const batch = urls.slice(i, i + batchSize);
const promises = batch.map(url =>
axios.post('https://api.acticrawl.com/v1/scrape', {
url: url,
formats: ['markdown', 'metadata']
}, {
headers: { 'X-API-Key': 'YOUR_API_KEY' }
}).catch(err => ({ error: err.message, url }))
);
const batchResults = await Promise.all(promises);
results.push(...batchResults);
// 속도 제한 준수
if (i + batchSize < urls.length) {
await new Promise(resolve => setTimeout(resolve, 1000));
}
}
return results;
}
다음 단계
이 예제들은 ActiCrawl API로 가능한 많은 것들 중 일부만을 보여줍니다. 더 고급 사용 사례를 위해:
- 완전한 엔드포인트 문서를 위해 API 참조를 탐색하세요
- 프로그래밍 언어용 SDK 및 라이브러리를 확인하세요
- 지원 및 토론을 위해 개발자 커뮤니티에 참여하세요
- 맞춤형 솔루션을 위해 엔터프라이즈 영업 팀에 문의하세요
즐거운 스크래핑 되세요! 🚀