Skip to main content

Complete Guide: How to Scrape Computrabajo Using Python

Extract job postings, salary figures, and employer data across 19 Latin American countries using Python and Apify.

Updated 10 min readMarkdown
Complete Guide: How to Scrape Computrabajo Using Python

Extracting employment data across Latin America requires navigating distinct regional portals, fragmented salary notations, and dynamic pagination boundaries. Computrabajo operates 19 dedicated country sites throughout the region, serving job seekers in Colombia, Mexico, Argentina, Chile, Peru, the Dominican Republic, and thirteen other markets. While each country portal shares a common underlying layout, differences in regional currency formatting and local posting conventions make unified manual collection impractical.

Building a custom scraper from scratch often leads to brittle pipelines. In addition, Computrabajo's robots.txt disallows filtering parameters like salary ranges and publication dates directly within search URLs, requiring scrapers to fetch result pages first and apply filtering logic downstream.

In this guide, we demonstrate how to extract structured job postings across Latin America using Python and the Apify Actor Computrabajo Scraper (reventadata/computrabajo-scraper). The Actor handles URL building, listing card parsing, salary parsing, and client-side filtering without requiring external proxy services. In reach testing conducted on 2026-10-21, direct plain requests with standard browser headers reached the site without issues. The sample records referenced throughout this tutorial represent a sample from a capture dated 2026-10-21, parsed with the Actor's own parser.


TL;DR

Computrabajo Scraper automates job vacancy extraction across 19 Latin American country portals without requiring proxy configurations. Pass a target country code such as do or mx and a list of job search terms like ["vendedor"] via the Python apify-client. The Actor walks paginated listing cards (20 per page up to a 499-page site limit), parses structured compensation and verified company badges, evaluates post-fetch filters, and stores clean JSON records in an Apify dataset ready for analysis.


Prerequisites and setup

Before writing extraction code, ensure your local development environment meets the following technical prerequisites and configuration requirements:

  1. Python 3.11+: Modern versions of apify-client (version 3.3.0) require Python 3.11 or later. Verify your local interpreter version before proceeding.
  2. Apify API Client: Install the official Python library directly from PyPI into your environment:
pip install -U "apify-client~=3.0"
  1. Apify API Token: Sign up for an Apify account and navigate to the API & Integrations settings tab in Apify Console to locate your personal API token.

Export your API token as an environment variable in your terminal session to avoid hardcoding secrets directly in source files:

export APIFY_API_TOKEN="your_apify_token_here"

Your script loads this token securely at runtime to authenticate API calls against Apify cloud infrastructure.


Understanding Computrabajo Scraper

Computrabajo Scraper is a purpose-built Apify Actor engineered to extract publicly available job vacancies across 19 Latin American country subdomains (ar, bo, cl, co, cr, cu, do, ec, gt, hn, mx, ni, pa, pe, pr, py, sv, uy, ve). Country subdomains for Spain (es), Brazil (br), and Portugal (pt) redirect to a generic landing portal with zero job listings and are not supported.

The Actor fetches server-rendered search result pages and extracts 20 listing cards per page. Each card is transformed into a typed record containing the unique listing identifier, canonical offer URL, title, employer name, company rating, verified status, geographic location, work mode, and parsed compensation.

Importantly, Computrabajo's robots.txt disallows search URL parameters for salary amounts, contract types, work schedules, and publication dates. Computrabajo Scraper handles this constraint by fetching standard listing cards and executing filtering logic client-side on the resulting records before saving them. The scraper strictly reads public job-offer pages, never requesting candidate profiles, login credentials, or resume sections.


Step-by-step walkthrough

We begin by establishing a connection to Apify, defining our search parameters, triggering execution, and processing the resulting dataset.

Step 1: Initialize the client and set parameters

Specify the target country code, keywords, pagination limit, and item cap:

import os
from apify_client import ApifyClient

# 1. Initialize ApifyClient with token from environment
client = ApifyClient(os.environ["APIFY_API_TOKEN"])

# 2. Define the search parameters
run_input = {
    "country": "do",
    "searchQueries": ["vendedor"],
    "maxPagesPerSearch": 1,
    "maxItems": 20,
}

💡 Query formulation tip: When targeting multi-word roles containing the preposition "en" (such as auxiliar en enfermeria), Computrabajo does not parse trailing location slugs cleanly. For these queries, leave locations empty and rely on post-fetch filters like includeKeywords.

Step 2: Trigger extraction and wait for completion

