Envoyez une recherche LinkedIn ou Indeed, une offre ou une page carrières : Web Unlocker la renvoie comme un visiteur la voit, avec 60 offres LinkedIn ou 50 sur Indeed pour le prix d'une page. Sans connexion ni API du site. Un échec ne coûte rien.
1 000 requêtes gratuites · Facturé en cas de succès · 195+ pays · Prêt pour Claude
Les sites d'emploi mettent de 3 à 30 secondes à se charger. Le travail continue, inutile de cliquer à nouveau.
Prêt pour vos propres recherches ? Obtenez une clé API ou réservez une démo.
Parlez-nous un peu de votre équipe et recevez :
Une page de recherche d'emploi LinkedIn contient 60 fiches d'offres avec titre, entreprise, lieu et date de publication, et Web Unlocker la facture comme une seule page. Les scrapers d'offres LinkedIn sur Apify et Bright Data facturent chaque offre comme un enregistrement distinct, et ScraperAPI compte 30 crédits pour une page LinkedIn.
Une page, 60 offres.
167 pages, 10 000 offres.
Besoin de la description complète ? La page de chaque offre est une requête de plus : 1 000 descriptions reviennent donc à $0.98. Une page de recherche Indeed contient 50 offres au même prix, tout comme la page carrières d'une entreprise.
Ce que coûtent 10 000 offres LinkedIn issues de pages de recherche
167 pages de recherche de 60 offres, aux prix publiés
Prêt à le lancer sur vos propres recherches ? Obtenez votre clé API et des requêtes gratuites.
Cent pages d'offres demandées l'une après l'autre, sans nouvel essai : recherches LinkedIn dans 25 villes, pages suivantes d'une recherche, pages d'offres avec description complète, recherches et pages d'offres Indeed, et pages carrières d'entreprises sur Lever, Ashby, Greenhouse et Workday.
Une page qui ne revient pas coûte $0.
Vous payez des pages, pas des essais.
Limitez une recherche LinkedIn aux 24 dernières heures et chaque offre de la page date d'un jour au plus, avec la mention Be an early applicant tant qu'elle est récente. Votre script demande cette page aussi souvent que vous voulez : une vérification par heure fait 24 pages par jour, $0.71 par mois.
Les jeux de données d'offres sont mis à jour chaque semaine ou chaque mois.
Votre page est celle de cette heure-ci.
Le scraping de sites d'emploi sans parc de navigateurs à vous : Web Unlocker renvoie la page, et les fiches d'offres sont du HTML simple que quelques lignes de code suffisent à lire. La même requête fonctionne sur LinkedIn, Indeed et les pages carrières.
Remplissez le formulaire ci-dessus. La clé arrive par e-mail sous un jour ouvré.
Une recherche LinkedIn ou Indeed, les pages suivantes d'une recherche, la page d'une offre pour sa description, ou la page carrières d'une entreprise.
Découpez les fiches d'offres dans la page et gardez les champs dont vous avez besoin : titre, entreprise, lieu, date et lien.
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}`);Prêt à le lancer sur vos propres recherches ? Obtenez votre clé API et des requêtes gratuites.
LinkedIn n'a pas d'API de recherche d'offres pour votre application, les scrapers d'offres prêts à l'emploi facturent chaque offre, et une bibliothèque gratuite de scraping d'offres vous laisse gérer les proxys. Voici ce que demande chaque voie pour les mêmes offres.
| Ce que cela demande | JobSpy | Apify | Bright Data | |
|---|---|---|---|---|
| Vous payez | Une page | Vos proxys | Chaque offre | Chaque enregistrement |
| 10 000 offres LinkedIn issues de recherches | $0.16 | Gratuit + proxys | $10 | $15 |
| Offres par unité facturée | 60 | Aucune | 1 | 1 |
| La page entière en HTML ou Markdown | Oui | Non | Non | Non |
| Fonctionne sans vos propres proxys | Oui | Non | Oui | Oui |
| Gratuit pour démarrer | 1 000 pages | Gratuit | $5 par mois | 5 000 enregistrements |
Vous scrapez un seul site d'emploi en profondeur ? Voir le scraper Indeed, ou tout autre site avec Web Unlocker au même prix.
Un compte, un réseau de proxys, un écosystème. Choisissez le produit dont la tâche a besoin.
Vous scrapez aussi d'autres sites ? Voir les scrapers Indeed, Google Maps et Reddit, ou tous les outils de web scraping.
Un programme qui charge les pages des sites d'emploi et en extrait les offres sous forme de données : titre, entreprise, lieu, salaire, date de publication, description et lien. Avec Web Unlocker, le chargement tient en un appel d'API par page, sur LinkedIn, Indeed comme sur les pages carrières des entreprises, et vous gardez les champs dont vous avez besoin.
Votre script demande la page de recherche d'un site d'emploi, lit les fiches d'offres qu'elle contient, et suit chaque fiche jusqu'à la page de l'offre quand il lui faut la description complète. Web Unlocker charge chaque page dans un vrai navigateur depuis le pays de votre choix et renvoie le HTML, donc votre code n'a plus qu'à l'analyser.
Le web scraping d'offres d'emploi commence par la recherche que lancerait un visiteur, un intitulé de poste et un lieu. Envoyez son adresse à Web Unlocker. Une page de recherche LinkedIn renvoie 60 offres et une page Indeed 50, chacune avec titre, entreprise, lieu et date. Le code ci-dessus fait exactement cela en Python et en Node.js.
Les sites d'emploi et les agrégateurs réunissent les offres de nombreux sites dans une seule recherche. Les cabinets de recrutement et les équipes commerciales surveillent qui recrute et pour quels postes. Les analystes suivent les salaires et la demande par métier et par ville, et les agents IA de recherche d'emploi rapprochent les candidats des offres récentes. Tous ont besoin de la même chose : les pages d'offres du jour.
Oui. Le scraping des offres LinkedIn fonctionne sur des pages publiques : la recherche d'emploi et les pages d'offres s'ouvrent sans connexion, la première page de recherche liste 60 offres, les pages suivantes 10 chacune, et la page d'une offre contient la description complète, le niveau hiérarchique, le type de contrat et le nombre de candidats. Web Unlocker les renvoie telles qu'un visiteur les voit.
Il n'existe ni API LinkedIn Jobs ni API de recherche d'emploi LinkedIn pour lire les résultats de recherche d'offres. La Job Posting API de LinkedIn est destinée aux partenaires qui publient des offres sur LinkedIn, et elle n'accepte plus de nouveaux partenaires. Pour lire les offres publiques, un scraper d'offres charge les mêmes pages qu'ouvre un visiteur.
Pour scraper les offres d'emploi de LinkedIn, envoyez l'adresse de la recherche à l'API du scraper d'offres avec la bibliothèque requests, découpez la page en fiches d'offres et lisez le titre, l'entreprise, le lieu et la date de chacune. L'onglet Python ci-dessus est un scraper d'offres LinkedIn complet en Python, testé sur l'API en production : 60 offres en une requête.
LinkedIn répond par des erreurs à une rafale de requêtes venant d'une seule adresse, souvent après une dizaine de pages, donc un script sur un seul serveur s'arrête là. Web Unlocker charge chaque page dans un vrai navigateur, sur une IP résidentielle dans le pays de votre choix. L'onglet Node.js a parcouru une recherche jusqu'au bout : 67 pages, 660 offres.
Les pages de recherche de LinkedIn, Indeed, Dice, Wellfound, Built In et SimplyHired sont revenues lors de nos tests, tout comme les pages carrières sur Lever, Ashby, Greenhouse et Workday. Glassdoor et ZipRecruiter ne sont pas revenus de façon fiable depuis une adresse américaine, donc nous ne les listons pas.
Ouvrez la page de l'offre via Web Unlocker : linkedin.com/jobs/view/ suivi de l'identifiant de l'offre, ou la page de l'offre sur Indeed. Il renvoie la description avec le titre, l'entreprise, le lieu et la date de publication. Une page par offre, 1 000 descriptions pour $0.98.
Oui. Demandez du Markdown et Web Unlocker renvoie la page de l'offre en texte, prête pour un agent ou pour Claude. Le skill de scraping Gologin permet à Claude de l'appeler pour vous, et MCP & AI Skills transforme une simple demande en scraper d'offres qui fonctionne.
Les offres d'emploi sont publiées pour être lues, et un scraper d'offres lit les pages publiques que voit un visiteur, sans connexion. Les règles varient selon les pays et l'usage que vous faites des données : vérifiez votre propre usage au regard de celles-ci. Web Unlocker renvoie la page ; ce que vous collectez relève de vous.
Moins de $1 pour 1 000 pages sur l'API du scraper d'offres, et le même prix sur chaque site d'emploi. Une page de recherche LinkedIn contient 60 offres, donc 10 000 offres issues de pages de recherche coûtent 16 cents. Une page qui ne se charge pas ne coûte rien. Les forfaits démarrent à $49 par mois pour 50 000 requêtes.
Oui, pour commencer : Web Unlocker inclut 1 000 requêtes gratuites, de quoi couvrir 60 000 offres LinkedIn issues de pages de recherche ou 1 000 descriptions complètes d'offres. Les bibliothèques open source de scraping d'offres sont gratuites aussi, et c'est à vous de fournir les proxys et de les maintenir en état de marche.
Cela dépend de votre besoin. Les services de scraping d'offres d'emploi et les API de données d'emploi comme Apify et Bright Data vendent des lignes prêtes à l'emploi et facturent chaque offre comme un enregistrement ; les logiciels gratuits de scraping d'offres demandent vos propres proxys. Web Unlocker est une API de scraping d'offres d'emploi qui renvoie la page entière à un prix unique, sur n'importe quel site, donc vous décidez quels champs garder.
JobSpy est une bibliothèque Python gratuite et open source pour LinkedIn, Indeed, Glassdoor et ZipRecruiter. Elle tourne sur votre propre machine : c'est à vous de trouver les proxys et de les maintenir, et sa propre documentation indique que LinkedIn répond par des erreurs aux rafales de requêtes. Web Unlocker apporte le réseau et renvoie la page, et vous ne payez que les pages qui reviennent.
Les scrapers d'offres LinkedIn sur Apify renvoient des lignes prêtes à l'emploi et facturent chaque offre, à partir de $1 pour 1 000 offres. Web Unlocker facture la page : une page de recherche LinkedIn contient 60 offres, donc 10 000 offres coûtent 16 cents, et quelques lignes de code, comme dans les onglets ci-dessus, en extraient les champs.
Parlez-nous un peu de votre équipe et recevez :