LinkedInやIndeedの検索、求人ページ、採用ページを送ると、Web Unlockerが訪問者に見えるとおりのページを返します。LinkedInなら求人60件、Indeedなら50件で、課金は1ページ分です。ログインも求人サイトのAPIも不要。読み込みに失敗したページは無料です。
無料リクエスト1,000件 · 課金は成功時のみ · 195以上の国 · Claude対応
チームについて簡単にご記入いただくと、次の内容をお届けします。
LinkedInの求人検索ページには、タイトル、会社、場所、掲載日付きの求人カードが60件載っており、Web Unlockerは1ページとして課金します。ApifyやBright DataのLinkedIn求人スクレイパーは求人を1件ずつ別のレコードとして課金し、ScraperAPIはLinkedInの1ページに30クレジットを課金します。
1ページで求人60件。
167ページで求人10,000件。
説明の全文が必要ですか?求人ごとのページはリクエスト1回分なので、説明1,000件で$0.98です。Indeedの検索ページには求人が50件載り、料金は同じです。企業の採用ページも同じ料金です。
検索ページから取得するLinkedIn求人10,000件の料金
求人60件の検索ページ167件、公開価格で
ご自身の検索で実行しますか?APIキーと無料リクエストを入手しましょう。
求人ページを100件、再試行なしで続けて取得しました。25都市のLinkedIn検索、検索の2ページ目以降、説明の全文付きの求人ページ、Indeedの検索と求人ページ、Lever、Ashby、Greenhouse、Workdayの企業の採用ページです。
返ってこなかったページは$0。
課金されるのはページで、試行回数ではありません。
LinkedInの検索を直近24時間に絞ると、ページ上の求人はすべて掲載から1日以内のもので、新しいうちは「Be an early applicant」と表示されます。スクリプトからそのページを好きな頻度で取得でき、1時間ごとのチェックなら1日24ページ、月$0.71です。
求人データセットの更新は週1回か月1回。
あなたのページは、この1時間のものです。
自前のブラウザ環境を用意せずに求人サイトをスクレイピングできます。Web Unlockerがページを返し、求人カードは数行のコードで読み取れる普通のHTMLです。同じリクエストがLinkedIn、Indeed、採用ページで使えます。
上のフォームにご記入ください。キーは1営業日以内にメールで届きます。
LinkedInまたはIndeedの検索、検索の2ページ目以降、説明を読むための求人ごとのページ、または企業の採用ページ。
ページから求人カードを切り出し、タイトル、会社、場所、日付、リンクなど、必要な項目を残します。
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 | |
|---|---|---|---|---|
| 課金の対象 | 1ページ | ご自身のプロキシ | 求人ごと | レコードごと |
| 検索から取得するLinkedIn求人10,000件 | $0.16 | 無料 + プロキシ | $10 | $15 |
| 課金単位あたりの求人数 | 60 | なし | 1 | 1 |
| ページ全体をHTMLまたはMarkdownで | あり | なし | なし | なし |
| 自前のプロキシなしで動作 | あり | なし | あり | あり |
| 無料で開始 | 1,000ページ | 無料 | 月$5 | 5,000レコード |
1つの求人サイトを深くスクレイピングしますか?Indeedスクレイパーをご覧ください。ほかのどのサイトも、Web Unlockerなら同じ料金で取得できます。
1つのアカウント、1つのプロキシネットワーク、1つのエコシステム。用途に合った製品をお選びください。
ほかのサイトもスクレイピングしますか?Indeed、Google Maps、Redditのスクレイパー、またはすべてのWebスクレイピングツールをご覧ください。
求人サイトのページを読み込み、求人をデータとして取り出すプログラムです。タイトル、会社、場所、給与、掲載日、説明、リンクが対象です。Web Unlockerなら、読み込みはLinkedIn、Indeed、企業の採用ページのどれでも1ページにつきAPIコール1回で、必要な項目だけを残せます。
スクリプトが求人サイトの検索ページを取得してそこに載った求人カードを読み取り、説明の全文が必要なときは各カードから求人ごとのページをたどります。Web Unlockerは選んだ国から本物のブラウザで各ページを読み込んでHTMLを返すので、コードは解析だけを担当します。
求人情報のWebスクレイピングは、訪問者が実行するのと同じ検索、つまり職種と場所から始まります。そのアドレスをWeb Unlockerに送ります。LinkedInの検索ページは求人60件、Indeedのページは50件を返し、それぞれにタイトル、会社、場所、日付が付いています。上のコードがPythonとNode.jsでまさにその処理をします。
求人サイトやアグリゲーターは、多くのサイトの求人を1つの検索にまとめます。人材紹介会社や営業チームは、どの企業がどんな職種を募集しているかを追います。アナリストは職種や都市ごとの給与と需要を追い、求人向けのAIエージェントは新しい求人と人をマッチングします。どれも必要なのは同じ、今日の求人ページです。
はい。LinkedInの求人スクレイピングは公開ページで行えます。求人検索と求人ページはログインなしで開け、検索の1ページ目には求人60件、その後のページには10件ずつ載り、求人ページには説明の全文、役職レベル、雇用形態、応募者数が載っています。Web Unlockerは訪問者が見るとおりにそれらを返します。
求人検索の結果を読み取るためのLinkedIn求人APIもLinkedIn求人検索APIもありません。LinkedInのJob Posting APIはLinkedInに求人を掲載する提携先向けで、新しい提携先は受け付けていません。公開されている求人情報を読み取るには、求人スクレイパーが訪問者と同じページを読み込みます。
LinkedInから求人をスクレイピングするには、requestsライブラリで検索アドレスを求人スクレイパーAPIに送り、ページを求人カードごとに分けて、それぞれからタイトル、会社、場所、日付を読み取ります。上のPythonタブは実際のAPIでテスト済みの、Pythonで書かれた完全なLinkedIn求人スクレイパーで、1回のリクエストで求人60件を取得できます。
LinkedInは1つのアドレスからの短時間の大量リクエストにエラーを返し、多くの場合10ページほどでそうなるため、1台のサーバーで動くスクリプトはそこで止まります。Web Unlockerは、選んだ国のレジデンシャルIPから本物のブラウザで各ページを読み込みます。上のNode.jsタブは1つの検索を最後までたどり、67ページから求人660件を取得しました。
テストでは、LinkedIn、Indeed、Dice、Wellfound、Built In、SimplyHiredの検索ページが返り、Lever、Ashby、Greenhouse、Workdayの採用ページも返りました。GlassdoorとZipRecruiterは米国のアドレスから安定して返らなかったため、対象に含めていません。
求人ごとのページをWeb Unlockerで開きます。linkedin.com/jobs/view/に求人IDを続けたアドレスか、Indeedの求人ページです。タイトル、会社、場所、掲載日とともに説明が返ります。求人1件につき1ページで、説明1,000件が$0.98です。
はい。Markdownを指定すると、Web Unlockerは求人ページをテキストで返すので、そのままエージェントやClaudeに渡せます。Gologin scraping skillを使えばClaudeが代わりにWeb Unlockerを呼び出し、MCP & AI Skillsなら普通の依頼文から動く求人スクレイパーができあがります。
求人情報は読まれるために公開されており、求人スクレイパーはログインなしで、訪問者が見る公開ページを読み取ります。ルールは国やデータの使い方によって異なるため、ご自身の利用に照らして確認してください。Web Unlockerが返すのはページまでで、何を収集するかはお客様の判断です。
求人スクレイパーAPIは1,000ページあたり$1未満で、どの求人サイトでも同じ料金です。LinkedInの検索ページには求人60件が載るため、検索ページから求人10,000件を取得して16セントです。読み込みに失敗したページは無料です。プランは50,000リクエストで月$49からです。
はい、まずは無料で試せます。Web Unlockerには1,000件の無料リクエストが付き、検索ページからLinkedIn求人60,000件、または求人の説明の全文1,000件に相当します。オープンソースの求人スクレイパーライブラリも無料ですが、プロキシはご自身で用意し、動く状態を保つ必要があります。
目的によります。ApifyやBright Dataなどの求人スクレイピングサービスや求人データAPIは整形済みのデータを提供し、求人ごとにレコードとして課金します。無料の求人スクレイピングソフトウェアには自前のプロキシが必要です。Web Unlockerは、どの求人サイトでもページ全体を1つの料金で返す求人スクレイピングAPIなので、残す項目はご自身で決められます。
JobSpyはLinkedIn、Indeed、Glassdoor、ZipRecruiterに対応した無料のオープンソースPythonライブラリです。ご自身のマシンで動くため、プロキシの用意と維持はご自身で行う必要があり、公式の説明でもLinkedInは短時間の大量リクエストにエラーを返すとされています。Web Unlockerはネットワークを含めてページを返し、料金は返ってきたページの分だけです。
ApifyのLinkedIn求人スクレイパーは整形済みのデータを返し、求人ごとに課金します。料金は求人1,000件あたり$1からです。Web Unlockerはページ単位で課金します。LinkedInの検索ページには求人60件が載るため、求人10,000件で16セントです。項目の切り出しは、上のタブのような数行のコードで行えます。
チームについて簡単にご記入いただくと、次の内容をお届けします。