Table of contents

Can I Deploy Crawlee Scrapers to the Cloud?

Yes, you can deploy Crawlee scrapers to the cloud! Crawlee is designed to be cloud-ready and can be deployed to various cloud platforms including AWS, Google Cloud Platform, Azure, Heroku, and specialized web scraping infrastructure providers. Cloud deployment enables you to scale your scraping operations, run scrapers 24/7, and handle large-scale data extraction tasks efficiently.

Why Deploy Crawlee to the Cloud?

Before diving into deployment options, let's understand the benefits of running Crawlee scrapers in the cloud:

  • Scalability: Easily scale your scraping operations based on demand
  • Reliability: Run scrapers continuously without worrying about local machine downtime
  • Performance: Leverage powerful cloud infrastructure with high bandwidth
  • Cost-effectiveness: Pay only for the resources you use
  • Global reach: Deploy scrapers in different geographic regions for better performance
  • Professional infrastructure: Access to load balancers, monitoring tools, and automated backups

Deployment Options for Crawlee

1. Docker-Based Deployments

Docker is the most portable way to deploy Crawlee scrapers. You can containerize your scraper and deploy it to any cloud platform that supports Docker.

Creating a Dockerfile for Crawlee:

FROM node:18-slim

# Install dependencies for Puppeteer/Playwright
RUN apt-get update && apt-get install -y \
    chromium \
    fonts-ipafont-gothic fonts-wqy-zenhei fonts-thai-tlwg fonts-kacst fonts-freefont-ttf \
    && rm -rf /var/lib/apt/lists/*

# Set working directory
WORKDIR /app

# Copy package files
COPY package*.json ./

# Install dependencies
RUN npm ci --only=production

# Copy application code
COPY . .

# Set environment variables
ENV CRAWLEE_STORAGE_DIR=/app/storage
ENV PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium

# Run the scraper
CMD ["node", "src/main.js"]

Docker Compose for local testing:

version: '3.8'
services:
  crawler:
    build: .
    environment:
      - NODE_ENV=production
      - CRAWLEE_STORAGE_DIR=/app/storage
    volumes:
      - ./storage:/app/storage
    restart: unless-stopped

Similar to how you use Puppeteer with Docker, Crawlee requires careful configuration of browser dependencies in containerized environments.

2. AWS Deployment

Amazon Web Services offers multiple options for deploying Crawlee scrapers:

AWS Lambda (Serverless)

For lightweight scrapers that run periodically:

// handler.js for AWS Lambda
import { CheerioCrawler } from 'crawlee';

export const handler = async (event) => {
  const crawler = new CheerioCrawler({
    maxRequestsPerCrawl: 100,
    requestHandler: async ({ request, $, enqueueLinks }) => {
      const title = $('title').text();
      console.log(`Title: ${title}`);

      await enqueueLinks({
        globs: ['https://example.com/**'],
      });
    },
  });

  await crawler.run(['https://example.com']);

  return {
    statusCode: 200,
    body: JSON.stringify({ message: 'Scraping completed' }),
  };
};

Deployment using Serverless Framework:

# serverless.yml
service: crawlee-scraper

provider:
  name: aws
  runtime: nodejs18.x
  timeout: 300
  memorySize: 1024

functions:
  scraper:
    handler: handler.handler
    events:
      - schedule: rate(1 hour)

AWS ECS (Elastic Container Service)

For more complex scrapers requiring persistent sessions:

# Build and push Docker image
docker build -t crawlee-scraper .
docker tag crawlee-scraper:latest <account-id>.dkr.ecr.us-east-1.amazonaws.com/crawlee-scraper:latest
aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin <account-id>.dkr.ecr.us-east-1.amazonaws.com
docker push <account-id>.dkr.ecr.us-east-1.amazonaws.com/crawlee-scraper:latest

ECS Task Definition:

{
  "family": "crawlee-scraper",
  "containerDefinitions": [
    {
      "name": "crawler",
      "image": "<account-id>.dkr.ecr.us-east-1.amazonaws.com/crawlee-scraper:latest",
      "memory": 2048,
      "cpu": 1024,
      "essential": true,
      "environment": [
        {
          "name": "CRAWLEE_STORAGE_DIR",
          "value": "/app/storage"
        }
      ]
    }
  ]
}

3. Google Cloud Platform

Google Cloud Run

Cloud Run is ideal for containerized Crawlee scrapers that need to scale automatically:

# Build and deploy to Cloud Run
gcloud builds submit --tag gcr.io/PROJECT_ID/crawlee-scraper
gcloud run deploy crawlee-scraper \
  --image gcr.io/PROJECT_ID/crawlee-scraper \
  --platform managed \
  --region us-central1 \
  --memory 2Gi \
  --timeout 3600 \
  --allow-unauthenticated

Environment configuration:

// main.js
import { PuppeteerCrawler } from 'crawlee';

const crawler = new PuppeteerCrawler({
  launchContext: {
    launchOptions: {
      headless: true,
      args: [
        '--no-sandbox',
        '--disable-setuid-sandbox',
        '--disable-dev-shm-usage',
      ],
    },
  },
  requestHandler: async ({ page, request, enqueueLinks }) => {
    const title = await page.title();
    console.log(`Title: ${title}`);

    await enqueueLinks();
  },
});

// Start the crawler
await crawler.run(['https://example.com']);

Google Kubernetes Engine (GKE)

For large-scale operations with advanced orchestration:

# kubernetes-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: crawlee-scraper
spec:
  replicas: 3
  selector:
    matchLabels:
      app: crawlee-scraper
  template:
    metadata:
      labels:
        app: crawlee-scraper
    spec:
      containers:
      - name: crawler
        image: gcr.io/PROJECT_ID/crawlee-scraper
        resources:
          requests:
            memory: "2Gi"
            cpu: "1000m"
          limits:
            memory: "4Gi"
            cpu: "2000m"
        env:
        - name: CRAWLEE_STORAGE_DIR
          value: "/app/storage"

4. Microsoft Azure

Azure Container Instances

Quick deployment for containerized Crawlee scrapers:

# Create resource group
az group create --name crawlee-rg --location eastus

# Deploy container
az container create \
  --resource-group crawlee-rg \
  --name crawlee-scraper \
  --image <registry-name>.azurecr.io/crawlee-scraper:latest \
  --cpu 2 \
  --memory 4 \
  --restart-policy OnFailure \
  --environment-variables CRAWLEE_STORAGE_DIR=/app/storage

Azure Functions

For event-driven scraping tasks:

// index.js
const { CheerioCrawler } = require('crawlee');

module.exports = async function (context, myTimer) {
  const crawler = new CheerioCrawler({
    requestHandler: async ({ request, $, enqueueLinks }) => {
      context.log(`Processing ${request.url}`);
      const title = $('title').text();
      context.log(`Title: ${title}`);

      await enqueueLinks();
    },
  });

  await crawler.run(['https://example.com']);
};

5. Specialized Hosting Solutions

Apify Platform

Apify, created by the developers of Crawlee, offers native support:

// main.js for Apify
import { Actor } from 'apify';
import { PuppeteerCrawler } from 'crawlee';

await Actor.init();

const crawler = new PuppeteerCrawler({
  requestHandler: async ({ page, request, enqueueLinks }) => {
    const title = await page.title();
    await Actor.pushData({ title, url: request.url });

    await enqueueLinks();
  },
});

await crawler.run(['https://example.com']);

await Actor.exit();

Deploy to Apify:

# Install Apify CLI
npm install -g apify-cli

# Initialize and deploy
apify init
apify push

Best Practices for Cloud Deployment

1. Handle Browser Resources Efficiently

When dealing with browser automation, proper resource management is crucial, similar to handling browser sessions in Puppeteer:

import { PuppeteerCrawler } from 'crawlee';

const crawler = new PuppeteerCrawler({
  maxConcurrency: 5, // Limit concurrent browsers
  launchContext: {
    launchOptions: {
      headless: true,
      args: ['--no-sandbox', '--disable-setuid-sandbox'],
    },
  },
  // Implement proper error handling
  failedRequestHandler: async ({ request }) => {
    console.error(`Request ${request.url} failed`);
  },
});

2. Use Environment Variables

Store configuration in environment variables for different environments:

const config = {
  maxConcurrency: parseInt(process.env.MAX_CONCURRENCY || '5'),
  maxRequestsPerCrawl: parseInt(process.env.MAX_REQUESTS || '1000'),
  requestHandlerTimeoutSecs: parseInt(process.env.TIMEOUT || '60'),
};

const crawler = new PuppeteerCrawler({
  ...config,
  requestHandler: async ({ page, request }) => {
    // Your scraping logic
  },
});

3. Implement Proper Logging and Monitoring

import { PuppeteerCrawler, log } from 'crawlee';

// Configure logging
log.setLevel(log.LEVELS.INFO);

const crawler = new PuppeteerCrawler({
  requestHandler: async ({ page, request }) => {
    log.info(`Processing ${request.url}`);

    try {
      // Your scraping logic
      const data = await page.evaluate(() => {
        return { /* extracted data */ };
      });

      log.info(`Successfully scraped ${request.url}`);
    } catch (error) {
      log.error(`Error processing ${request.url}:`, error);
      throw error;
    }
  },
});