Call the Actor using client.actor().call(), which monitors progress and returns the final run object:

# 3. Start the Actor run and wait for it to complete
print("Starting Computrabajo extraction...")
run = client.actor("reventadata/computrabajo-scraper").call(run_input=run_input)
if run is None or run.status != "SUCCEEDED":
    status = run.status if run else "unknown"
    raise SystemExit(f"Run did not succeed (status: {status}).")

# 4. Fetch the saved offers from the dataset
items = client.dataset(run.default_dataset_id).list_items().items
print(f"Retrieved {len(items)} job offers.\n")

The Actor starts, requests listing pages with standard browser headers, parses each card, applies post-fetch filtering, and pushes rows directly into the default dataset.

Step 3: Iterate and display results

Iterate over the returned items to format essential fields:

for item in items:
    title = item.get("title")
    company = item.get("company") or "Confidential"
    location = item.get("location")
    salary = item.get("salaryText") or "Not stated"
    posted = item.get("postedText")
    urgent = " (Urgent)" if item.get("isUrgent") else ""

    print(f"{title}{urgent}")
    print(f"  Company: {company}")
    print(f"  Location: {location}")
    print(f"  Salary: {salary}")
    print(f"  Posted: {posted}")
    print("-" * 40)

Here is one verbatim sample record, representing a capture dated 2026-10-21 (page 1 of the Dominican Republic vendedor search) parsed with the Actor's own parser. A saved row also carries scrapedAt, added at save time:

{
    "id": "3EA3A542A53C85D161373E686DCF3405",
    "url": "https://do.computrabajo.com/ofertas-de-trabajo/oferta-de-trabajo-de-asesora-buscamos-vendedores-comisionistas-en-santo-domingo-de-guzman-3EA3A542A53C85D161373E686DCF3405",
    "country": "do",
    "title": "Asesor/a",
    "company": "Blandino Prebea",
    "companyUrl": "https://do.computrabajo.com/empresas/ofertas-de-trabajo-de-blandino-prebea-40BEFA84642B332D",
    "companyRating": null,
    "companyVerified": true,
    "location": "Santo Domingo de Guzmán, Distrito Nacional",
    "workMode": "remote",
    "isUrgent": false,
    "isFeatured": false,
    "postedText": "Hace 14 horas",
    "postedDaysAgo": 0,
    "postedDate": "2026-10-21",
    "salaryText": "15,000.00 $ (Mensual) + Comisiones",
    "salaryAmount": 15000.0,
    "salaryCurrencySymbol": "$",
    "salaryPeriod": "Mensual",
    "hasCommission": true,
    "searchQuery": "vendedor",
    "searchPlace": null,
    "page": 1
}

Working with the API

Beyond simple synchronous calls, production data collection workflows benefit from Apify's extensive REST API and asynchronous client capabilities.

To initiate runs asynchronously without blocking your worker processes, use client.actor("reventadata/computrabajo-scraper").start(run_input=run_input). This returns an active run descriptor immediately, allowing your backend application to handle other tasks while the crawler gathers data in the background. You can poll run status or retrieve live execution logs programmatically at any stage using client.log(run.id).get().

Automated data pipelines frequently integrate webhooks for event-driven processing. By configuring a webhook on the ACTOR.RUN.SUCCEEDED event in the Apify Console or API, Apify sends an automated HTTP POST notification directly to your receiving endpoint the moment extraction finishes. The webhook payload contains comprehensive metadata, including the run identifier and the crucial defaultDatasetId pointer.

Downstream analytics pipelines can stream records without high memory overhead using client.dataset(dataset_id).iterate_items(). This iterator fetches items in batches behind the scenes, yielding individual dictionaries one by one as they arrive. If your application requires direct bulk downloads, Apify datasets can be retrieved across several standard serialization formats directly via HTTP REST queries by appending the format parameter (?format=json, ?format=csv, ?format=xlsx, ?format=xml, or ?format=jsonl). You can also configure run options such as memory allocation or execution timeouts directly through the API to optimize resource consumption.


Advanced usage patterns

Tailor your extraction workflows with advanced input configurations to match specific research goals:

Multi-region recruitment tracking

Combine multiple job titles with regional location filters across discrete metropolitan centers. For example, you can target technical and engineering roles simultaneously across multiple regions by configuring searchQueries: ["desarrollador", "ingeniero de sistemas"] and passing regional slugs into locations: ["bogota-dc", "medellin"]. Each query is combined with each location systematically within a single crawl.

Full offer detail enrichment

