Python & Web Scraping specialist - UFC Fight Data

Project Overview:

This project is focused on building a paid UFC analytics platform centered around fight data, betting data, and fantasy scoring. The long-term goal is to create a robust, data-driven website that provides advanced analysis, matchup insights, and tools for bettors and fantasy players. This role represents Stage 1 of the project: building the entire raw data foundation. All work in this stage is dedicated to collecting, cleaning, and structuring UFC-related data so it can later be ingested into a cloud-based PostgreSQL database and used for advanced SQL analysis, feature engineering, and modeling.

Role Overview (This Position):

This position is strictly focused on data scraping and data engineering, not analysis, modeling, or frontend work. The objective is to produce clean, complete, and well-structured datasets that will serve as the backbone of the platform. You will be responsible for scraping UFC-related data from public sources, implementing fantasy scoring logic, normalizing and validating the data, and delivering reproducible Python-based outputs that are ready for downstream database ingestion and analysis.

Cost/Payment:

While this role is currently posted as hourly for platform flexibility, the intent is to complete this scope as a fixed-price project. Please review the full project documentation and include a fixed-price estimate in your proposal for completing the entire scope from start to finish. The listed job type is not meant to imply open-ended work, and final pricing will be agreed upon before any contract begins.

Scope of Work:

There's 3 total sources for web scraping:

- ufcstats.com (about 85% of the scraping)

- fightodds.io (about 10% of the scraping)

- ufc.com/athletes/all (about 5% of the scraping)

For each of the following sections below (1.1 - 1.6), they're further explained in the included word document and excel spreadsheet, in terms of the specific stats required, where they come from, and any other important details. Sections 1.1 - 1.6 are the same across all included reference files for ease of use.

Section 1.1 - Data Scraping: Fight Data

Scrape comprehensive fight-level and round-level data for every UFC fight and event, including historical events. This data should accurately capture fight outcomes, methods, round information, time-based statistics, and all relevant performance metrics required for later analysis.

Section 1.2 - MMA Fantasy Scoring / Points System

Implement complete fantasy scoring systems (e.g., DraftKings and FanDuel) using the scraped fight data. This includes calculating total fantasy points, category-based scoring (striking vs grappling), and per-minute/per-15-minute metrics. All scoring logic should be transparent, consistent, and reproducible.

Section 1.3 - Data Scraping: Historical Odds

Scrape and structure historical betting odds data for UFC fights, including moneylines and relevant betting markets where available (like over/under round lines, finish props, etc). The goal is to align odds data cleanly with fight and fighter identifiers so it can later be used for betting performance analysis and market evaluation.

Section 1.4 - Data Scraping: Fighter Profiles

Scrape detailed profile-level data for every UFC fighter, including biographical information, physical attributes, stance, and any other persistent fighter attributes. This data should be designed to link cleanly to fight-level datasets via consistent fighter identifiers.

Section 1.5 - Data Cleaning & Normalization

Clean, normalize, and validate all scraped datasets to ensure consistency across time, fighters, and events. This includes handling missing values, standardizing naming conventions, enforcing consistent identifiers, and ensuring the data is suitable for relational database storage and future SQL-based analysis.

Section 1.6 - ReadMe & Final Notes

Provide clear documentation outlining data sources, scraping logic, assumptions, edge cases, and any known limitations. The final deliverable should include well-organized Python scripts, structured output files, and a concise README explaining how the data was generated, and how it is intended to be used downstream.

Back to blog