Отправьте поиск LinkedIn или Indeed, страницу вакансии или страницу карьеры компании. Web Unlocker вернёт её так, как видит посетитель: 60 вакансий LinkedIn или 50 на Indeed по цене одной страницы. Без логина и API сайта вакансий. Не загрузилась страница - не платите.
1000 бесплатных запросов · Оплата только за успех · 195+ стран · Работает с Claude
Сайты вакансий загружаются от 3 до 30 секунд. Всё ещё работаем, нажимать снова не нужно.
Готовы попробовать на своих поисках? Получите API-ключ или запишитесь на демо.
Расскажите немного о вашей команде и получите:
Страница поиска вакансий LinkedIn содержит 60 карточек с названием, компанией, местом и датой публикации, и Web Unlocker берёт за неё как за одну страницу. Парсеры вакансий LinkedIn на Apify и Bright Data считают каждую вакансию отдельной записью, а ScraperAPI берёт 30 кредитов за страницу LinkedIn.
Одна страница, 60 вакансий.
167 страниц, 10 000 вакансий.
Нужно полное описание? Страница каждой вакансии - ещё один запрос, поэтому 1000 описаний обходятся в $0.98. Страница поиска Indeed содержит 50 вакансий по той же цене, как и страница карьеры компании.
Сколько стоят 10 000 вакансий LinkedIn со страниц поиска
167 страниц поиска по 60 вакансий по опубликованным ценам
Готовы запустить на своих поисках? Получите API-ключ и бесплатные запросы.
Сто страниц вакансий запрошены одна за другой, без повторов: поиск LinkedIn в 25 городах, следующие страницы поиска, страницы вакансий с полным описанием, поиск и вакансии Indeed и страницы карьеры компаний на Lever, Ashby, Greenhouse и Workday.
Страница, которая не вернулась, стоит $0.
Вы платите за страницы, а не за попытки.
Оставьте в поиске LinkedIn только последние 24 часа, и каждой вакансии на странице будет не больше суток, а свежие отмечены как Be an early applicant. Ваш скрипт запрашивает эту страницу так часто, как нужно: проверка каждый час - это 24 страницы в день, $0.71 в месяц.
Наборы данных о вакансиях обновляются раз в неделю или раз в месяц.
Ваша страница - по состоянию на этот час.
Парсинг сайтов вакансий без собственного парка браузеров: Web Unlocker возвращает страницу, а карточки вакансий - это обычный HTML, который читается несколькими строками кода. Тот же запрос работает на LinkedIn, Indeed и страницах карьеры.
Заполните форму выше. Ключ придёт на почту в течение одного рабочего дня.
Поиск LinkedIn или Indeed, следующие страницы поиска, страница вакансии для её описания или страница карьеры компании.
Вырежьте из страницы карточки вакансий и оставьте нужные поля: название, компанию, место, дату и ссылку.
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}`);Готовы запустить на своих поисках? Получите API-ключ и бесплатные запросы.
У LinkedIn нет API поиска вакансий для вашего приложения, готовые парсеры вакансий берут плату за каждую вакансию, а бесплатная библиотека для парсинга вакансий оставляет прокси на вас. Вот что нужно на каждом пути для тех же вакансий.
| Что нужно | JobSpy | Apify | Bright Data | |
|---|---|---|---|---|
| Вы платите за | Страницу | Ваши прокси | Каждую вакансию | Каждую запись |
| 10 000 вакансий LinkedIn из поиска | $0.16 | Бесплатно + прокси | $10 | $15 |
| Вакансий в единице оплаты | 60 | Нет | 1 | 1 |
| Страница целиком в HTML или Markdown | Да | Нет | Нет | Нет |
| Работает без своих прокси | Да | Нет | Да | Да |
| Бесплатный старт | 1000 страниц | Бесплатно | $5 в месяц | 5000 записей |
Нужен один сайт вакансий целиком? Смотрите парсер Indeed, а любой другой сайт парсится через Web Unlocker по той же цене.
Один аккаунт, одна прокси-сеть, одна экосистема. Выберите продукт под задачу.
Парсите и другие сайты? Смотрите парсеры Indeed, Google Maps и Reddit или все инструменты для веб-парсинга.
Программа, которая загружает страницы сайтов с вакансиями и достаёт из них объявления как данные: название, компанию, место, зарплату, дату публикации, описание и ссылку. С Web Unlocker загрузка - это один вызов API на страницу, одинаково на LinkedIn, Indeed и страницах карьеры компаний, а нужные поля оставляете вы.
Ваш скрипт запрашивает страницу поиска на сайте вакансий, читает на ней карточки вакансий и, если нужно полное описание, переходит по карточке на страницу вакансии. Web Unlocker загружает каждую страницу в настоящем браузере из выбранной вами страны и возвращает HTML, так что вашему коду остаётся только разобрать его.
Парсинг вакансий начинается с поиска, который запустил бы посетитель: должность и место. Отправьте его адрес в Web Unlocker. Страница поиска LinkedIn возвращает 60 вакансий, а страница Indeed - 50, у каждой название, компания, место и дата. Код выше делает именно это на Python и Node.js.
Сайты и агрегаторы вакансий собирают объявления с многих сайтов в один поиск. Кадровые агентства и отделы продаж следят, кто нанимает и на какие должности. Аналитики отслеживают зарплаты и спрос по должностям и городам, а ИИ-агенты по поиску работы подбирают людям свежие вакансии. Всем нужно одно и то же: страницы вакансий на сегодня.
Да. Парсинг вакансий LinkedIn работает на публичных страницах: поиск вакансий и страницы вакансий открываются без входа, первая страница поиска показывает 60 вакансий, следующие - по 10, а на странице вакансии есть полное описание, уровень должности, тип занятости и число откликов. Web Unlocker возвращает их так, как их видит посетитель.
API вакансий LinkedIn или API поиска вакансий LinkedIn для чтения результатов поиска нет. Job Posting API от LinkedIn предназначен для партнёров, которые публикуют вакансии на LinkedIn, и новых партнёров он не принимает. Чтобы читать публичные вакансии, парсер вакансий загружает те же страницы, которые открывает посетитель.
Чтобы спарсить вакансии с LinkedIn, отправьте адрес поиска в API парсера вакансий через библиотеку requests, разделите страницу на карточки вакансий и прочитайте из каждой название, компанию, место и дату. Вкладка Python выше - готовый парсер вакансий LinkedIn на Python, проверенный на живом API: 60 вакансий одним запросом.
На пачку запросов с одного адреса LinkedIn отвечает ошибками, часто примерно после десятой страницы, поэтому скрипт на одном сервере на этом и встаёт. Web Unlocker загружает каждую страницу в настоящем браузере с резидентного IP в выбранной вами стране. Вкладка Node.js прошла один поиск до конца: 67 страниц, 660 вакансий.
В наших тестах вернулись страницы поиска LinkedIn, Indeed, Dice, Wellfound, Built In и SimplyHired, а также страницы карьеры на Lever, Ashby, Greenhouse и Workday. Glassdoor и ZipRecruiter возвращались ненадёжно с американского адреса, поэтому мы их не указываем.
Откройте страницу вакансии через Web Unlocker: linkedin.com/jobs/view/ и ID вакансии или страницу вакансии Indeed. Он вернёт описание вместе с названием, компанией, местом и датой публикации. Одна страница на вакансию, 1000 описаний за $0.98.
Да. Попросите Markdown, и Web Unlocker вернёт страницу вакансии текстом, готовым для агента или Claude. Gologin scraping skill позволяет Claude вызывать его за вас, а MCP & AI Skills превращает обычную просьбу в работающий парсер вакансий.
Вакансии публикуют, чтобы их читали, а парсер вакансий читает публичные страницы, которые видит посетитель, без входа. Правила различаются по странам и зависят от того, что вы делаете с данными, поэтому сверьте своё использование с ними. Web Unlocker возвращает страницу, а что собирать, решаете вы.
Меньше $1 за 1000 страниц в API парсера вакансий, и одна цена на любом сайте вакансий. На странице поиска LinkedIn 60 вакансий, поэтому 10 000 вакансий со страниц поиска стоят 16 центов. Страница, которая не загрузилась, ничего не стоит. Тарифы начинаются от $49 в месяц за 50 000 запросов.
Да, для старта: с Web Unlocker вы получаете 1000 бесплатных запросов, этого хватит на 60 000 вакансий LinkedIn со страниц поиска или 1000 полных описаний вакансий. Библиотеки для парсинга вакансий с открытым кодом тоже бесплатны, но прокси вы подключаете и поддерживаете сами.
Зависит от задачи. Сервисы парсинга вакансий и API данных о вакансиях вроде Apify и Bright Data продают готовые строки и берут деньги за каждую вакансию как за запись, а бесплатным программам для парсинга нужны ваши собственные прокси. Web Unlocker - API для парсинга вакансий, которое возвращает всю страницу по одной цене на любом сайте вакансий, поэтому поля, которые оставить, выбираете вы.
JobSpy - бесплатная библиотека на Python с открытым кодом для LinkedIn, Indeed, Glassdoor и ZipRecruiter. Она работает на вашем компьютере, поэтому прокси вы ищете и поддерживаете сами, а в её же описании сказано, что на серии запросов LinkedIn отвечает ошибками. Web Unlocker приносит свою сеть и возвращает страницу, а платите вы только за вернувшиеся страницы.
Парсеры вакансий LinkedIn на Apify отдают готовые строки и берут деньги за каждую вакансию, от $1 за 1000 вакансий. Web Unlocker берёт за страницу: на странице поиска LinkedIn 60 вакансий, поэтому 10 000 вакансий стоят 16 центов, а нужные поля вырезают несколько строк кода, как во вкладках выше.
Расскажите немного о вашей команде и получите: