Scrape job postings together and heap them up. Read the launch post here.
Read it as "job-rake".
Say it quickly and you hear "job break"—a break from the search doomscroll. (^_~)
Did Jo show up? Jo hit the brake, too.
jobrake is a Python package and CLI tool for fetching job postings from LinkedIn and Indeed.
jobrake linkedin \
--query "data scientist" \
--location "amsterdam, netherlands" \
--max-age 48 \
--results 5 \
--details |
jobrake indeed \
-q "data scientist" \
-l amsterdam -c netherlands \
-a 48 \
-n 5 \
--radius 100 |
jobrake is not on PyPI. Install it from GitHub with uv:
uv add git+https://github.com/eyayaw/jobrake
# Install as a CLI tool
uv tool install git+https://github.com/eyayaw/jobrakejobrake -h
# LinkedIn ----
## Search
jobrake linkedin \
-q "research economist" \
-l "London, England" \
-n 5 \
-a 24 \
-d \
-o jobs.csv
## Fetch details
# You can pass several urls/ids
jobrake details linkedin \
"https://uk.linkedin.com/jobs/view/senior-data-scientist-at-hm-treasury-4461975556"
# or just 4461975556
## Resolve place names
jobrake places linkedin "amsterdam" # then use the display name in search
# -l "Amsterdam, North Holland, Netherlands"
# Use the geoid of the place directly (instead of location)
jobrake linkedin -q "data scientist" -g 102011674 -n 2 # Amsterdam, Netherlands
# Indeed ----
## Search and fetch details
jobrake indeed \
-q "data analyst" \
-c "UK" \
-l "London" \
-n 5 \
-a 24 \
-o jobs.jsonl
# Resolve place names
jobrake places indeed -c netherlands "amsterdam"The CLI writes JSON to stdout by default.
--format | -f selects JSON, JSONL, or CSV, and --output | -o writes to a file.
See the guide for file formats, returned fields, custom fetchers, and piping.
import asyncio
from jobrake import scrape
async def main():
return await scrape(
"indeed",
query="economist",
country="United States",
results=2,
)
jobs = asyncio.run(main())| Site | Search | Posting details |
|---|---|---|
indeed |
Mobile-app GraphQL API | Included in search results |
linkedin |
Login-free guest API | Optional, paced, and cached |
Indeed requires country. LinkedIn accepts either location or a geoId.
See the guide for search queries, geography, filters, pagination, rate limits, retries, and LinkedIn detail fetching.
Warning
LinkedIn answers posting pages with HTTP 999 from data center IPs, such as a Hetzner VPS.
Searches still work there, but --details and jobrake details linkedin return no details. So use jobrake from the comfort of your home. :D
jobrake's Indeed GraphQL endpoint and LinkedIn guest-search approach are based on python-jobspy. Huge thanks.
Warning
jobrake has no affiliation with LinkedIn or Indeed. Use it to find jobs, not to build datasets by scraping regularly. Scraping may violate their terms of service, and either site may rate-limit or block your IP address. You are responsible for checking and complying with their terms.