はじめに
Webスクレイピングで一番時間がかかる作業は、実はコーディングではありません。
robots.txt を確認して、HTML構造を調べて、JavaScriptで動いているかどうかを判断して、ページネーションの方式を特定して、bot対策の有無を調べて……。コードを1行も書く前の「前調査」に、慣れていても30分〜1時間、慣れていなければ半日以上かかることがあります。
そしてようやく調査が終わって書いたコードが、500エラーで一切動かない。原因は「Cookieが必要なサイトだった」という、調査で気づけたはずのことだったりします。
この記事では、AIエージェント「CoWork」にスクレイピングの前調査から実装までのノウハウや手順をskillsとして詰め込み、対象サイトのスクレイピングを丸投げした実録を公開します。対象サイトは国内最大級の企業データプラットフォーム BIZMAPS(biz-maps.com)。200万社以上の企業情報が無料で検索できるサイトです。
結果として:
- サイト調査 → 5分以内
- 業種IDリスト647件の収集 → 自動
- 企業一覧133件の取得 → ページネーション含め全自動
- 汎用Pythonスクリプト(引数でカテゴリを切り替え可) → 自動生成
※ 上記の作業時間はCoWorkの基本的な操作に慣れていることを前提にした目安です。初回はCoWorkのインストールやSKILLファイルの配置に別途10〜15分ほどかかる場合があります。
このすべての工程を再現可能にする SKILL.md を販売します。
CoWorkとは何か
CoWork は Anthropic が提供するデスクトップ向けAIエージェントです。Anthropic公式サイトからClaudeのデスクトップアプリをインストールすることで利用できます。チャットに指示を入力するだけで、Pythonコードの実行・ファイルの作成・Webスクレイピング・Excelへの出力まで、一連の作業を自律的にこなしてくれます。
従来のAI(ChatGPTやCopilot)との最大の違いは、「提案」ではなく「実行」する点です。
| 従来のAI | CoWork |
|---|---|
| コードを提案する → 自分でコピペして実行 | コードを書いて自分で実行し、結果を返す |
| エラーが出たら自分でデバッグ | エラーを自分で検知してリトライ |
| ファイル操作は手動 | Excelファイルの生成・保存まで自動 |
そしてCoWorkには SKILL という仕組みがあります。これが今回の記事の核心です。SKILLはMarkdownファイル(SKILL.md)をCoWorkの所定フォルダに置くだけで有効になり、以降は指示を入力するだけで自動的に読み込まれます。
このSKILLはどうやって作られたか
CoWorkのSKILLとは、AIに渡す「業務マニュアル」のようなものです。Markdownファイル(SKILL.md)に「このタスクではどういう手順で考え、どんなコードを書き、どう判断するか」を記述しておくと、CoWorkはそれを読んで行動指針にします。
今回公開するSKILL(web-scraping)は、これまでスクレイピング案件を通じてChatGPTで蓄積してきたノウハウを体系化したものです。
ノウハウの源泉:実案件の積み重ね
このSKILLのベースになっているのは、受託で対応してきた複数のスクレイピング案件です。クライアントから「このサイトのデータを取ってほしい」という依頼を受け、ChatGPTと対話しながらコードを書き、失敗して、修正して、を繰り返してきました。
2023年頃から受けてきた依頼は、ジャンルもサイトも多岐にわたります。
ECサイト:amazon.co.jp rakuten.co.jp yahoo.co.jp/shopping buyma.com mercari.com yoox.com moncler.com ebay.com など
ECは最もbot対策が厳しいジャンルです。Amazonは独自のフィンガープリント検出があり、通常のrequestsではすぐにブロックされます。楽天・Yahoo!ショッピングはページが深くなるほどJavaScriptレンダリングへの依存が増します。Seleniumを使っても、ヘッドレスモードの検出を回避するための細工が毎回必要でした。
求人・企業情報サイト:wantedly.com mynavi転職 indeed.com biz-maps.com baseconnect.in keyman-db.smart-letter.com indexpro.co.jp itreview.jp など
このジャンルで最も手こずったのが「動的なページ構造」です。wantedlyはReactベースのSPAでBeautifulSoupだけでは動作せず、Seleniumによるページ遷移とCSSセレクタの特定に苦労しました。baseconnectはクラス名にランダムなハッシュ値が付与される動的なCSSクラス構造を持っており、部分一致セレクタによる抽出に切り替えて対処しました。
製造業・B2B:monodzukuri.com mono.ipros.com houjin.jp proto-g.co.jp nextage.jp supleks.jp など
法人データ系は総じてページ数が多く、一覧→詳細ページという2階層取得が基本になります。houjin.jp(国税庁法人番号公表サイト)は静的HTMLで取りやすいですが、全件で数百万社分のページを処理するため、進捗保存と中断再開の仕組みが必須でした。
金融・価格データ:finance.yahoo.co.jp stooq.com keepa.com daidata.goraggio.com など
keepa.com(Amazonの価格履歴追跡サービス)はブラウザExtension経由でAmazonページ上に価格履歴を表示する仕組みのため、SeleniumにExtensionを読み込ませてChromeプロファイルごと管理するアプローチで対処しました。
行政・官公庁:kanpou.npb.go.jp(官報)e-gov.go.jp(パブリックコメント)meti.go.jp 県庁サイト など
官報はHTML形式の告示・公告データが膨大にあり、VBAを使ってHTMLからPDF URLを生成し、日付ベースのURL規則に沿って一括ダウンロードする設計で対処しました。
そうした試行錯誤の中で気づいたのは、「毎回同じことで詰まっている」という事実です。
- Cookieが必要なサイトで500エラーが出る
- JSレンダリングか静的HTMLかを判断するのに時間がかかる
- ページネーションの方式が読み切れず、2ページ目以降が取れない
- リトライ処理を毎回ゼロから書いている
これらをSKILL.mdにまとめることで、「ChatGPTと何百回もやり取りして得た答え」をCoWorkへの一行の指示に変換できるようになりました。
具体的には以下のような知識が詰め込まれています:
- フェーズ設計:調査 → 戦略決定 → 実装 → エラーハンドリング → 保存 → 完了レポート、という6段階の開発フロー
- 判断ロジック:「このサイトはrequestsで取れるか、Seleniumが必要か」を自動判断するコード
- 再利用可能なパターン:「次へボタン式」「URLパラメータ式」「無限スクロール式」など、ページネーション方式ごとの実装テンプレート
- エラーへの対応:リトライ処理・進捗保存・ログ出力のベストプラクティス
- 完了レポートの自動出力:フィルタの設計・除外されたデータ・ユーザーの指示との差異を構造化して報告。「なぜこの件数なのか」「何が含まれていないのか」をコードを読まずに把握できる
この「ノウハウをSKILL.mdに抽出する」という考え方が、AIエージェント時代の新しいスキル資産の作り方だと思っています。
PythonによるWebスクレイピングの実践ーその1(導入編) – ライフ&ジョブブログ
PythonによるWebスクレイピングの実践ーその2(典型的なコード) – ライフ&ジョブブログ
今回の対象:BIZMAPS(biz-maps.com)
BIZMAPS は、国内最大級の企業データプラットフォームです。
- 登録企業数:200万社以上
- 無料で企業リストをダウンロード可能
- 業種・都道府県での絞り込み検索に対応
営業リスト作成や市場調査に使えるサイトで、業種ごとの企業一覧と企業詳細ページの2階層構造になっています。今回はこのサイトをターゲットに、CoWork + web-scraping SKILLで一気通貫のスクレイピングを実施しました。
Step1:サイト事前調査の全記録
CoWorkへの指示はシンプルでした。
「https://biz-maps.com のスクレイピングを行ないたいので調査してください」
これだけで、CoWorkは以下を自動で実行しました。
robots.txtの確認
User-agent: *
Disallow: /item_modal/
Sitemap: https://biz-maps.com/sitemap.xml
Sitemap: https://biz-maps.com/sitemap_xml/prefecture
Sitemap: https://biz-maps.com/sitemap_xml/city
...(以下、都道府県×業種の組み合わせが続く)
判定:/item_modal/ 以外はすべてクロール許可。スクレイピング可能。
さらにサイトマップが豊富に用意されており、URLの構造を把握するヒントにもなりました。
HTML取得・技術スタック確認
次にCoWorkはトップページのHTMLを取得し、以下を自動で判定しました。
| 確認項目 | 結果 |
|---|---|
| ステータスコード | 200(正常) |
| JavaScript必要度 | 低(静的HTML) → requestsで取得可能 |
| Cloudflare | 検出あり(強固なWAFではない) |
| セッションCookie | 必須 ← ここが重要な発見 |
最大の発見がCookie必須であること。 Cookieなしで企業詳細ページにアクセスすると、一見正常に見えますが 500エラー が返ってきます。トップページへの初回アクセスでセッションCookieを取得し、以降のリクエストに使い回す必要があります。
# CoWorkが生成した調査コード(抜粋)
session = requests.Session()
session.get("https://biz-maps.com", timeout=15) # ← Cookieを取得
# この1行がないと後続のリクエストがすべて500エラーになる
ChatGPTでの試行錯誤なしにこの落とし穴を事前に検出できたのは、SKILL.mdに「セッション管理の確認」が組み込まれていたからです。
CoWorkが出力した調査レポート
CoWorkは最終的に以下のような構造化レポートを出力しました。
【biz-maps.com サイト事前調査レポート】
JS必要度:低(静的HTML)→ requests + BeautifulSoup で可
セッションCookie:必須(初回アクセスで自動取得可能)
Cloudflare:検出されるが強固ではない
ページネーション:?page=N&ph={bcryptハッシュ} 形式
推奨ツール:requests(Selenium不要)
Step2:URL構造とページネーションの解読
サイト調査と並行して、URL構造の解析も行われました。
URLパターンの特定
業種別一覧(大カテゴリ): /s/b-inds/{ID}
業種別一覧(中カテゴリ): /s/m-inds/{ID}
都道府県別一覧: /s/prefs/{ID}
企業詳細ページ: /item/{ハッシュ}
大カテゴリ・中カテゴリという2階層構造で、それぞれに固有のIDが割り当てられています。
ページネーションの攻略
このサイトのページネーションには特徴的な仕掛けがあります。
https://biz-maps.com/s/m-inds/481?ph=%242y%2405%24...&page=2
page=N に加えて ph= というbcryptハッシュが付与されています。一見すると「毎回ハッシュを計算しないといけないのか」と思いますが、CoWorkはHTML内の <a href> リンクを追跡するだけで解決しました。各ページに「次のページ」へのリンクが埋め込まれており、そのリンクにはすでに正しい ph 値が含まれているからです。
# ページリンクを追跡するだけでphトークンを意識しなくて良い
next_url = get_next_page_url(html, current_page) # リンクから自動抽出
Step3:業種IDリスト647件の収集
URL構造が判明したところで、次の指示を出しました。
「業種IDリストを収集してください」
CoWorkは /search-list/industry にアクセスし、全業種のリンクを自動解析。大カテゴリ34件・中カテゴリ613件、計647件の業種IDリストを収集してExcelに保存しました。
# 業種リンク収集コード(抜粋)
for a in soup.find_all('a', href=True):
href = a.get('href', '')
if re.match(r'^/s/b-inds/\d+$', href):
# 大カテゴリとして記録
elif re.match(r'^/s/m-inds/\d+$', href):
# 中カテゴリとして記録(親カテゴリと紐づけ)
出力されたExcelの一部:
| カテゴリ種別 | 大カテゴリ名 | 中カテゴリID | 中カテゴリ名 |
|---|---|---|---|
| 大カテゴリ | 運輸・物流業界 | — | — |
| 中カテゴリ | 運輸・物流業界 | 481 | 陸運 |
| 中カテゴリ | 運輸・物流業界 | 162 | 倉庫 |
| 中カテゴリ | 運輸・物流業界 | 197 | 一般貨物輸送 |
| 大カテゴリ | IT・Web | — | — |
| 中カテゴリ | IT・Web | … | … |
大カテゴリ34種(運輸・物流、IT・Web、医療・福祉 etc.)すべての配下に中カテゴリが紐づいた状態で整理されており、このExcelを見ながら次の取得対象を選べます。
Step4:企業一覧133件の取得
業種IDリストを確認し、「運輸・物流業界 > 陸運(ID: 481)」の企業一覧を取得するよう指示しました。
「運輸・物流業界の陸運について企業一覧を取得してください」
CoWorkは7ページ分を自動で巡回し、133件の企業情報をExcelに出力しました。
スクレイピング開始: https://biz-maps.com/s/m-inds/481
ページ1: 20件取得(累計: 20件)
ページ2: 20件取得(累計: 40件)
ページ3: 20件取得(累計: 60件)
...
ページ7: 13件取得(累計: 133件)
→ 最終ページに到達。完了。
取得できた項目:
| 企業名 | 業種 | 住所 | 設立年度 | 代表者名 | 資本金 | 電話番号 | タグ | 説明 |
|---|---|---|---|---|---|---|---|---|
| 合同会社AtoT | 運輸・物流, 陸運 | 東京都三鷹市… | 2022 | 角田裕哉 | 100万円 | — | 2022年新設法人 | 不用品回収… |
| …(以下133件) |
電話番号が空欄の理由:BIZMAPSでは電話番号・AIスコアなど一部の項目はログイン後の無料会員登録や有料プランでのみ表示される仕様のため、未ログイン状態のスクレイピングでは空欄になります。企業名・住所・業種・代表者名・資本金・説明文は無料で取得可能です。
完成スクリプトの概要
最後に「大カテゴリIDと中カテゴリIDを引数で指定してExcelを出力するPythonスクリプト」の生成を依頼しました。
# 中カテゴリ指定(陸運)
python bizmaps_scraper.py --m-inds 481
# 大カテゴリ指定(運輸・物流業界 全体)
python bizmaps_scraper.py --b-inds 50
# ファイル名・ウェイト時間も指定可能
python bizmaps_scraper.py --m-inds 481 --output 陸運リスト.xlsx --sleep 1.5
スクリプトの主な機能:
--b-inds/--m-indsでカテゴリを自由に切り替え- セッションCookieの自動取得
- phトークン付きページネーションの自動追跡
- タイムアウト時は最大3回リトライ(指数バックオフ)
- 書式付きExcelへの自動保存
スクリプトを動かすには事前に以下のライブラリのインストールが必要です:
pip install requests beautifulsoup4 openpyxl
スクリプト本体(bizmaps_scraper.py)の全コードもBOOTHにて販売のskillsとセットになっております。
検証:SKILLあり・なしで何が変わるか
「SKILL.mdを使うとコードの品質が上がる」と言葉で語るのは簡単です。でも実際のところ、どれくらい差が出るのでしょうか。
同じ指示を、SKILLあり・なしの2条件でCoWorkに実行させて比較しました。
検証内容
対象サイト:connpass.com/calendar/(国内最大のIT勉強会プラットフォーム)
指示文:
以下のサイトをスクレイピングして、3月に東京都で開催される
イベント情報をすべて取得してリスト化するPythonコードを作成し、
実際に実行してExcelファイルに保存してください。
カレンダーのページ内だけでOKです。
https://connpass.com/calendar/
この指示を web-scraping SKILLを有効にした状態と、SKILLなしの素のCoWorkにそれぞれ渡し、同時実行しました。
評価軸(7項目)
どちらが「要件を正しく満たせているか」を7つの観点で採点しました。

