Envie uma busca do LinkedIn ou Indeed, uma vaga ou uma página de carreira. O Web Unlocker a devolve como um visitante vê: 60 vagas do LinkedIn ou 50 do Indeed, cobradas como uma página. Sem login nem API do site de vagas. Uma página com falha não custa nada.
1.000 requisições grátis · Pague só se der certo · Mais de 195 países · Pronto para o Claude
Os sites de vagas levam de 3 a 30 segundos. Ainda está em andamento, não precisa clicar de novo.
Pronto para suas próprias buscas? Obtenha uma chave de API ou agende uma demo.
Conte um pouco sobre sua equipe e receba:
Uma página de busca de vagas do LinkedIn traz 60 cartões de vagas com título, empresa, local e data de publicação, e o Web Unlocker a cobra como uma página. Os scrapers de vagas do LinkedIn na Apify e na Bright Data cobram cada vaga como um registro próprio, e a ScraperAPI cobra 30 créditos por uma página do LinkedIn.
Uma página, 60 vagas.
167 páginas, 10.000 vagas.
Precisa da descrição completa? A página própria de cada vaga é mais uma requisição, então 1.000 descrições custam $0.98. Uma página de busca do Indeed traz 50 vagas pelo mesmo preço, e a página de carreira de uma empresa também.
Quanto custam 10.000 vagas do LinkedIn de páginas de busca
167 páginas de busca com 60 vagas, a preços publicados
Pronto para rodar nas suas próprias buscas? Obtenha sua chave de API e requisições grátis.
Cem páginas de vagas pedidas uma após a outra, sem novas tentativas: buscas do LinkedIn em 25 cidades, as páginas seguintes de uma busca, páginas de vagas com a descrição completa, buscas e páginas de vagas do Indeed, e páginas de carreira de empresas no Lever, Ashby, Greenhouse e Workday.
Uma página que não volta custa $0.
Você paga por páginas, não por tentativas.
Limite uma busca do LinkedIn às últimas 24 horas e toda vaga da página tem um dia ou menos, marcada como Be an early applicant enquanto é recente. Seu script pede essa página quantas vezes quiser: uma verificação por hora são 24 páginas por dia, $0.71 por mês.
As bases de dados de vagas são atualizadas toda semana ou todo mês.
Sua página é a desta hora.
Scraping de sites de vagas sem uma frota de navegadores própria: o Web Unlocker devolve a página, e os cartões de vagas são HTML simples que você lê com poucas linhas de código. A mesma requisição funciona no LinkedIn, no Indeed e em páginas de carreira.
Preencha o formulário acima. A chave chega por e-mail em até um dia útil.
Uma busca do LinkedIn ou do Indeed, as páginas seguintes de uma busca, a página própria de uma vaga para a descrição, ou a página de carreira de uma empresa.
Recorte os cartões de vagas da página e guarde os campos de que precisa: título, empresa, local, data e link.
pip install requestsGOLOGIN_SCRAPING_API_KEY=your_key python linkedin_jobs.pyhttps://parsing.webunlocker.gologin.com/v1/scrapeimport html
import json
import os
import re
import time
from urllib.parse import urlencode
import requests
query = "data analyst"
where = "Chicago, IL"
def scrape(url):
for attempt in range(3):
response = requests.get(
"https://parsing.webunlocker.gologin.com/v1/scrape",
params={"url": url, "geo": "us", "format": "json"},
headers={"apikey": os.environ["GOLOGIN_SCRAPING_API_KEY"]},
timeout=90,
)
page = response.json().get("data", {}).get("html", "") if response.ok else ""
if "urn:li:jobPosting:" in page:
return page
time.sleep(5)
raise RuntimeError("No jobs came back, try again later")
def text(pattern, card):
found = re.search(pattern, card, re.S)
return " ".join(html.unescape(re.sub(r"<[^>]+>", " ", found.group(1))).split()) if found else None
search = "https://www.linkedin.com/jobs/search?" + urlencode({"keywords": query, "location": where})
page = scrape(search)
jobs = []
for card in page.split("<li")[1:]:
job_id = re.search(r"urn:li:jobPosting:(\d+)", card)
if not job_id:
continue
jobs.append({
"title": text(r'base-search-card__title[^>]*>(.*?)</h3>', card),
"company": text(r'base-search-card__subtitle[^>]*>(.*?)</h4>', card),
"location": text(r'job-search-card__location[^>]*>(.*?)</span>', card),
"posted": text(r"<time[^>]*>(.*?)</time>", card),
"date": text(r'datetime="([^"]+)"', card),
"url": "https://www.linkedin.com/jobs/view/" + job_id.group(1),
})
print(json.dumps({"query": query, "where": where, "jobs_on_page": len(jobs), "jobs": jobs}, indent=2, ensure_ascii=False))GOLOGIN_SCRAPING_API_KEY=your_key node linkedin-every-page.mjshttps://parsing.webunlocker.gologin.com/v1/scrapeimport { writeFileSync } from 'node:fs';
const query = 'registered nurse';
const where = 'Texas, United States';
async function scrape(url) {
for (let attempt = 1; attempt <= 3; attempt++) {
const params = new URLSearchParams({ url, geo: 'us', format: 'json' });
const response = await fetch(`https://parsing.webunlocker.gologin.com/v1/scrape?${params}`, {
headers: { apikey: process.env.GOLOGIN_SCRAPING_API_KEY },
});
const body = response.ok ? await response.json() : null;
if (body?.success) return body.data?.html ?? '';
await new Promise((resolve) => setTimeout(resolve, 5000));
}
throw new Error(`Nothing came back for ${url}, try again later`);
}
const text = (card, pattern) =>
(card.match(pattern)?.[1] ?? '').replace(/<[^>]+>/g, ' ').replace(/&/g, '&').replace(/'/g, "'").replace(/\s+/g, ' ').trim();
const cell = (value) => `"${value.replace(/"/g, '""')}"`;
const jobs = new Map();
let pages = 0;
for (let start = 0; start < 1000; start += 10) {
const params = new URLSearchParams({ keywords: query, location: where, start });
const page = await scrape(`https://www.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search?${params}`);
pages += 1;
const cards = page.split('<li').slice(1).filter((card) => card.includes('urn:li:jobPosting:'));
if (cards.length === 0) break;
for (const card of cards) {
const id = card.match(/urn:li:jobPosting:(\d+)/)[1];
jobs.set(id, [
text(card, /base-search-card__title[^>]*>([\s\S]*?)<\/h3>/),
text(card, /base-search-card__subtitle[^>]*>([\s\S]*?)<\/h4>/),
text(card, /job-search-card__location[^>]*>([\s\S]*?)<\/span>/),
card.match(/datetime="([^"]+)"/)?.[1] ?? '',
`https://www.linkedin.com/jobs/view/${id}`,
]);
}
}
const rows = [['title', 'company', 'location', 'date', 'url'], ...jobs.values()];
writeFileSync('linkedin-jobs.csv', rows.map((row) => row.map(cell).join(',')).join('\n'));
console.log(`${jobs.size} jobs from ${pages} pages saved to linkedin-jobs.csv`);
console.log(rows.slice(1, 4).map((row) => row.slice(0, 3).join(' | ')).join('\n'));GOLOGIN_SCRAPING_API_KEY=your_key node two-boards.mjshttps://parsing.webunlocker.gologin.com/v1/scrapeconst query = 'software engineer';
const city = 'Austin, TX';
async function scrape(url, marker) {
for (let attempt = 1; attempt <= 3; attempt++) {
const params = new URLSearchParams({ url, geo: 'us', format: 'json' });
const response = await fetch(`https://parsing.webunlocker.gologin.com/v1/scrape?${params}`, {
headers: { apikey: process.env.GOLOGIN_SCRAPING_API_KEY },
});
const page = response.ok ? (await response.json()).data?.html : '';
if (page?.includes(marker)) return page;
await new Promise((resolve) => setTimeout(resolve, 5000));
}
throw new Error(`Nothing came back for ${url}, try again later`);
}
const text = (markup = '') => markup.replace(/<[^>]+>/g, ' ').replace(/&/g, '&').replace(/'/g, "'").replace(/\s+/g, ' ').trim();
const key = (job) => `${job.company} ${job.title}`.toLowerCase().replace(/[^a-z0-9]+/g, ' ').trim();
const linkedin = await scrape(`https://www.linkedin.com/jobs/search?${new URLSearchParams({ keywords: query, location: city })}`, 'urn:li:jobPosting:');
const fromLinkedin = linkedin
.split('<li')
.filter((card) => card.includes('urn:li:jobPosting:'))
.map((card) => ({
board: 'LinkedIn',
title: text(card.match(/base-search-card__title[^>]*>([\s\S]*?)<\/h3>/)?.[1]),
company: text(card.match(/base-search-card__subtitle[^>]*>([\s\S]*?)<\/h4>/)?.[1]),
location: text(card.match(/job-search-card__location[^>]*>([\s\S]*?)<\/span>/)?.[1]),
url: `https://www.linkedin.com/jobs/view/${card.match(/urn:li:jobPosting:(\d+)/)[1]}`,
}));
const indeed = await scrape(`https://www.indeed.com/jobs?${new URLSearchParams({ q: query, l: city, limit: 50 })}`, 'mosaic-provider-jobcards"]=');
const start = indeed.indexOf('=', indeed.indexOf('mosaic-provider-jobcards"]=')) + 1;
const cards = JSON.parse(indeed.slice(start, indeed.indexOf(';\n', start)));
const results = cards.metaData.mosaicProviderJobCardsModel.results;
const fromIndeed = results.filter((job, i) => results.findIndex((other) => other.jobkey === job.jobkey) === i).map((job) => ({
board: 'Indeed',
title: job.title,
company: job.company,
location: job.formattedLocation,
url: `https://www.indeed.com/viewjob?jk=${job.jobkey}`,
}));
const jobs = new Map();
for (const job of [...fromLinkedin, ...fromIndeed]) {
const seen = jobs.get(key(job));
if (seen) seen.boards.add(job.board);
else jobs.set(key(job), { ...job, boards: new Set([job.board]) });
}
const onBoth = [...jobs.values()].filter((job) => job.boards.size === 2);
console.log(`LinkedIn ${fromLinkedin.length} + Indeed ${fromIndeed.length} = ${jobs.size} different jobs, ${onBoth.length} on both boards, 2 pages billed`);
for (const job of onBoth.slice(0, 5)) console.log(`${job.title} | ${job.company} | ${job.location}`);Pronto para rodar nas suas próprias buscas? Obtenha sua chave de API e requisições grátis.
O LinkedIn não tem API de busca de vagas para o seu app, os scrapers de vagas prontos cobram cada vaga, e uma biblioteca grátis de scraper de vagas deixa os proxies com você. Veja o que cada caminho exige para as mesmas vagas.
| O que é preciso | JobSpy | Apify | Bright Data | |
|---|---|---|---|---|
| Você paga por | Uma página | Seus proxies | Cada vaga | Cada registro |
| 10.000 vagas do LinkedIn de buscas | $0.16 | Grátis + proxies | $10 | $15 |
| Vagas por unidade cobrada | 60 | Nenhuma | 1 | 1 |
| A página inteira em HTML ou Markdown | Sim | Não | Não | Não |
| Roda sem proxies próprios | Sim | Não | Sim | Sim |
| Grátis para começar | 1.000 páginas | Grátis | $5 por mês | 5.000 registros |
Vai fazer scraping de um site de vagas a fundo? Veja o scraper de Indeed, ou qualquer outro site com o Web Unlocker pelo mesmo preço.
Uma conta, uma rede de proxies, um ecossistema. Escolha o produto de que a tarefa precisa.
Vai extrair dados de outros sites também? Veja os scrapers do Indeed, do Google Maps e do Reddit, ou todas as ferramentas de web scraping.
Um programa que carrega as páginas de sites de vagas e extrai as vagas como dados: título, empresa, local, salário, data de publicação, descrição e link. Com o Web Unlocker, a parte de carregar é uma chamada de API por página, no LinkedIn, no Indeed e em páginas de carreira de empresas, e você guarda os campos de que precisa.
Seu script pede a página de busca de um site de vagas, lê os cartões de vagas nela e segue cada cartão até a página própria da vaga quando precisa da descrição completa. O Web Unlocker carrega cada página em um navegador real, a partir do país que você escolher, e devolve o HTML, então seu código só faz o parse.
O web scraping de vagas de emprego começa pela busca que um visitante faria, um cargo e um local. Envie o endereço dela ao Web Unlocker. Uma página de busca do LinkedIn devolve 60 vagas e uma do Indeed 50, cada uma com título, empresa, local e data. O código acima faz exatamente isso em Python e Node.js.
Sites e agregadores de vagas reúnem vagas de muitos sites em uma só busca. Agências de recrutamento e times de vendas monitoram quem está contratando e para quais cargos. Analistas acompanham salários e demanda por cargo e cidade, e agentes de IA de emprego conectam pessoas a vagas recentes. Todos precisam da mesma coisa: as páginas de vagas de hoje.
Sim. O scraping de vagas do LinkedIn funciona em páginas públicas: a busca de vagas e as páginas de vagas abrem sem login, a primeira página de busca lista 60 vagas, as seguintes 10 cada, e a página de uma vaga traz a descrição completa, o nível de experiência, o tipo de contratação e o número de candidatos. O Web Unlocker as devolve como um visitante as vê.
Não existe uma LinkedIn Jobs API nem uma API de busca de vagas do LinkedIn para ler os resultados da busca. A Job Posting API do LinkedIn é para parceiros que publicam vagas no LinkedIn, e não está aceitando novos parceiros. Para ler vagas públicas, um scraper de vagas carrega as mesmas páginas que um visitante abre.
Para fazer scraping de vagas do LinkedIn, envie o endereço da busca à API de scraper de vagas com a biblioteca requests, divida a página em cartões de vagas e leia o título, a empresa, o local e a data de cada um. A aba Python acima é um scraper de vagas do LinkedIn completo em Python, testado na API real: 60 vagas em uma requisição.
O LinkedIn responde com erros a uma rajada de requisições vindas de um só endereço, muitas vezes depois de cerca de dez páginas, então um script em um só servidor para ali. O Web Unlocker carrega cada página em um navegador real com um IP residencial no país que você escolher. A aba Node.js percorreu uma busca até o fim: 67 páginas, 660 vagas.
As páginas de busca do LinkedIn, Indeed, Dice, Wellfound, Built In e SimplyHired voltaram nos nossos testes, assim como as páginas de carreira no Lever, Ashby, Greenhouse e Workday. Glassdoor e ZipRecruiter não voltaram de forma confiável a partir de um endereço dos EUA, então não os listamos.
Abra a página própria da vaga pelo Web Unlocker: linkedin.com/jobs/view/ seguido do id da vaga, ou a página da vaga no Indeed. Ele devolve a descrição com título, empresa, local e data de publicação. Uma página por vaga, 1.000 descrições por $0.98.
Sim. Peça Markdown e o Web Unlocker devolve a página da vaga como texto, pronta para um agente ou para o Claude. A skill de scraping do Gologin permite que o Claude chame o Web Unlocker por você, e o MCP & AI Skills transforma um pedido simples em um scraper de vagas que funciona.
As vagas são publicadas para serem lidas, e um scraper de vagas lê as páginas públicas que um visitante vê, sem login. As regras variam por país e pelo que você faz com os dados, então confira seu uso com elas. O Web Unlocker devolve a página; o que você coleta é decisão sua.
Menos de $1 por 1.000 páginas na API de scraper de vagas, e o mesmo preço em todo site de vagas. Uma página de busca do LinkedIn tem 60 vagas, então 10.000 vagas de páginas de busca custam 16 centavos. Uma página que não carrega não custa nada. Os planos começam em $49 por mês para 50.000 requisições.
Sim, para começar: o Web Unlocker vem com 1.000 requisições grátis, o suficiente para 60.000 vagas do LinkedIn de páginas de busca ou 1.000 descrições completas de vagas. As bibliotecas open source de scraper de vagas também são grátis, e você fornece os proxies e os mantém funcionando.
Depende do que você precisa. Serviços de scraping de vagas e APIs de dados de vagas como a Apify e a Bright Data vendem linhas prontas e cobram cada vaga como um registro; softwares grátis de scraping de vagas precisam de proxies próprios. O Web Unlocker é uma API de scraping de vagas que devolve a página inteira por um preço único, em qualquer site, então você decide quais campos guardar.
JobSpy é uma biblioteca Python gratuita e de código aberto para LinkedIn, Indeed, Glassdoor e ZipRecruiter. Ela roda na sua própria máquina, então os proxies ficam por sua conta, e a própria documentação diz que o LinkedIn responde com erros a rajadas de requisições. O Web Unlocker traz a rede e devolve a página, e você paga só pelas páginas que voltam.
Os scrapers de vagas do LinkedIn na Apify devolvem linhas prontas e cobram cada vaga, a partir de $1 por 1.000 vagas. O Web Unlocker cobra a página: uma página de busca do LinkedIn tem 60 vagas, então 10.000 vagas custam 16 centavos, e poucas linhas de código, como as das abas acima, recortam os campos.
Conte um pouco sobre sua equipe e receba: