Skip to main content
scrape_jobs() returns a standard Pandas DataFrame. You can use any pandas export method to save results to disk.

DataFrame columns

Results are always returned in the following column order:
ColumnDescription
idInternal job ID
siteSource job board
job_urlURL to the job listing
job_url_directDirect application URL (if available)
titleJob title
companyCompany name
locationCity, state, and/or country
date_postedDate the job was posted
job_typeEmployment type (e.g. fulltime, contract)
salary_sourcedirect_data or description
intervalPay interval (yearly, monthly, weekly, daily, hourly)
min_amountMinimum salary/pay
max_amountMaximum salary/pay
currencyCurrency code (e.g. USD)
is_remoteWhether the job is remote
job_levelSeniority level (LinkedIn only)
job_functionJob function category (LinkedIn only)
listing_typeListing type
emailsContact emails extracted from description
descriptionFull job description
company_industryIndustry (LinkedIn and Indeed)
company_urlCompany profile URL
company_logoCompany logo URL (Indeed)
company_url_directDirect company website URL
company_addressesCompany office addresses (Indeed)
company_num_employeesEmployee count label (Indeed)
company_revenueRevenue label (Indeed)
company_descriptionCompany description (Indeed)
skillsRequired skills (Naukri)
experience_rangeExperience required (Naukri)
company_ratingCompany rating (Naukri)
company_reviews_countNumber of company reviews (Naukri)
vacancy_countNumber of open positions (Naukri)
work_from_home_typeWFH type, e.g. Hybrid, Remote (Naukri)

Export formats

import csv
from jobspy import scrape_jobs

jobs = scrape_jobs(
    site_name=["indeed", "linkedin"],
    search_term="software engineer",
    location="Austin, TX",
)

jobs.to_csv(
    "jobs.csv",
    quoting=csv.QUOTE_NONNUMERIC,
    escapechar="\\",
    index=False,
)

Selecting specific columns

You can select a subset of columns before exporting to keep files smaller.
import csv
from jobspy import scrape_jobs

jobs = scrape_jobs(
    site_name=["indeed", "linkedin"],
    search_term="data analyst",
    location="New York, NY",
)

columns = ["site", "title", "company", "location", "job_url", "min_amount", "max_amount", "interval"]
jobs[columns].to_csv("jobs_slim.csv", quoting=csv.QUOTE_NONNUMERIC, escapechar="\\", index=False)

Sorting results

The DataFrame is pre-sorted by site and date_posted (newest first). You can re-sort by any column.
# Sort by minimum salary, highest first
jobs_sorted = jobs.sort_values("min_amount", ascending=False)

# Sort by date posted, most recent first
jobs_sorted = jobs.sort_values("date_posted", ascending=False)

Normalizing salary to annual figures

Job boards report salary in different intervals — some hourly, some monthly, some yearly. Use enforce_annual_salary=True to automatically convert all non-yearly wages to annual equivalents before they are returned.
from jobspy import scrape_jobs

jobs = scrape_jobs(
    site_name=["indeed", "zip_recruiter"],
    search_term="nurse",
    location="Houston, TX",
    enforce_annual_salary=True,  # all salary amounts converted to yearly
)

# Now min_amount and max_amount are comparable across all rows
print(jobs[["title", "company", "interval", "min_amount", "max_amount"]].head())
Conversion rates used internally:
IntervalMultiplier
Hourly× 2,080
Weekly× 52
Monthly× 12
Daily× 260

Controlling description format

Job descriptions can be returned as Markdown or HTML. Use the description_format parameter.
jobs = scrape_jobs(
    site_name="indeed",
    search_term="technical writer",
    location="Remote",
    description_format="markdown",  # default — human-readable
)

jobs_html = scrape_jobs(
    site_name="indeed",
    search_term="technical writer",
    location="Remote",
    description_format="html",  # raw HTML for rendering in a UI
)
Accepted values: "markdown" (default), "html", or "plain" (plain text with HTML tags stripped).