合格率:SKILLあり 7/7(100%) SKILLなし 3/7(43%)
出力されたExcelの中身の違い
SKILLあり(web-scraping 使用)
- 取得件数:1,313件(会場住所に「東京都」を含む形で東京都フィルタを実装)
- 列構成:6列(イベント名・URL・日時・会場・都道府県・年月日)
- 日時の形式:
2026/03/01 09:30など正規化済み - 会場住所:
東京都目黒区下目黒6丁目8−23など個別に抽出済み
SKILLなし
- 取得件数:1,555件(東京都フィルタのコードが一切存在しない = 全国のイベントをそのまま全件取得)
- 列構成:3列(タイトル・URL・日付情報)
- 日時の形式:
1日33件・【第119回】情報処理技術者試験もくもく会【第119回】…という未整形の生テキスト - 会場住所:列なし
SKILLなしの場合、コードのコメントには「対象:3月東京都のイベント」と書かれていましたが、実際のコードにはフィルタのロジックが一行も存在しません。1,555件は全国・全カテゴリのイベント数です(connpassカレンダーのスクレイピング実行時点の件数と一致)。日時の整形も、会場の絞り込みも行われておらず、依頼の核心だった「東京都のイベントだけ」という要件が完全に無視されています。
なぜ差が生まれるのか
SKILLなしのCoWorkは、指示を受けると「まずコードを書く」方向に進みます。今回のケースでは、サイトの構造を浅く把握してすぐ実装に入ったため、tooltipに埋め込まれた会場住所の存在に気づかないまま、ページ全体のリンクを羅列するコードを書いてしまいました。
SKILLありの場合は、フェーズ1(サイト調査)が必ず最初に実行されます。HTML構造を順に解析していく中で <span class="tooltip"> の中に日時・会場・定員の構造化データが隠れていることを発見し、そこから「東京都を含む会場住所」でフィルタするという正しいアプローチに自然と辿り着きます。
コードを書く前の「調査」がアウトプットの質を決める、ということがこの比較に表れています。
所要時間とトークン消費の比較
| SKILLあり | SKILLなし | |
|---|---|---|
| 所要時間 | 104.8秒 | 67.8秒 |
| トークン使用量 | 52,001 | 36,087 |
SKILLなしのほうが約37秒速く、トークンも約16,000少なく済みました。ただしその出力は要件の43%しか満たせておらず、東京都フィルタはコード上に存在すらしていませんでした。
「速く動くが使えないコード」か「少し時間はかかるが要件を満たすコード」か、どちらが価値があるかは言うまでもないでしょう。
まとめ:AIエージェントがスクレイピング開発を変える
今回の作業をまとめると:
| 作業 | 従来(手動) | CoWork使用 |
|---|---|---|
| サイト事前調査 | 30分〜1時間 | 約5分 |
| URL構造解析 | 20〜30分 | 同時並行で自動 |
| 業種IDリスト収集 | 手作業でコピペ | 自動(647件) |
| 企業一覧取得 | コーディング〜デバッグ1〜2時間 | 指示1行で自動 |
| Excel整形・出力 | 別途作業 | 自動(書式付き) |
この工程全体を再現可能にするのが SKILL.md という仕組みです。ChatGPTで試行錯誤して身につけたスクレイピングのノウハウをSKILL.mdに凝縮することで、CoWorkは初めて見るサイトでも同じクオリティの調査・実装を行えます。
⚠️ 重要な注意点:CoWorkはあくまで「準備」のツール
記事内ではデモとしてCoWork自身が直接スクレイピングを実行しましたが、実際の運用ではこのやり方はおすすめしません。
理由は単純で、Claudeのプランには使用制限があるからです。
今回取得したのは陸運カテゴリの133件のみでしたが、BIZMAPSには200万社以上のデータがあります。全業種・全地域を対象に大量取得しようとすると、あっという間にClaudeのメッセージ制限に到達してしまいます。
CoWork(SKILL.md)の正しい使い方は、次の2段階です:
【第1段階:CoWorkが担う「設計フェーズ」】
① サイト調査(robots.txt・HTML構造・bot対策・Cookie要否の確認)
② 取得戦略の決定(requests vs Selenium・ページネーション方式)
③ Pythonスクリプトの自動生成(引数設計・エラーハンドリング込み)
【第2段階:自分で実行する「本番フェーズ」】
④ 生成されたPythonスクリプトをローカル環境で実行
⑤ 大量データをClaudeを介さず直接取得・保存
CoWorkは「どう取るか」を決めてコードを渡す役割に徹し、実際の大量データ取得はローカルのPythonで行います。これが、Claudeのプラン制限に引っかからずに大規模スクレイピングを実現するための基本設計です。
今回BOOTHで提供する bizmaps_scraper.py は、まさにこの「第2段階」で使うために設計されています。なお、Claudeのプランごとのメッセージ制限の詳細はAnthropicの公式プランページをご参照ください。
⚠️ スクレイピングの法的・利用規約上の注意
robots.txtでクロールが許可されていても、サイトの利用規約でスクレイピングを禁止しているケースがあります。また、取得したデータの商用利用・再配布は別途権利上の問題が生じる可能性があります。実施前には必ず対象サイトの利用規約を確認し、自己責任のもとで行ってください。本記事の内容はあくまで技術的な手法の紹介であり、特定のスクレイピング行為を推奨するものではありません。
BOOTH販売コンテンツ
今回の記事で使用した web-scrapingスキル・完成スクリプト・カスタマイズガイド はBOOTHにて販売しています。
🛒 [BOOTHの販売ページはこちら]
収録内容
| ファイル | 内容 |
|---|---|
web-scraping.skill | CoWork用スキルファイル |
CoWorkスキルのインストール方法
- BOOTHから
web-scraping.skillをダウンロード - CoWorkデスクトップアプリのカスタマイズ → スキル → “+” からそのファイルをアップロード
- トグルをオンにして有効化
- 完了。次回からスクレイピングを依頼すると自動的にスキルが適用されます
必要なもの
- Claude デスクトップアプリ(CoWork)
- Claudeのサブスクリプション(Proプラン以上)
Pythonコードを走らせるためには以下の環境が必要です。
項目 条件 OS Windows / macOS / Linux Python 3.8以上 必要ライブラリ requestsbeautifulsoup4openpyxlseleniumなど(pip でインストール)インターネット接続 必須
この記事が「AIエージェント時代のスクレイピング開発」の参考になれば嬉しいです。疑問点や「このサイトでも試してみた」という報告など、ぜひコメント欄で教えてください。


コメント