saitejatirunagari's picture
feat: Scrapling anti-block fetch layer + Direct Company ATS source
9e9393d
Raw
History Blame
14.9 kB
from typing import Literal
PlatformGroup = Literal["Search Boards", "ATS Platforms", "Company Pages"]
EVER_JOBS_PLATFORMS: dict[str, dict] = {
# ── Search Boards ──────────────────────────────────────────────────────────
"linkedin": {"group": "Search Boards", "display": "LinkedIn"},
"indeed": {"group": "Search Boards", "display": "Indeed"},
"glassdoor": {"group": "Search Boards", "display": "Glassdoor"},
"google": {"group": "Search Boards", "display": "Google Jobs"},
"naukri": {"group": "Search Boards", "display": "Naukri"},
"bdjobs": {"group": "Search Boards", "display": "BDJobs"},
"internshala": {"group": "Search Boards", "display": "Internshala"},
"bayt": {"group": "Search Boards", "display": "Bayt"},
"ziprecruiter": {"group": "Search Boards", "display": "ZipRecruiter"},
"monster": {"group": "Search Boards", "display": "Monster"},
"dice": {"group": "Search Boards", "display": "Dice"},
"careerjet": {"group": "Search Boards", "display": "CareerJet"},
"jooble": {"group": "Search Boards", "display": "Jooble"},
"adzuna": {"group": "Search Boards", "display": "Adzuna"},
"reed": {"group": "Search Boards", "display": "Reed"},
"totaljobs": {"group": "Search Boards", "display": "TotalJobs"},
"cwjobs": {"group": "Search Boards", "display": "CWJobs"},
"jobsite": {"group": "Search Boards", "display": "Jobsite"},
"cv_library": {"group": "Search Boards", "display": "CV-Library"},
"jobs_ac_uk": {"group": "Search Boards", "display": "jobs.ac.uk"},
"simplyhired": {"group": "Search Boards", "display": "SimplyHired"},
"snagajob": {"group": "Search Boards", "display": "Snagajob"},
"careerbuilder": {"group": "Search Boards", "display": "CareerBuilder"},
"usajobs": {"group": "Search Boards", "display": "USAJobs"},
"federalregister": {"group": "Search Boards", "display": "Federal Register"},
"linkedin_easy": {"group": "Search Boards", "display": "LinkedIn Easy Apply"},
"wellfound": {"group": "Search Boards", "display": "Wellfound (AngelList)"},
"remotive": {"group": "Search Boards", "display": "Remotive"},
"weworkremotely": {"group": "Search Boards", "display": "WeWorkRemotely"},
"himalayas": {"group": "Search Boards", "display": "Himalayas"},
"remoteok": {"group": "Search Boards", "display": "RemoteOK"},
"jobicy": {"group": "Search Boards", "display": "Jobicy"},
"remote_co": {"group": "Search Boards", "display": "Remote.co"},
"justremote": {"group": "Search Boards", "display": "JustRemote"},
"workable": {"group": "Search Boards", "display": "Workable Jobs"},
"upwork": {"group": "Search Boards", "display": "Upwork"},
"freelancer": {"group": "Search Boards", "display": "Freelancer"},
"toptal": {"group": "Search Boards", "display": "Toptal"},
"gun_io": {"group": "Search Boards", "display": "Gun.io"},
"indeed_sponsored": {"group": "Search Boards", "display": "Indeed Sponsored"},
"shine": {"group": "Search Boards", "display": "Shine (India)"},
"freshersworld": {"group": "Search Boards", "display": "Freshersworld"},
"timesjobs": {"group": "Search Boards", "display": "TimesJobs"},
"monsterindia": {"group": "Search Boards", "display": "Monster India"},
"iimjobs": {"group": "Search Boards", "display": "IIMJobs"},
"hirist": {"group": "Search Boards", "display": "Hirist (Tech India)"},
"instahyre": {"group": "Search Boards", "display": "Instahyre"},
"cutshort": {"group": "Search Boards", "display": "Cutshort"},
"angellist": {"group": "Search Boards", "display": "AngelList"},
"startup_jobs": {"group": "Search Boards", "display": "Startup.Jobs"},
"ycombinator": {"group": "Search Boards", "display": "Y Combinator Jobs"},
"producthunt": {"group": "Search Boards", "display": "Product Hunt Jobs"},
"xing": {"group": "Search Boards", "display": "Xing (DACH)"},
"stepstone": {"group": "Search Boards", "display": "StepStone"},
"jobware": {"group": "Search Boards", "display": "Jobware"},
"monster_de": {"group": "Search Boards", "display": "Monster Germany"},
"jobboerse": {"group": "Search Boards", "display": "Jobboerse"},
"indeed_de": {"group": "Search Boards", "display": "Indeed Germany"},
"manatal": {"group": "Search Boards", "display": "Manatal"},
"jobleads": {"group": "Search Boards", "display": "JobLeads"},
"careerone": {"group": "Search Boards", "display": "CareerOne (AU)"},
"seek": {"group": "Search Boards", "display": "Seek (AU/NZ)"},
"indeed_au": {"group": "Search Boards", "display": "Indeed Australia"},
"jobstreet": {"group": "Search Boards", "display": "Jobstreet (SEA)"},
"jobsdb": {"group": "Search Boards", "display": "JobsDB (HK/TH)"},
"recruitnet": {"group": "Search Boards", "display": "RecruitNet"},
"jobrapido": {"group": "Search Boards", "display": "Jobrapido"},
"trovit": {"group": "Search Boards", "display": "Trovit"},
"neuvoo": {"group": "Search Boards", "display": "Neuvoo (Talent.com)"},
"talent_com": {"group": "Search Boards", "display": "Talent.com"},
"lensa": {"group": "Search Boards", "display": "Lensa"},
"appcast": {"group": "Search Boards", "display": "Appcast"},
"jobg8": {"group": "Search Boards", "display": "JobG8"},
"jobisjob": {"group": "Search Boards", "display": "JobIsJob"},
"jobsora": {"group": "Search Boards", "display": "Jobsora"},
"jobvertise": {"group": "Search Boards", "display": "Jobvertise"},
"postjobfree": {"group": "Search Boards", "display": "PostJobFree"},
"juju": {"group": "Search Boards", "display": "Juju"},
"beyond": {"group": "Search Boards", "display": "Beyond"},
"jobsinthemoney": {"group": "Search Boards", "display": "Jobs in the Money"},
"jobs2careers": {"group": "Search Boards", "display": "Jobs2Careers"},
"getwork": {"group": "Search Boards", "display": "GetWork"},
"whatjobs": {"group": "Search Boards", "display": "WhatJobs"},
"efinancialcareers":{"group": "Search Boards", "display": "eFinancialCareers"},
"cwjobs_tech": {"group": "Search Boards", "display": "CWJobs Tech"},
"github_jobs": {"group": "Search Boards", "display": "GitHub Jobs"},
"stackoverflow": {"group": "Search Boards", "display": "Stack Overflow Jobs"},
"techinasia": {"group": "Search Boards", "display": "Tech in Asia"},
"e27": {"group": "Search Boards", "display": "e27 (SEA Startups)"},
"foundit": {"group": "Search Boards", "display": "Foundit (ex-Monster India)"},
"apna": {"group": "Search Boards", "display": "Apna"},
"naukrigulf": {"group": "Search Boards", "display": "NaukriGulf"},
"gulftalent": {"group": "Search Boards", "display": "GulfTalent"},
"dubizzle": {"group": "Search Boards", "display": "Dubizzle Jobs"},
# ── ATS Platforms ──────────────────────────────────────────────────────────
"greenhouse": {"group": "ATS Platforms", "display": "Greenhouse"},
"lever": {"group": "ATS Platforms", "display": "Lever"},
"ashby": {"group": "ATS Platforms", "display": "Ashby"},
"workday": {"group": "ATS Platforms", "display": "Workday"},
"smartrecruiters": {"group": "ATS Platforms", "display": "SmartRecruiters"},
"bamboohr": {"group": "ATS Platforms", "display": "BambooHR"},
"recruitee": {"group": "ATS Platforms", "display": "Recruitee"},
"teamtailor": {"group": "ATS Platforms", "display": "Teamtailor"},
"icims": {"group": "ATS Platforms", "display": "iCIMS"},
"taleo": {"group": "ATS Platforms", "display": "Oracle Taleo"},
"successfactors": {"group": "ATS Platforms", "display": "SAP SuccessFactors"},
"jobvite": {"group": "ATS Platforms", "display": "Jobvite"},
"paylocity": {"group": "ATS Platforms", "display": "Paylocity"},
"jazz": {"group": "ATS Platforms", "display": "JazzHR"},
"pinpoint": {"group": "ATS Platforms", "display": "Pinpoint"},
"dover": {"group": "ATS Platforms", "display": "Dover"},
"breezyhr": {"group": "ATS Platforms", "display": "Breezy HR"},
"comeet": {"group": "ATS Platforms", "display": "Comeet"},
"jobsoid": {"group": "ATS Platforms", "display": "Jobsoid"},
"fountain": {"group": "ATS Platforms", "display": "Fountain"},
"keka": {"group": "ATS Platforms", "display": "Keka (India)"},
"darwinbox": {"group": "ATS Platforms", "display": "Darwinbox (India)"},
"zoho_recruit": {"group": "ATS Platforms", "display": "Zoho Recruit"},
"freshteam": {"group": "ATS Platforms", "display": "Freshteam"},
"kronos": {"group": "ATS Platforms", "display": "Kronos/UKG"},
"paycor": {"group": "ATS Platforms", "display": "Paycor"},
"adp": {"group": "ATS Platforms", "display": "ADP Recruiting"},
"oracle_hcm": {"group": "ATS Platforms", "display": "Oracle HCM"},
"sap_jobs": {"group": "ATS Platforms", "display": "SAP Jobs"},
"ceridian": {"group": "ATS Platforms", "display": "Ceridian Dayforce"},
"cornerstone": {"group": "ATS Platforms", "display": "Cornerstone OnDemand"},
"lumesse": {"group": "ATS Platforms", "display": "Lumesse"},
"silkroad": {"group": "ATS Platforms", "display": "SilkRoad"},
"hirevue": {"group": "ATS Platforms", "display": "HireVue"},
"workable_ats": {"group": "ATS Platforms", "display": "Workable ATS"},
"personio": {"group": "ATS Platforms", "display": "Personio"},
"rexx": {"group": "ATS Platforms", "display": "Rexx Systems"},
# ── Company Pages ──────────────────────────────────────────────────────────
"amazon": {"group": "Company Pages", "display": "Amazon"},
"apple": {"group": "Company Pages", "display": "Apple"},
"google_careers": {"group": "Company Pages", "display": "Google Careers"},
"microsoft": {"group": "Company Pages", "display": "Microsoft"},
"meta": {"group": "Company Pages", "display": "Meta"},
"netflix": {"group": "Company Pages", "display": "Netflix"},
"nvidia_careers": {"group": "Company Pages", "display": "NVIDIA Careers"},
"stripe": {"group": "Company Pages", "display": "Stripe"},
"openai": {"group": "Company Pages", "display": "OpenAI"},
"anthropic": {"group": "Company Pages", "display": "Anthropic"},
"deepmind": {"group": "Company Pages", "display": "DeepMind"},
"salesforce": {"group": "Company Pages", "display": "Salesforce"},
"shopify": {"group": "Company Pages", "display": "Shopify"},
"uber": {"group": "Company Pages", "display": "Uber"},
"airbnb": {"group": "Company Pages", "display": "Airbnb"},
"twitter": {"group": "Company Pages", "display": "X (Twitter)"},
"snap": {"group": "Company Pages", "display": "Snap"},
"lyft": {"group": "Company Pages", "display": "Lyft"},
"atlassian": {"group": "Company Pages", "display": "Atlassian"},
"confluent": {"group": "Company Pages", "display": "Confluent"},
"databricks": {"group": "Company Pages", "display": "Databricks"},
"snowflake": {"group": "Company Pages", "display": "Snowflake"},
"palantir": {"group": "Company Pages", "display": "Palantir"},
"twilio": {"group": "Company Pages", "display": "Twilio"},
"cloudflare": {"group": "Company Pages", "display": "Cloudflare"},
"hashicorp": {"group": "Company Pages", "display": "HashiCorp"},
"figma": {"group": "Company Pages", "display": "Figma"},
"notion": {"group": "Company Pages", "display": "Notion"},
"slack": {"group": "Company Pages", "display": "Slack/Salesforce"},
"flipkart": {"group": "Company Pages", "display": "Flipkart"},
"swiggy": {"group": "Company Pages", "display": "Swiggy"},
"zomato": {"group": "Company Pages", "display": "Zomato"},
"razorpay": {"group": "Company Pages", "display": "Razorpay"},
"paytm": {"group": "Company Pages", "display": "Paytm"},
"meesho": {"group": "Company Pages", "display": "Meesho"},
"zepto": {"group": "Company Pages", "display": "Zepto"},
"byju": {"group": "Company Pages", "display": "BYJU'S"},
"unacademy": {"group": "Company Pages", "display": "Unacademy"},
"phonepe": {"group": "Company Pages", "display": "PhonePe"},
# Direct-company ATS aggregator (Greenhouse/Lever/Ashby public JSON APIs).
# Routed to src/scrapers/company_ats.py, NOT the ever-jobs sidecar.
"company_ats": {"group": "Company Pages", "display": "Direct Company ATS (Greenhouse/Lever/Ashby)"},
}
INDIA_DEFAULT_PLATFORMS: list[str] = [
"linkedin",
"naukri",
"indeed",
"glassdoor",
"company_ats",
"google",
"bdjobs",
"internshala",
"bayt",
"iimjobs",
"foundit",
]
PLATFORM_GROUPS: dict[str, list[str]] = {
group: [k for k, v in EVER_JOBS_PLATFORMS.items() if v["group"] == group]
for group in ("Search Boards", "ATS Platforms", "Company Pages")
}
def get_platform_keys_for_group(group: PlatformGroup) -> list[str]:
return PLATFORM_GROUPS.get(group, [])
def get_display_name(key: str) -> str:
return EVER_JOBS_PLATFORMS.get(key, {}).get("display", key)
def validate_platform_keys(keys: list[str]) -> tuple[list[str], list[str]]:
valid = [k for k in keys if k in EVER_JOBS_PLATFORMS]
unknown = [k for k in keys if k not in EVER_JOBS_PLATFORMS]
return valid, unknown