LinkedIn Jobs Scraper

Web scraping skill for LinkedIn job postings using public API endpoints. Extract job data without authentication.

Audits

Pass

Install

openclaw skills install linkedin-jobs-scraper

LinkedIn Jobs Scraper Skill

Esta skill extrai vagas de emprego do LinkedIn usando a API pública não autenticada. Funciona em VPS sem navegador, apenas com requests + BeautifulSoup.

Busca rápida (título, empresa, local, URL) em segundos.
Detalhes completos (descrição, data) sob demanda por vaga.

⚠️ Avisos

  • Legal: Scraping de dados públicos é legal nos EUA (hiQ v. LinkedIn, 2022), mas viola os ToS do LinkedIn
  • Riscos: LinkedIn pode bloquear o IP se houver excesso de requisições
  • Volume: Limite a <100 buscas/dia para uso pessoal
  • Sem login: Nenhuma autenticação é usada

Uso via CLI

Busca rápida (padrão)

python scraper.py --keywords "python developer" --location "Brazil" --limit 10

Busca com filtros

python scraper.py \
  --keywords "data scientist" \
  --location "Brazil" \
  --remote only \
  --experience mid-senior \
  --job-type full-time \
  --posted last-week \
  --limit 20 \
  --output jobs.csv

Uso via Python

from scraper import LinkedInJobsScraper

scraper = LinkedInJobsScraper()

# Busca rápida (retorna em segundos)
jobs = scraper.search_jobs(
    keywords="python developer",
    location="Brazil",
    remote="only",
    limit=25
)

# Cada job tem: title, company, location, url, job_id
for job in jobs:
    print(f"{job['title']} - {job['company']} - {job['location']}")

# Detalhes completos de uma vaga específica (1 request extra)
details = scraper.get_job_details(job_id="4413133140")
print(details['description'][:300])  # descrição completa
print(details['posted_date'])        # ex: "1 week ago"

Parâmetros

ParâmetroValoresDescrição
--keywordstextoTítulo ou habilidade
--locationtextoCidade, estado ou país
--remoteonly, yes, noFiltro remoto
--experienceinternship, entry, associate, mid-senior, director, executiveNível
--job-typefull-time, part-time, contract, temporary, internshipTipo
--postedlast-24h, last-week, last-month, anytimeData
--limitnúmero (default: 25)Máx. vagas
--outputarquivo .csv ou .jsonSalvar resultados

Dados Retornados

Busca rápida (search_jobs)

{
  "title": "Python Engineer",
  "company": "Nortal",
  "location": "Greater Porto Alegre",
  "url": "https://br.linkedin.com/jobs/view/python-engineer...",
  "job_id": "4413133140"
}

Detalhes completos (get_job_details)

{
  "job_id": "4413133140",
  "title": "Python Engineer - Work from home",
  "company": "Nortal",
  "location": "Greater Porto Alegre",
  "posted_date": "1 week ago",
  "description": "Full job description text...",
  "employment_type": "Full-time",
  "seniority_level": "Mid-Senior level",
  "job_function": "Engineering",
  "industries": "Software Development"
}

Exemplos

# Vagas Python remotas no Brasil
python scraper.py --keywords "python" --location "Brazil" --remote only --limit 10

# Vagas de Data Scientist sênior nesta semana
python scraper.py --keywords "data scientist" --location "United States" --experience mid-senior --posted last-week --limit 5 --output ds_jobs.json
from scraper import LinkedInJobsScraper
import pandas as pd

scraper = LinkedInJobsScraper()
jobs = scraper.search_jobs("machine learning", "Europe", remote="yes", limit=50)

df = pd.DataFrame(jobs)
print(df['company'].value_counts().head(10))

Estrutura

linkedin-jobs-scraper/
├── SKILL.md
├── scraper.py
├── __init__.py
└── README.md

Dependências

pip install requests beautifulsoup4

pandas é opcional (use se quiser analisar os dados).

Boas Práticas

  • Delay de 2-5s entre requisições (automático)
  • Máximo ~100 requisições/dia
  • User-Agent rotacionado automaticamente
  • Cache os resultados (dados públicos mudam pouco)
  • Para descrições, chame get_job_details() só quando necessário