Tony Wang6 分で読めますUpwork のスクレイピング方法 2026年版(API と Python)
2026年に Upwork の求人投稿・予算・フリーランサープロフィールをスクレイピングする方法 — 公式 API が承認制である理由と、API を使った構造化された代替手段。
Upwork のフリーランス求人フィードとフリーランサープロフィールは公開ウェブページですが、大量に取得するのはオープンな API を呼び出すほど単純ではありません。Upwork は公式の OAuth ベースの API を運用していますが、これは承認制です — 申請すると Upwork がアカウントに対してリクエストを審査し、通常のレビュー期間はおよそ 1 週間です。本ガイドでは、そのプロセスが実際に何を伴うのか、なぜ DIY スクレイピングが Upwork のアンチボット体制の前で破綻するのか、そして代わりに構造化 API を使って求人検索・求人詳細・フリーランサープロフィールのデータを取得する方法を解説します。
なぜ Upwork のデータをスクレイピングするのか
- フリーランス市場の相場調査 — 公開されている求人投稿全体から、スキル・カテゴリ・経験レベル別に時給・固定報酬の相場を追跡します。
- ギグエコノミーの分析 — 特定のスキル(Python、デザイン、コピーライティングなど)の投稿量と需要トレンドを時系列で測定します。
- 競合・エージェンシーのモニタリング — 競合するエージェンシーやトップフリーランサーがどんな報酬・条件で仕事を獲得しているかを把握します。
- AI / LLM パイプライン — 正規化されたフリーランス市場データを、仕事の値付けや案件とタレントのマッチングを行うモデルに投入します。
- タレントソーシング — Upwork 自身の検索 UI に頼らずに、スキルと実績でフリーランサーを見つけ、アウトバウンド採用の候補とします。
Upwork をスクレイピングするのは合法か
選択肢 1: Python での自作(そしてなぜ破綻するか)
求人ページやプロフィールを 1 件だけ手動で取得するのは簡単です。
import requests
from bs4 import BeautifulSoup
resp = requests.get(
"https://www.upwork.com/freelance-jobs/apply/Python-full-stack-developer_~022085006288356888767/",
headers={"User-Agent": "Mozilla/5.0"},
)
soup = BeautifulSoup(resp.text, "html.parser")
title = soup.select_one("h1")
これは正確に 1 回だけ動作し、その後急速に破綻します。
- 重いクライアントサイドレンダリング。 求人ページとプロフィールページは JavaScript を通じてハイドレーションされるため、素の
requests呼び出しは、本来欲しい予算・クライアント履歴・フィードバックデータを欠いたシェルだけを返すことがよくあります — レンダリング済みの DOM を取得するにはヘッドレスブラウザが必要です。 - ボット検知とレート制限。 Upwork は人間以外のトラフィックに対して積極的に防御しており、同一 IP からの繰り返し・高速なリクエストはスロットリングされたりブロックされたりします。Upwork 自身のボットポリシーは、承認されたユースケース以外の一括収集について「API キーがあっても」これが適用されるとしています。
- 検索にはセッション状態が必要。 求人検索フィードはフィルター・ページングトークン・クライアントサイドアプリが設定するクッキーに依存しており、これを再現するには予告なく変わるインターフェースをリバースエンジニアリングする必要があります。
- ログインなしでは、制限付きフィールドへの信頼できるアクセスができない。 一部のクライアントサイドの詳細(完全な連絡履歴、招待制の求人)は認証済みセッションの背後にあり、ボットでログインするのはアカウントを危険にさらします。
選択肢 2: ノーコード / 既製ツール
汎用のポイント&クリック型スクレイパーは、個々の Upwork の求人ページやプロフィールページを取得できますが、DIY スクリプトと同じ JavaScript レンダリングとレート制限の壁にぶつかります — ビジュアルスクレイパーも結局はヘッドレスレンダリングとボット検知を解決しなければならず、単にそのコードを隠しているだけです。数ページを超える規模になると、マークアップと防御を頻繁に変更するサイトに対して汎用ツールを設定し続けるより、レンダリングと正規化をすでに処理しているメンテナンス済みバックエンドの方が壊れにくくなります。
選択肢 3: 構造化された Upwork API
Crawlora の Upwork API は、求人検索・求人詳細・フリーランサープロフィールページを 3 つのエンドポイントでラップし、正規化された JSON を返します — あなたの側でブラウザ自動化やセッション管理は不要です。
キーワードでフリーランス求人を検索します。
curl "https://api.crawlora.net/api/v1/upwork/search?q=python%20developer&page=1" \
-H "x-api-key: $CRAWLORA_API_KEY"
import requests
h = {"x-api-key": "YOUR_API_KEY"}
base = "https://api.crawlora.net/api/v1/upwork"
search = requests.get(f"{base}/search", headers=h, params={"q": "python developer", "page": 1}).json()["data"]
for job in search["jobs"]:
print(job["title"], job.get("budget_text"))
レスポンスの形(実例)。
{
"code": 200,
"msg": "OK",
"data": {
"query": "python developer",
"page": 1,
"jobs": [
{
"id": "2085006288356888767",
"title": "Python full stack developer, python automation",
"url": "https://www.upwork.com/jobs/span-class-highlight-Python-span-full-stack-developer_~022085006288356888767/",
"posted_at": "Posted 2 days ago",
"budget_type": "hourly",
"budget_text": "Hourly: $60.00 - $75.00",
"experience_level": "Expert",
"duration": "1 to 3 months, 30+ hrs/week",
"skills": ["Python", "Django", "Flask"]
}
]
}
}
id を指定して、ある求人の完全な詳細を取得します。
job = requests.get(f"{base}/job/022085006288356888767", headers=h).json()["data"]
print(job["hourly_min"], job["hourly_max"], job["client"]["total_spent"])
これは予算レンジと、クライアント履歴(登録日、総支出額、雇用件数、業界、企業規模)、応募数、応募者の国など — Upwork 自身の求人ページには表示されるが検索結果には出てこないフィールドを返します。
id を指定してフリーランサープロフィールを調べます。
freelancer = requests.get(f"{base}/freelancer/0157e03059a690281f", headers=h).json()["data"]
print(freelancer["hourly_rate"], freelancer["job_success_score"], freelancer["total_jobs"])
これは時給、Job Success Score、評価、レビュー数、総案件数と作業時間、直近のフィードバック項目を返します。
収集できるもの
- 求人投稿 — タイトル、説明、投稿日、予算タイプとレンジ、経験レベル、期間、プロジェクトタイプ、応募数、必要なスキル。
- クライアントのシグナル — 各求人に紐づく、登録日、国、総支出額、雇用件数、契約時間数、業界、企業規模。
- フリーランサープロフィール — 名前、肩書き、時給、認証状態、概要、評価、レビュー数、Job Success Score、所在地、総案件数と作業時間、日付と評価付きの直近のフィードバック。
制約
- 公開データのみ。 これは公開されている求人ページとプロフィールページに表示されている情報をカバーします — ログインが必要なメッセージング、招待制の求人、連絡先情報は含まれません。
- クロール対象ではなく id ベース。 求人・フリーランサーの各エンドポイントは特定の id を受け取ります。まず検索で id を見つけ、必要なものについて詳細を取得してください。
- 検索結果のフィールドは求人詳細より少ない。 検索エンドポイントはサマリー(タイトル、予算のテキスト、スキル)を返します。クライアント履歴や正確な予算金額が必要な場合は求人詳細エンドポイントを呼び出してください。
- リアルタイムの入札データではなく、フリーランス市場のスナップショット。 応募数や報酬額は取得時点のページを反映しており、Upwork は公開ページを通じてリアルタイムの入札単位のデータを公開していません。
どこで使われるか
- フリーランス報酬のベンチマーキング — スキルカテゴリ別に時給・固定報酬を集計し、自分やクライアントの仕事に値付けをします。
- ギグエコノミーの市場調査 — スキル別の投稿量と需要を時系列で追跡します。
- タレントソーシングのパイプライン — アウトリーチ前に、Job Success Score・評価・実績でフリーランサープロフィールをスクリーニングします。
- AI / LLM のトレーニングとマッチング用データ — フリーランスの仕事を値付けしたり案件とタレントをマッチングしたりするモデル向けの、正規化された求人・スキルデータ。
出典
収集を始める
まず無料で試す: Free Web Scraper で任意の公開 URL を実行するか、Anti-Bot Checker でサイトがボットをブロックしているかどうかを確認できます — サインアップは不要です。
Playground で検索・求人・フリーランサーの各エンドポイントをテストし、API ドキュメントでスキーマを確認し、料金を確認してください。Upwork は、求人情報のスクレイピング方法で扱ったジョブボードのギグワーク版にあたります — 同じスキルについて従来型の採用とフリーランス需要の両方を追跡しているなら、この 2 つを組み合わせてください。より幅広いタレントソーシングのパイプラインを構築しているなら、GitHub のスクレイピング方法は公開されている活動やリポジトリから開発者を見つける方法を、Indeed のスクレイピング方法は従来型のジョブボード側を扱っています。このすべての背後にある法的な枠組みについては、ウェブスクレイピングは合法かを参照してください。
よくある質問
Upwork には公式の公開 API がありますか?
はい。Upwork は developer.upwork.com で文書化された OAuth 2.0 API を運用していますが、セルフサーブではありません — API Center でクライアント認証情報をリクエストすると、Upwork が検証済みアカウントに対してその申請を審査し、レビューには通常およそ 1 週間かかります。
Upwork の求人投稿やフリーランサープロフィールをスクレイピングするのは合法ですか?
求人投稿と公開フリーランサープロフィールはログインなしで閲覧できますが、Upwork の Trust & Safety ポリシーはボットを幅広く定義しており、承認されたユースケース以外では、API キーがあっても求人フィードやプロフィールの一括収集は認められていないとしています。これは法的助言ではありません — 自分のユースケースについては Upwork の利用規約を確認し、弁護士に相談してください。
API キーなしで Upwork をスクレイピングできますか?
技術的にはページは公開されていますが、Upwork は人間以外のトラフィックパターンを積極的に検知・ブロックしており、そのボットポリシーは API キーの有無にかかわらず適用されます。DIY スクレイパーはクライアントサイドレンダリングとセッションベースの検索も解決する必要があり、頻繁に壊れます。
Upwork の求人投稿からどんなデータを取得できますか?
タイトル、説明、投稿日、予算タイプとレンジ、経験レベル、プロジェクト期間、応募数、必要なスキル、そして登録日・総支出額・雇用件数・業界・企業規模などのクライアントのシグナルです。
Upwork のフリーランサープロフィールからどんなデータを取得できますか?
名前、肩書き、時給、認証状態、概要、評価、レビュー数、Job Success Score、所在地、総案件数と作業時間、日付と評価付きの直近のフィードバック項目です。
Upwork の API 承認プロセスにはどのくらい時間がかかりますか?
Upwork 自身のサポート文書によると、API Center で申請を提出してからのレビューは通常およそ 1 週間かかり、却下の大半はユースケース自体ではなく、アカウント情報が不足していたり未検証だったりすることに起因します。
構造化された Upwork API は、Upwork 自身の公式 API とどう違いますか?
Crawlora のような構造化されたサードパーティ API は、Upwork のアカウント検証・承認プロセスを経ることなく、求人検索・求人詳細・フリーランサープロフィールページの正規化された JSON を返します — 直接プラットフォームアクセスを申請せずに公開の求人データやプロフィールデータが必要な場合に有用です。