# Find a Cheaper Web Scraper Alternative

**Use case:** 

Compare two scrapers cost-first on the same input: cost-per-result, reliability and output quality, and whether the cheaper one is safe to switch to.

## Input

```json
{
  "actorA": "apify/cheerio-scraper",
  "actorB": "apify/jsdom-scraper",
  "testInput": {
    "startUrls": [
      {
        "url": "https://example.com"
      }
    ],
    "pageFunction": "async function pageFunction(context){return {url: context.request.url, loadedUrl: context.request.loadedUrl || context.request.url};}"
  },
  "mode": "decision",
  "comparisonType": "cost_optimization",
  "includeStoreContext": true,
  "compareToLastComparableRun": false,
  "fieldEquivalence": {},
  "qualityRules": {
    "requiredFields": [
      "url"
    ],
    "uniqueField": "url"
  },
  "autoMatchFields": true,
  "timeout": 300,
  "memory": 1024
}
```

## Output

```json
{
  "headline": {
    "label": "Headline",
    "format": "string"
  },
  "comparison.decisionPosture": {
    "label": "Posture",
    "format": "text"
  },
  "safeToSwitch": {
    "label": "Safe To Switch",
    "format": "boolean"
  },
  "comparison.migrationSafety": {
    "label": "Migration Safety",
    "format": "text"
  },
  "comparison.verdictHuman": {
    "label": "Verdict",
    "format": "text"
  },
  "comparison.verdictCode": {
    "label": "Code",
    "format": "text"
  },
  "comparison.recommendationLevel": {
    "label": "Strength",
    "format": "text"
  },
  "comparison.confidenceLevel": {
    "label": "Confidence",
    "format": "text"
  },
  "comparison.decisionReadiness": {
    "label": "Readiness",
    "format": "text"
  },
  "runsPerActor": {
    "label": "Runs Per Actor",
    "format": "integer"
  },
  "comparisonContext.mode": {
    "label": "Mode",
    "format": "text"
  },
  "comparisonContext.comparisonType": {
    "label": "Type",
    "format": "text"
  },
  "comparisonContext.decisionProfile": {
    "label": "Profile",
    "format": "text"
  },
  "actorA.name": {
    "label": "Actor A",
    "format": "text"
  },
  "actorA.successfulRuns": {
    "label": "A Succeeded",
    "format": "number"
  },
  "actorA.durationStats.median": {
    "label": "A Median Duration (s)",
    "format": "number"
  },
  "actorA.costStats.median": {
    "label": "A Median Cost ($)",
    "format": "number"
  },
  "actorA.resultCountStats.median": {
    "label": "A Median Results",
    "format": "number"
  },
  "actorA.costPerResult": {
    "label": "A $/Result",
    "format": "number"
  },
  "actorB.name": {
    "label": "Actor B",
    "format": "text"
  },
  "actorB.successfulRuns": {
    "label": "B Succeeded",
    "format": "number"
  },
  "actorB.durationStats.median": {
    "label": "B Median Duration (s)",
    "format": "number"
  },
  "actorB.costStats.median": {
    "label": "B Median Cost ($)",
    "format": "number"
  },
  "actorB.resultCountStats.median": {
    "label": "B Median Results",
    "format": "number"
  },
  "actorB.costPerResult": {
    "label": "B $/Result",
    "format": "number"
  },
  "testedAt": {
    "label": "Tested At",
    "format": "string"
  }
}
```

## About this Actor

This example demonstrates how to use [Actor A/B Tester — Compare Two Actors Side by Side](https://apify.com/ryanclinton/actor-ab-tester) with a specific input configuration. Visit the [Actor detail page](https://apify.com/ryanclinton/actor-ab-tester) to learn more, explore other use cases, and run it yourself.