Metadata-Version: 2.4
Name: sbr-odds-scraper
Version: 0.1.9
Summary: A web scraper that collects historical MLB, EPL, and MLS betting odds from SportsBookReview
Author-email: Oronto <vile319@gmail.com>
Maintainer-email: Oronto <vile319@gmail.com>
License-Expression: MIT
Project-URL: Homepage, https://github.com/ArnavSaraogi/mlb-odds-scraper
Project-URL: Bug Tracker, https://github.com/ArnavSaraogi/mlb-odds-scraper/issues
Project-URL: Source, https://github.com/ArnavSaraogi/mlb-odds-scraper
Keywords: mlb,baseball,soccer,epl,premier-league,mls,odds,betting,scraper,sports
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Topic :: Internet :: WWW/HTTP :: Indexing/Search
Requires-Python: >=3.8
Description-Content-Type: text/markdown
Requires-Dist: aiohttp>=3.8.0
Requires-Dist: requests>=2.25.0
Requires-Dist: tqdm>=4.60.0
Requires-Dist: pandas>=1.3.0
Requires-Dist: nest-asyncio>=1.5.0

# SBR Odds Scraper

A web scraper that collects historical MLB, EPL, and MLS betting odds from [SportsBookReview](https://www.sportsbookreview.com).

Based on [Arnav Saraogi's mlb-odds-scraper](https://github.com/ArnavSaraogi/mlb-odds-scraper).

## Installation

```bash
pip install sbr-odds-scraper
```

## Python API

```python
import sbr_odds_scraper as sbr

# Single day - returns pandas DataFrame
df = sbr.scrape("2024-10-01")

# Date range
df = sbr.scrape("2024-10-01", "2024-10-05")

# Specific odds types (moneyline, pointspread, totals)
df = sbr.scrape("2024-10-01", odds_types=["moneyline"])

# Specific sportsbooks
df = sbr.scrape("2024-10-01", sportsbooks=["fanduel", "draftkings"])

# EPL soccer odds (default soccer league)
df = sbr.scrape("2024-10-05", sport="soccer")

# MLS soccer odds
df = sbr.scrape("2024-10-02", league="mls")

# Combine filters
df = sbr.scrape("2024-10-01", odds_types=["moneyline"], sportsbooks=["fanduel"])

# Faster scraping (may trigger rate limits)
df = sbr.scrape("2024-10-01", fast=True)

# Raw dict instead of DataFrame
data = sbr.scrape_raw("2024-10-01")
```

### DataFrame Columns

| Column | Description |
|--------|-------------|
| `game_id` | MLB `gamePk`, EPL fixture ID, or MLS `match_id` |
| `date` | Game date |
| `start_time` | Game start time (ISO format) |
| `away_team`, `home_team` | Team full names |
| `away_score`, `home_score` | Final scores |
| `venue` | Stadium name |
| `game_type` | R=Regular, F=Wild Card, D=Division, L=League, W=World Series |
| `sportsbook` | Sportsbook name (fanduel, draftkings, betmgm, etc.) |
| `odds_type` | moneyline, pointspread, or totals |
| `opening_*`, `current_*` | Opening and current line values; soccer moneyline includes `*_draw_odds` |

## CLI Usage

```bash
sbr-odds-scraper 2024-10-01 2024-10-05 -t moneyline pointspread -o odds.json
sbr-odds-scraper 2024-10-05 2024-10-05 --sport soccer -t moneyline
sbr-odds-scraper 2024-10-02 2024-10-02 --league mls -t moneyline
```

| Flag | Description |
|------|-------------|
| `-t`, `--types` | Odds types: `moneyline`, `pointspread`, `totals` (default: moneyline) |
| `-s`, `--sport` | Sport: `mlb`, `soccer`, `epl`, or `mls` (default: mlb; soccer defaults to EPL) |
| `-l`, `--league` | Soccer league: `epl` or `mls` |
| `-c`, `--concurrent` | Concurrent requests (default: 5) |
| `-f`, `--fast` | Faster scraping (reduced delays) |
| `-o`, `--output` | Output filename (default: mlb_odds.json) |

## JSON Structure

The raw data is organized by date. Each date contains a list of games with sportsbook odds:

```json
{
  "2021-04-01": [
    {
      "gameView": {
        "startDate": "2021-04-01T17:05:00+00:00",
        "awayTeam": {
          "fullName": "Toronto Blue Jays",
          "shortName": "TOR"
        },
        "awayTeamScore": 3,
        "homeTeam": {
          "fullName": "New York Yankees",
          "shortName": "NYY"
        },
        "homeTeamScore": 2,
        "gameStatusText": "Final (10)",
        "venueName": "Yankee Stadium",
        "gameType": "R"
      },
      "odds": {
        "moneyline": [
          {
            "sportsbook": "fanduel",
            "openingLine": { "homeOdds": -188, "awayOdds": 155 },
            "currentLine": { "homeOdds": -200, "awayOdds": 168 }
          },
          {
            "sportsbook": "draftkings",
            "openingLine": { "homeOdds": -175, "awayOdds": 148 },
            "currentLine": { "homeOdds": -195, "awayOdds": 165 }
          }
        ],
        "pointspread": [
          {
            "sportsbook": "fanduel",
            "openingLine": { "homeOdds": 122, "awayOdds": -144, "homeSpread": -1.5, "awaySpread": 1.5 },
            "currentLine": { "homeOdds": 100, "awayOdds": -120, "homeSpread": -1.5, "awaySpread": 1.5 }
          }
        ],
        "totals": [
          {
            "sportsbook": "fanduel",
            "openingLine": { "overOdds": -106, "underOdds": -114, "total": 8 },
            "currentLine": { "overOdds": -122, "underOdds": 100, "total": 7.5 }
          }
        ]
      }
    }
  ]
}
```

## Notes

- Historical data available from ~2019-05-03 onwards
- Use `fast=True` / `-f` sparingly to avoid rate limiting
- Game types: R=Regular, S=Spring, E=Exhibition, A=All-Star, D=Division, F=Wild Card, L=League Championship, W=World Series

## Credits

Original scraper by [Arnav Saraogi](https://github.com/ArnavSaraogi/mlb-odds-scraper).

## Disclaimer

For educational purposes only. Review SportsBookReview's Terms of Service before use.
