# LinkedIn job scraper Human Guide

## What This Is For
This skill finds LinkedIn job postings by running tools/jobspyscraper.py, a thin wrapper around the JobSpy library. It gives the agent a clearer input/output frame for social content: what context to ask for, what decisions to make, and what usable artifact to return.

Use this as a human-readable version of the LinkedIn job scraper agent skill. It is meant for marketers, operators, founders, and other non-coders who want the workflow without reading agent-specific implementation instructions.

## When To Use This
- Use this when you need a repeatable process for LinkedIn job scraper.
- Use this when the task needs judgment, examples, constraints, or a clear output format rather than a one-off prompt.
- Use this when you want to hand an AI assistant enough context to produce a usable marketing artifact.

## When Not To Use This
- Do not use this when you only need a quick factual answer.
- Do not use this when the work depends on private data you cannot share with the assistant.
- Do not use this as a replacement for legal, compliance, financial, or medical review.

## What You Need Before Starting
- The goal or business outcome you want.
- The audience, customer segment, or market context.
- Any source material the assistant should respect, such as notes, briefs, examples, URLs, or brand guidance.
- Constraints such as tone, length, channel, deadline, region, or approval requirements.
- A clear definition of what a good final answer should look like.

## Step-By-Step Workflow
1. State the job clearly: "Use the LinkedIn job scraper guide to help me with..."
2. Add context: audience, goal, offer, channel, source material, and constraints.
3. Ask the assistant to identify missing inputs before producing the final output.
4. Have the assistant follow the skill-specific guidance below.
5. Review the result against the final checklist and ask for revisions where needed.

## Skill-Specific Guidance
- **Search term** — job title, role, or keyword (required)
- **Location** — city, state, or "Remote" (optional but recommended)
- **Results wanted** — default to 25 if not specified
- **Recency** — `hours_old` filter if user wants recent posts (e.g. "last 48 hours")
- **Company filter** — `linkedin_company_ids` if targeting a specific company
- **Full descriptions** — set `--fetch-descriptions` if user needs job description text
- Report how many jobs were found
- Show a brief table: Title | Company | Location | Salary | Posted
- Note the output file path so the user can open it
- If 0 results: suggest broadening the search term or removing the location filter

## Decision Points And Nuance
The original skill emphasizes: Overview, Quick Start, Workflow, Step 1 — Understand the request, Step 2 — Construct the command, Step 3 — Run the script, Step 4 — Interpret and present results, Parameters Reference, Output Columns, Common Use Cases.

Use these questions to steer the work:
- What is the intended audience or buyer?
- What source material must be preserved?
- What should the assistant optimize for: clarity, persuasion, accuracy, speed, creativity, or conversion?
- What examples represent the desired quality bar?
- What should the assistant avoid?

## Common Mistakes
- **Search term** — job title, role, or keyword (required)
- | `--search` | Job title / keywords | required |
- | Rate limited / blocked | Wait a few minutes; avoid running back-to-back large scrapes |

## Copy-And-Paste Prompt
```text
Use the LinkedIn job scraper human guide.

My goal:
[Describe the business outcome]

Audience:
[Describe who this is for]

Context and source material:
[Paste notes, examples, links, or existing copy]

Constraints:
[Tone, length, channel, timeline, must-include items, must-avoid items]

Before producing the final output, ask me for any missing information that would materially improve the result.
```

## Final Checklist
- [ ] The output matches the original goal.
- [ ] The audience and context are reflected in the answer.
- [ ] Important constraints and source material were preserved.
- [ ] The assistant made the relevant decisions explicit.
- [ ] The final artifact is ready to use, review, or hand to the next person.

## Source
This guide was generated from the athina-ai/goose-skills skill entry for `linkedin-job-scraper`.

## Source Skill Notes
These notes preserve the nuance from the original skill. Use them as supporting reference when the workflow above feels too generic.

# LinkedIn Scraper

## Overview

This skill finds LinkedIn job postings by running `tools/jobspy_scraper.py`, a thin wrapper
around the [JobSpy](https://github.com/speedyapply/JobSpy) library. It handles installation,
parameter construction, execution, and result interpretation.

## Quick Start

**Install the dependency once (requires Python 3.10+):**
```bash
python3.12 -m pip install -U python-jobspy --break-system-packages
```

**Run the scraper:**
```bash
python3.12 tools/jobspy_scraper.py \
  --search "software engineer" \
  --location "San Francisco, CA" \
  --results 25 \
  --output .tmp/jobs.csv
```

Results are saved as CSV and printed as a summary table.

---

## Workflow

### Step 1 — Understand the request

Identify from the user's message:
- **Search term** — job title, role, or keyword (required)
- **Location** — city, state, or "Remote" (optional but recommended)
- **Results wanted** — default to 25 if not specified
- **Recency** — `hours_old` filter if user wants recent posts (e.g. "last 48 hours")
- **Company filter** — `linkedin_company_ids` if targeting a specific company
- **Full descriptions** — set `--fetch-descriptions` if user needs job description text

If anything is ambiguous (e.g. "find AI jobs"), pick reasonable defaults and tell the user what you used.

### Step 2 — Construct the command

Build the `tools/jobspy_scraper.py` command using the parameters below.
Always save output to `.tmp/` so it's disposable and easy to find.

```bash
python tools/jobspy_scraper.py \
  --search "<term>" \
  --location "<location>" \
  --results <N> \
  [--hours-old <N>] \
  [--fetch-descriptions] \
  [--company-ids <id1,id2>] \
  [--job-type fulltime|parttime|contract|internship] \
  [--remote] \
  --output .tmp/<descriptive_filename>.csv
```

**Note:** `--hours-old` and `--easy-apply` cannot be used together (LinkedIn API constraint).

### Step 3 — Run the script

Execute the command. The script will print a progress message and a summary of results found.

If the script is not found at `tools/jobspy_scraper.py`, check whether the file needs to be created
by reading `skills/linkedin-job-scraper/scripts/jobspy_scraper.py` and copying it to `tools/`.

### Step 4 — Interpret and present results

After the run:
- Report how many jobs were found
- Show a brief table: Title | Company | Location | Salary | Posted
- Note the output file path so the user can open it
- If 0 results: suggest broadening the search term or removing the location filter

---

## Parameters Reference