By default, the Actor captures summary data presented on search listing cards. Setting includeDetails: true instructs the Actor to open each individual job offer URL using 3 concurrent workers. This enriches each dataset record with full description text, structured requirement lists (such as minimum education levels and required years of experience), candidate skill tags, keywords, and detailed employer blurbs. If an individual offer page is closed or returns an error, the listing summary fields remain intact while detailFetched is set to false.

Targeted compensation and freshness filtering

When monitoring current compensation benchmarks, pair onlyWithSalary: true with postedWithinDays: 7 and workMode: "remote" to isolate recent remote openings that print a salary amount. Because listings without numeric amounts are dropped during post-fetch filtering, every row in the final dataset has a salaryAmount; the amounts are as advertised on the card and not verified.


Understanding your data

Each record generated by Computrabajo Scraper adheres to a validated schema:

  • Identifiers and URLs: id provides a unique 32-character hexadecimal string, and url points to the canonical listing page.
  • Employer data: company provides the organization name. For confidential employers, this field holds the platform's placeholder string (such as Importante empresa del sector), and companyUrl is null. companyVerified indicates verified employer status, and companyRating is the employer rating shown on the card (0 to 5), null when absent. In our 20-row Dominican Republic capture, 14 of 20 employers were verified.
  • Salary intelligence: salaryText preserves the raw string. salaryAmount parses numeric values, salaryCurrencySymbol extracts the raw symbol ($, US$, Q), and salaryPeriod records the payment cadence (such as Mensual). hasCommission flags incentive structures. In the capture, 12 listings included numeric salaries, 9 included commissions, and 8 were unpriced.
  • Work mode: Resolves to "remote", "onsite-or-remote" (hybrid), or null (on-site). In the capture, 1 offer was remote and 3 hybrid.

Troubleshooting guide

When developing automation routines, consider these common diagnostic steps:

  • Run finishes with FAILED status and zero rows: Computrabajo Scraper deliberately raises a RuntimeError when zero rows are pushed. This fail-fast design ensures pipeline alerts trigger immediately if a search query or city slug contains typos, rather than silently succeeding with empty datasets.
  • Diagnosing missing rows: If a run yields fewer records than anticipated, review the final log entry: Run finished: N rows pushed, N offer pages failed. Rejections: .... This line breaks down drops caused by filters (too-old, work-mode, no-salary, keywords). Retrieve log text with client.log(run.id).get().
  • Handling country redirection: Subdomains for Spain (es), Brazil (br), and Portugal (pt) redirect to a landing portal with zero job offers. Stick to the 19 supported Latin American country codes.
  • Location syntax issues: Always verify city slugs against Computrabajo URL conventions (e.g. medellin or bogota-dc). Misspelled location slugs return empty listing pages.

Best practices

Follow these operational guidelines for reliable data collection:

  1. Observe pagination boundaries: Computrabajo serves at most 499 result pages per query (up to 9,980 offers). Partition broader national audits across discrete locations using locations.
  2. Selective detail extraction: Enable includeDetails: true only when requirement bullet points or skill tags are strictly necessary, as opening offer pages requires additional requests.
  3. Deduplication handling: The same offer can appear on several result pages (25 pages of trabajo-de-vendedor on the Colombian site gave 500 cards but 478 distinct ids). The Actor tracks seen listing identifiers and discards duplicate rows.
  4. Use keyword filters for precision: Computrabajo's search engine uses loose matching. Use includeKeywords to mandate that vital terms appear in the title, company or location.

Pricing

For current pricing and details, see the Store page.


Conclusion and next steps

You have configured Computrabajo Scraper, executed an automated crawl in Python, and retrieved clean records with structured salary and company data. You can now schedule regular sweeps, configure webhooks, or integrate dataset exports into your database.

Try Computrabajo Scraper yourself and let me know what you build!

About the author: reventadata builds and maintains marketplace and job-board scrapers on the Apify Store.


Resources

About the author

  • Hi, I’m the engineer behind ReventaData. I build automated web scrapers, reverse-engineer undocumented APIs, and design data pipelines on Apify that turn complex, unstructured websites into clean, reliable feeds. Here on Hashnode, I share practical tutorials on modern web scraping with Python, bypassing aggressive anti-bot protections (Cloudflare, Akamai, PerimeterX), and data pipeline automation, reverse-engineering hidden endpoints, and automating data extraction. Explore our turnkey scrapers: https://apify.com/reventadata

No comments yet. Be the first to comment.

More from this blog