4. Optimize Storage Configuration

Configure persistent storage for cloud environments:

import { Configuration } from 'crawlee';

Configuration.set({
  persistStorage: true,
  storageDir: process.env.CRAWLEE_STORAGE_DIR || './storage',
  purgeOnStart: false, // Keep data between runs
});

5. Handle Timeouts and Retries

const crawler = new PuppeteerCrawler({
  requestHandlerTimeoutSecs: 180,
  maxRequestRetries: 3,
  requestHandler: async ({ page, request }) => {
    await page.goto(request.url, {
      waitUntil: 'networkidle2',
      timeout: 60000,
    });

    // Your scraping logic
  },
});

Cost Optimization Strategies

1. Use Appropriate Crawler Types

Choose the right crawler based on your needs:

  • CheerioCrawler: Lightweight, cost-effective for static content
  • PuppeteerCrawler: For JavaScript-heavy sites
  • PlaywrightCrawler: When you need multiple browser support
// For static sites (cheaper)
import { CheerioCrawler } from 'crawlee';

// For dynamic sites (more expensive)
import { PuppeteerCrawler } from 'crawlee';

2. Implement Smart Caching

import { CheerioCrawler, RequestList } from 'crawlee';

const requestList = await RequestList.open('my-list', [
  'https://example.com',
]);

