Wyślij wyszukiwanie LinkedIn lub Indeed, ofertę albo stronę kariery. Web Unlocker zwraca stronę tak, jak widzi ją użytkownik: 60 ofert z LinkedIn lub 50 z Indeed w cenie jednej. Bez logowania i API portalu. Nieudana strona nic nie kosztuje.
1000 darmowych żądań · Płatność tylko za sukces · 195+ krajów · Gotowe dla Claude
Portale pracy ładują się od 3 do 30 sekund. Nadal pracuję, nie musisz klikać ponownie.
Gotowy na własne wyszukiwania? Pobierz klucz API albo umów demo.
Opowiedz nam trochę o swoim zespole i otrzymasz:
Strona wyszukiwania ofert na LinkedIn zawiera 60 kart ofert z tytułem, firmą, lokalizacją i datą dodania, a Web Unlocker rozlicza ją jako jedną stronę. Scrapery ofert LinkedIn na Apify i Bright Data rozliczają każdą ofertę jako osobny rekord, a ScraperAPI pobiera 30 kredytów za stronę LinkedIn.
Jedna strona, 60 ofert.
167 stron, 10 000 ofert.
Potrzebujesz pełnego opisu? Strona każdej oferty to jedno dodatkowe żądanie, więc 1000 opisów kosztuje $0.98. Strona wyszukiwania Indeed zawiera 50 ofert w tej samej cenie, podobnie jak strona kariery firmy.
Ile kosztuje 10 000 ofert z LinkedIn ze stron wyszukiwania
167 stron wyszukiwania po 60 ofert, według opublikowanych cen
Chcesz uruchomić to na własnych wyszukiwaniach? Odbierz klucz API i darmowe żądania.
Sto stron z ofertami pobranych jedna po drugiej, bez ponowień: wyszukiwania LinkedIn w 25 miastach, kolejne strony wyszukiwania, strony ofert z pełnym opisem, wyszukiwania i strony ofert na Indeed oraz strony kariery firm na Lever, Ashby, Greenhouse i Workday.
Strona, która nie wróci, kosztuje $0.
Płacisz za strony, nie za próby.
Zawęź wyszukiwanie LinkedIn do ostatnich 24 godzin, a każda oferta na stronie będzie mieć najwyżej dzień, oznaczona Be an early applicant, dopóki jest świeża. Twój skrypt prosi o tę stronę tak często, jak chcesz: sprawdzenie co godzinę to 24 strony dziennie, $0.71 miesięcznie.
Zbiory ofert odświeżają się co tydzień lub co miesiąc.
Twoja strona jest z tej godziny.
Scrapowanie portali pracy bez własnej floty przeglądarek: Web Unlocker zwraca stronę, a karty ofert to zwykły HTML, który odczytasz kilkoma liniami kodu. To samo żądanie działa na LinkedIn, Indeed i stronach kariery.
Wypełnij formularz powyżej. Klucz przychodzi e-mailem w ciągu jednego dnia roboczego.
Wyszukiwanie LinkedIn lub Indeed, kolejne strony wyszukiwania, strona oferty dla jej opisu albo strona kariery firmy.
Wytnij karty ofert ze strony i zachowaj potrzebne pola: tytuł, firmę, lokalizację, datę i 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}`);Chcesz uruchomić to na własnych wyszukiwaniach? Odbierz klucz API i darmowe żądania.
LinkedIn nie ma API do wyszukiwania ofert dla Twojej aplikacji, gotowe scrapery ofert rozliczają każdą ofertę, a darmowa biblioteka do scrapowania ofert zostawia proxy Tobie. Oto, czego wymaga każda droga dla tych samych ofert.
| Czego to wymaga | JobSpy | Apify | Bright Data | |
|---|---|---|---|---|
| Płacisz za | Stronę | Twoje proxy | Każdą ofertę | Każdy rekord |
| 10 000 ofert z wyszukiwań LinkedIn | $0.16 | Za darmo + proxy | $10 | $15 |
| Ofert na rozliczaną jednostkę | 60 | Brak | 1 | 1 |
| Cała strona w HTML lub Markdown | Tak | Nie | Nie | Nie |
| Działa bez własnych proxy | Tak | Nie | Tak | Tak |
| Darmowy start | 1000 stron | Za darmo | $5 miesięcznie | 5000 rekordów |
Scrapujesz dogłębnie jeden portal? Zobacz scraper Indeed albo dowolną inną witrynę przez Web Unlocker w tej samej cenie.
Jedno konto, jedna sieć proxy, jeden ekosystem. Wybierz produkt, którego wymaga zadanie.
Scrapujesz też inne witryny? Zobacz scrapery Indeed, Google Maps i Reddit albo wszystkie narzędzia do web scrapingu.
Program, który ładuje strony portali pracy i wyciąga z nich oferty jako dane: tytuł, firmę, lokalizację, wynagrodzenie, datę dodania, opis i link. Z Web Unlocker ładowanie to jedno wywołanie API na stronę, tak samo na LinkedIn, Indeed i stronach kariery firm, a Ty zachowujesz potrzebne pola.
Twój skrypt pobiera stronę wyszukiwania portalu pracy, odczytuje na niej karty ofert i przechodzi z każdej karty na stronę oferty, gdy potrzebuje pełnego opisu. Web Unlocker ładuje każdą stronę w prawdziwej przeglądarce z wybranego kraju i zwraca HTML, więc Twój kod tylko parsuje.
Web scraping ofert pracy zaczyna się od wyszukiwania, jakie uruchomiłby użytkownik, czyli stanowiska i miejsca. Wyślij jego adres do Web Unlocker. Strona wyszukiwania LinkedIn zwraca 60 ofert, a strona Indeed 50, każdą z tytułem, firmą, lokalizacją i datą. Kod powyżej robi dokładnie to w Pythonie i Node.js.
Portale i agregatory ofert zbierają ogłoszenia z wielu stron w jednej wyszukiwarce. Agencje rekrutacyjne i zespoły sprzedaży obserwują, kto zatrudnia i na jakie stanowiska. Analitycy śledzą wynagrodzenia i popyt według stanowiska i miasta, a agenci AI do szukania pracy dopasowują ludzi do świeżych ofert. Wszyscy potrzebują tego samego: dzisiejszych stron z ofertami.
Tak. Scrapowanie ofert pracy z LinkedIn działa na publicznych stronach: wyszukiwanie ofert i strony ofert otwierają się bez logowania, pierwsza strona wyszukiwania pokazuje 60 ofert, kolejne po 10, a strona oferty zawiera pełny opis, poziom stanowiska, rodzaj zatrudnienia i liczbę kandydatów. Web Unlocker zwraca je tak, jak widzi je użytkownik.
Nie ma API LinkedIn do ofert pracy ani API wyszukiwania ofert LinkedIn, które pozwalałoby odczytać wyniki wyszukiwania. Job Posting API LinkedIn jest dla partnerów, którzy publikują oferty na LinkedIn, i nie przyjmuje nowych partnerów. Aby odczytać publiczne oferty pracy, scraper ofert ładuje te same strony, które otwiera użytkownik.
Aby scrapować oferty pracy z LinkedIn, wyślij adres wyszukiwania do API scrapera ofert pracy biblioteką requests, podziel stronę na karty ofert i odczytaj z każdej tytuł, firmę, lokalizację i datę. Zakładka Python powyżej to kompletny scraper ofert LinkedIn w Pythonie, przetestowany na działającym API: 60 ofert w jednym żądaniu.
LinkedIn odpowiada błędami na serię żądań z jednego adresu, często po około dziesięciu stronach, więc skrypt na jednym serwerze zatrzymuje się właśnie tam. Web Unlocker ładuje każdą stronę w prawdziwej przeglądarce, z rezydencyjnego IP w kraju, który wybierzesz. Zakładka Node.js przeszła jedno wyszukiwanie do samego końca: 67 stron, 660 ofert.
Strony wyszukiwania LinkedIn, Indeed, Dice, Wellfound, Built In i SimplyHired wróciły w naszych testach, podobnie jak strony kariery na Lever, Ashby, Greenhouse i Workday. Glassdoor i ZipRecruiter nie wracały niezawodnie z adresu w USA, więc ich nie wymieniamy.
Otwórz stronę oferty przez Web Unlocker: linkedin.com/jobs/view/ z identyfikatorem oferty albo stronę oferty na Indeed. Zwraca opis z tytułem, firmą, lokalizacją i datą dodania. Jedna strona na ofertę, 1000 opisów za $0.98.
Tak. Poproś o Markdown, a Web Unlocker zwróci stronę oferty jako tekst, gotowy dla agenta lub Claude. Gologin scraping skill pozwala Claude'owi wywołać go za Ciebie, a MCP & AI Skills zamienia zwykłą prośbę w działający scraper ofert pracy.
Oferty pracy są publikowane po to, by je czytać, a scraper ofert odczytuje publiczne strony, które widzi użytkownik, bez logowania. Zasady różnią się w zależności od kraju i tego, co robisz z danymi, więc sprawdź swoje użycie z tymi zasadami. Web Unlocker zwraca stronę, a to, co zbierasz, zależy od Ciebie.
Poniżej $1 za 1000 stron w API scrapera ofert pracy i tyle samo na każdym portalu. Strona wyszukiwania LinkedIn zawiera 60 ofert, więc 10 000 ofert ze stron wyszukiwania kosztuje 16 centów. Strona, która się nie załaduje, nic nie kosztuje. Plany zaczynają się od $49 miesięcznie za 50 000 żądań.
Tak, na start: Web Unlocker zawiera 1000 darmowych żądań, czyli wystarczająco na 60 000 ofert z LinkedIn ze stron wyszukiwania albo 1000 pełnych opisów ofert. Biblioteki open source do scrapowania ofert też są darmowe, ale proxy dostarczasz sam i sam dbasz o ich działanie.
To zależy od potrzeb. Usługi scrapowania ofert pracy i API z danymi o ofertach pracy, takie jak Apify i Bright Data, sprzedają gotowe wiersze i rozliczają każdą ofertę jako rekord, a darmowe oprogramowanie do scrapowania ofert wymaga własnych proxy. Web Unlocker to API do scrapowania ofert pracy, które zwraca całą stronę w jednej cenie, na każdym portalu, więc to Ty decydujesz, które pola zostawiasz.
JobSpy to darmowa biblioteka Pythona o otwartym kodzie dla LinkedIn, Indeed, Glassdoor i ZipRecruiter. Działa na Twoim własnym komputerze, więc proxy musisz zdobyć i utrzymywać sam, a jej własny opis mówi, że LinkedIn odpowiada błędami na serie zapytań. Web Unlocker zapewnia sieć i zwraca stronę, a płacisz tylko za strony, które wróciły.
Scrapery ofert LinkedIn na Apify zwracają gotowe wiersze i rozliczają każdą ofertę, od $1 za 1000 ofert. Web Unlocker rozlicza stronę: strona wyszukiwania LinkedIn zawiera 60 ofert, więc 10 000 ofert kosztuje 16 centów, a kilka linii kodu, jak w zakładkach powyżej, wycina potrzebne pola.
Opowiedz nam trochę o swoim zespole i otrzymasz: