このチュートリアルでは、現代的な求人ポータルサイトであるJOBKOREAの求人情報をスクレイピングする方法を学びます。
以下の内容を扱います:
- – 埋め込まれたNext.jsデータを抽出する手動Pythonスクレイピング
- より安定性と拡張性に優れたソリューションのためのBright Data Web MCP を用いたスクレイピング
- Bright DataのAI Scraper Studioを用いたノーコードスクレイピング
各手法は、このリポジトリで提供されるプロジェクトコードを使用して実装され、低レベルなスクレイピングから完全なエージェント型AI駆動抽出へと段階的に進みます。
前提条件
このチュートリアルを始める前に、以下の環境が整っていることを確認してください:
- Python 3.9以上
- PythonとJSONの基本的な知識
- MCPにアクセス可能なBright Dataアカウント
- Claude Desktopのインストール(ノーコード手法のAIエージェントとして使用)
プロジェクト設定
プロジェクトリポジトリをクローンし、依存関係をインストール:
python -m venv venv
source venv/bin/activate # macOS / Linux
venvScriptsactivate # Windows
pip install -r requirements.txt
プロジェクト構造
リポジトリは各スクレイピング手法が理解しやすいように構成されています:
jobkorea_scraper/
│
├── manual_scraper.py # 手動Pythonスクレイピング
├── mcp_scraper.py # Bright Data Web MCPスクレイピング
├── parsers/
│ └── jobkorea.py # 共有パースロジック
├── schemas.py # 求人データスキーマ
├── requirements.txt
├── README.md
各スクリプトは、探索したい方法に応じて独立して実行できます。
手法1: 手動Pythonスクレイピング
最も基本的なアプローチから始めます:ブラウザ、MCP、AIエージェントを使用せず、プレーンなPythonでJOBKOREAをスクレイピングします。
この手法は、JOBKOREAがデータを配信する仕組みを理解したり、より堅牢なソリューションに移行する前にスクレイパーを素早くプロトタイプ化したりするのに役立ちます。
ページの取得
manual_scraper.py を開きます。
スクレイパーはまず、requests を使用して標準的な HTTP リクエストを送信します。即座にブロックされないよう、ブラウザ風のヘッダーを含めます。
headers = {
"User-Agent": "Mozilla/5.0 (...)",
"Accept": "text/html,application/xhtml+xml,*/*",
"Accept-Language": "en-US,en;q=0.9,ko;q=0.8",
"Referer": "https://www.jobkorea.co.kr/"
}
目的は、リクエストを通常のウェブトラフィックのように見せかけることです。その後、ページを取得し、韓国語テキストの問題を回避するためにUTF-8エンコーディングを強制します:
response = requests.get(url, headers=headers, timeout=20)
response.raise_for_status()
response.encoding = "utf-8"
html = response.text
デバッグ用に生のHTMLをローカルに保存します:
with open("debug.html", "w", encoding="utf-8") as f:
f.write(html)
サイトが変更されパースが突然機能しなくなった際に、このファイルは非常に有用です。
レスポンスのパース
HTMLがダウンロードされると、共有パース関数に渡されます:
jobs = parse_job_list(html)
この関数はparsers/jobkorea.pyに存在し、JOBKOREA固有のロジックを全て含みます。
従来のHTMLパースの試行
parse_job_list内部では、まずJOBKOREAが従来のサーバーレンダリングサイトであるかのように、BeautifulSoupを使用して求人リストの抽出を試みます。
soup = BeautifulSoup(html, "html.parser")
job_lists = soup.find_all("div", class_="list-default")
リストが見つからない場合、二次的なセレクタを試行します:
job_lists = soup.find_all("ul", class_="clear")
これが成功すると、スクレイパーは以下のようなフィールドを抽出します:
- 職種名
- 会社名
- 勤務地
- 掲載日
- 求人リンク
ただし、この方法はJOBKOREAが意味のあるHTML要素を公開している場合にのみ有効であり、常にそうとは限りません。
フォールバック:Next.jsハイドレーションデータの抽出
HTMLパースで求人が見つからない場合、スクレイパーは埋め込まれたNext.jsハイドレーションデータを対象とするフォールバック戦略に切り替わります。
nextjs_jobs = parse_nextjs_data(html)
この関数は、クライアントサイドレンダリング中に挿入されたJSON文字列をページ内でスキャンします。マッチングロジックの簡略版は以下のようになります:
pattern = r'\"id\":\"(?P<id>d+)\",\"title\":\"(?P<title>.*?)\",\"postingCompanyName\":\"(?P<company>.*?)\"'
このデータから求人掲載URLを再構築します:
link = f"https://www.jobkorea.co.kr/Recruit/GI_Read/{job_id}"
このフォールバックにより、ブラウザを起動せずにスクレイパーを動作させることが可能になります。
結果の保存
各求人情報は共有スキーマで検証され、ディスクに書き込まれます:
with open("jobs.json", "w", encoding="utf-8") as f:
json.dump(
[job.model_dump() for job in jobs],
f,
ensure_ascii=False,
indent=2
)
スクレイパーは以下のように実行します:
python manual_scraper.py "https://www.jobkorea.co.kr/Search/?stext=python"
これで抽出された求人情報が含まれたjobs.jsonファイルが作成されます。

この手法が最適な場合
手動スクレイピングは、サイトの仕組みを調査したり、迅速なプロトタイプを構築したりする際に有用です。高速でシンプルであり、外部サービスに依存しません。
ただし、この手法はJOBKOREAの現在のページ構造に強く依存しています。特定のHTMLレイアウトや埋め込みハイドレーションパターンに依存するため、サイトが変更されると機能しなくなる可能性があります。
より安定した長期的なスクレイピングには、レンダリングやサイト変更を自動処理するツールに依存するのが望ましいです。まさに次にBright Data Web MCPを使用して行う手法です。
手法2:Bright Data Web MCPを用いたスクレイピング
前のセクションでは、HTMLを手動でダウンロードし埋め込まれたデータを抽出することでJOBKOREAをスクレイピングしました。この手法は機能しますが、サイトの現在の構造に強く依存しています。
この手法では、Bright Data Web MCPでページ取得とレンダリングを処理します。その後、返されたコンテンツを構造化された求人データに変換することにのみ集中します。
この手法はmcp_scraper.pyで実装されています。
Bright Data APIキー/トークンの取得
- Bright Dataダッシュボードにログイン

- 左サイドバーから設定を開く
- 「ユーザーとAPIキー」に移動
- APIキーをコピー
このチュートリアルの後半では、スクリーンショットでこのページの位置とトークンの表示箇所を正確に示します。
プロジェクトルートに.envファイルを作成し、以下を追加してください:
BRIGHT_DATA_API_TOKEN=ここに_あなたの_トークン_を入力
スクリプトは実行時にトークンを読み込み、欠落している場合は早期に停止します。
MCPの要件
Bright Data Web MCPはnpxを使用してローカルで起動されるため、以下の環境が整っていることを確認してください:
- Node.js がインストールされている
- npxがPATH環境変数に設定されていること
MCPサーバーはPythonから以下で起動します:
server_params = StdioServerParameters( command="npx", args=["-y", "@brightdata/mcp"], env={"API_TOKEN": BRIGHT_DATA_API_TOKEN, **os.environ} )
MCPスクレイパーの実行
JOBKOREAの検索URLでスクリプトを実行:
python mcp_scraper.py "https://www.jobkorea.co.kr/Search/?stext=python"
スクリプトはMCPセッションを開き、接続を初期化します:
async with stdio_client(server_params) as (read, write):
async with ClientSession(read, write) as session:
await session.initialize()
接続が確立されると、スクレイパーはコンテンツ取得の準備が整います。
MCPによるページ取得
このプロジェクトでは、スクレイパーはMCPツールscrape_as_markdownを使用します:
result = await session.call_tool(
"scrape_as_markdown",
arguments={"url": url}
)
返されたコンテンツは収集され、ローカルに保存されます:
with open("scraped_data.md", "w", encoding="utf-8") as f:
f.write(content_text)
これにより、MCPが返した内容を可読性の高いスナップショットとして取得でき、デバッグやパースに役立ちます。
Markdownからのジョブパース
MCPが返したマークダウンは、構造化されたジョブデータに変換されます。
パースロジックはマークダウンリンクを検索します:
link_pattern = re.compile(r"[(.*?)]((.*?))")
求人投稿は、以下のURLで識別されます:
if "Recruit/GI_Read" in url:
求人リンクが見つかった場合、その前後の行から企業名、勤務地、掲載日を抽出します。
最後に結果をディスクに書き込みます:
with open("jobs_mcp.json", "w", encoding="utf-8") as f:
json.dump(
[job.model_dump() for job in jobs],
f,
ensure_ascii=False,
indent=2
)
出力ファイル
スクリプト終了後、以下のファイルが生成されます:
scraped_data.md
Bright Data Web MCPから返された生のマークダウン
jobs_mcp.json
構造化されたJSON形式でパースされた求人リスト
このアプローチが最適な場合
Pythonから直接Bright Data Web MCPを使用することは、信頼性と再現性を兼ね備えたスクレイパーを必要とする場合に適しています。
MCPがレンダリング、ネットワーク通信、基本的なサイト防御を処理するため、この手法は手動スクレイピングよりもレイアウト変更の影響を受けにくいです。同時に、ロジックをPythonで保持することで、自動化、スケジュール設定、大規模なデータパイプラインへの統合が容易になります。
この手法は、長期にわたる一貫した結果が必要な場合や、複数の検索結果ページやキーワードをスクレイピングする場合に効果的です。また、AI駆動のワークフローへの完全移行を必要とせず、手動スクレイピングからの明確なアップグレードパスを提供します。
次に、3つ目の手法に移ります。ここでは、スクレイピングコードを一切記述せずに、Bright Data Web MCPに接続されたAIエージェントであるClaude Desktopを使用してJOBKOREAをスクレイピングします。
手法3:Bright Data IDEを用いたAI生成スクレイピングコード
この最終手法では、Web Scraping IDE内のBright Data AI支援スクレイパーを用いてスクレイピングコードを生成します。
スクレイピングロジックを一から手動で記述する必要はありません。代わりに、目的を記述すると、IDEがスクレイパーの生成と調整を支援します。
スクレイパーIDEの起動
Bright Dataダッシュボードから:
左サイドバーから「データを開く」を選択
- 「マイスクレイパー」をクリック

- 右上の「新規」を選択
- 「独自のWebスクレイパーを開発」を選択

これによりJavaScript統合開発環境(IDE)が開きます
対象URL「https://www.jobkorea.co.kr/Search/」を入力し「コードを生成」をクリック
IDEがリクエストを処理し、すぐに使えるコードテンプレートを生成します。準備が整うとメール通知が届きます。その後、必要に応じてコードを編集または実行できます。
3つのスクレイピング手法の比較
このプロジェクトの各手法は同じ問題を解決しますが、異なるワークフローに適しています。下表に実用的な違いをまとめました。
| 手法 | 設定の労力 | 信頼性 | 自動化 | 実行環境 | 最適な使用例 |
|---|---|---|---|---|---|
| 手動Pythonスクレイピング | 低 | 低~中 | 限定的 | ローカルマシン | 学習、簡易実験 |
| Bright Data MCP (Python) | 中 | 高 | 高 | ローカル + Bright Data | 本番環境でのスクレイピング、スケジュールされたジョブ |
| AI生成スクレイパー(Bright Data IDE) | 低 | 高 | 高 | Bright Dataプラットフォーム | 迅速なセットアップ、再利用可能なマネージドスクレイパー |
まとめ
このチュートリアルでは、JOBKOREAをスクレイピングする3つの異なる方法を取り上げました:手動Pythonスクレイピング、より安定したBright Data Web MCPベースのワークフロー、そしてノーコードアプローチのためのBright DataのAI Scraper Studioの使用です。
各手法は前の手法を基盤としています。手動スクレイピングはサイトの仕組み理解に役立ち、MCPベースのスクレイピングは信頼性と自動化を提供し、AIエージェントアプローチは最小限の設定で構造化データへの最速の道筋を提供します。
JOBKOREAのような現代的なクライアントサイドレンダリングサイトからスクレイピングを行い、脆弱なセレクターやブラウザ自動化に代わる信頼性の高い代替手段が必要な場合、Bright Data Web MCPは従来のスクリプトとAI駆動ワークフローの両方に対応する強固な基盤を提供します。