const crawler = new CheerioCrawler({
  requestList,
  requestHandler: async ({ request, $ }) => {
    // Use caching to avoid re-scraping
    const cachedData = await checkCache(request.url);
    if (cachedData && !isStale(cachedData)) {
      return cachedData;
    }

    // Scrape and cache
    const data = extractData($);
    await saveToCache(request.url, data);
  },
});

3. Schedule Scraping During Off-Peak Hours

// Use cron expressions for scheduled scraping
// Run during off-peak hours for better rates
const schedule = '0 2 * * *'; // Run at 2 AM daily

Monitoring and Maintenance

Health Checks

Implement health check endpoints for cloud platforms:

import express from 'express';

const app = express();

app.get('/health', (req, res) => {
  res.status(200).json({ status: 'healthy' });
});

app.listen(process.env.PORT || 3000);

Metrics Collection

import { PuppeteerCrawler } from 'crawlee';

let requestsProcessed = 0;
let requestsFailed = 0;

const crawler = new PuppeteerCrawler({
  requestHandler: async ({ page, request }) => {
    requestsProcessed++;
    // Your scraping logic
  },
  failedRequestHandler: async ({ request }) => {
    requestsFailed++;
    console.error(`Failed: ${request.url}`);
  },
});

// Log metrics periodically
setInterval(() => {
  console.log(`Processed: ${requestsProcessed}, Failed: ${requestsFailed}`);
}, 60000);

Conclusion

Deploying Crawlee scrapers to the cloud is not only possible but recommended for production use cases. Whether you choose AWS, Google Cloud, Azure, or specialized platforms like Apify, Crawlee's flexibility and cloud-ready architecture make deployment straightforward. By following best practices for resource management, error handling, and monitoring, you can build robust, scalable web scraping solutions that run reliably in the cloud.

Choose the deployment option that best fits your use case, budget, and scaling requirements. Start with simpler solutions like Cloud Run or Container Instances, and scale up to Kubernetes or ECS as your needs grow. With proper configuration and monitoring, your Crawlee scrapers can handle enterprise-scale web scraping operations efficiently in the cloud.

Try WebScraping.AI for Your Web Scraping Needs

Looking for a powerful web scraping solution? WebScraping.AI provides an LLM-powered API that combines Chromium JavaScript rendering with rotating proxies for reliable data extraction.

Key Features:

  • AI-powered extraction: Ask questions about web pages or extract structured data fields
  • JavaScript rendering: Full Chromium browser support for dynamic content
  • Rotating proxies: Datacenter and residential proxies from multiple countries
  • Easy integration: Simple REST API with SDKs for Python, Ruby, PHP, and more
  • Reliable & scalable: Built for developers who need consistent results

Getting Started:

Get page content with AI analysis:

curl "https://api.webscraping.ai/ai/question?url=https://example.com&question=What is the main topic?&api_key=YOUR_API_KEY"

Extract structured data:

curl "https://api.webscraping.ai/ai/fields?url=https://example.com&fields[title]=Page title&fields[price]=Product price&api_key=YOUR_API_KEY"

Try in request builder

Related Questions

Get Started Now

WebScraping.AI provides rotating proxies, Chromium rendering and built-in HTML parser for web scraping
Icon