Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】A daily SAM.gov bid digest by NAICS code, no API key (Python)

2026年10月24日に「Dev.to」が公開したITニュース「A daily SAM.gov bid digest by NAICS code, no API key (Python)」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

SAM.govの契約機会をAPIキーなしで効率的に探す方法を紹介。Pythonスクリプトを使えば、毎日更新される公開CSVからNAICSコードで関連する最新の入札案件だけを自動で抽出し、自身の興味ある分野の情報を手軽に取得できる。

ITニュース解説

SAM.govは、米国政府機関が発行する連邦契約の機会情報を集約したウェブサイトであり、企業や個人が政府とのビジネスチャンスを探す上で非常に重要な情報源である。通常、このような政府の公開データにプログラムからアクセスする場合、API(Application Programming Interface)キーと呼ばれる認証情報が必要になることが多いが、このニュース記事では、SAM.govの提供する契約機会情報を、APIキーなしで、しかもPythonというプログラミング言語を使って効率的に取得する方法について解説している。

SAM.govは、毎日更新される契約機会の情報を、誰でもダウンロードできるCSVファイルとして公開している。このCSVファイルは、特定のURLにアクセスすると常に最新版が提供される仕組みになっている。このファイルには、現在募集されている契約機会の詳細な情報が大量に含まれており、その特性を理解することが効率的なデータ取得の鍵となる。

このCSVファイルの重要な特性が三点ある。一点目は、データが「PostedDate(掲載日)」の新しい順にソートされていることである。これにより、ファイル全体をダウンロードして解析するのではなく、必要な期間のデータだけを読み込んだら、それ以上は処理を中断できるという効率的な処理が可能になる。二点目は、ファイルのエンコーディングが「Windows-1252」である点だ。通常、Webでよく使われる「UTF-8」ではないため、もしUTF-8として読み込もうとすると、文字化けやエラーが発生する。そのため、Pythonでファイルを読み込む際には、このエンコーディングを正確に指定する必要がある。三点目は、ファイルが一日一回再生成されることである。今日掲載された新しい情報が、その日のファイルに反映されるのではなく、翌日のファイルに含まれる傾向がある。

スクリプトが活用する情報は、主に「NoticeId(通知ID)」「Title(案件名)」「Sol#(契約番号)」「Department/Ind.Agency(担当機関)」「PostedDate(掲載日)」「Type(通知の種類)」「SetASideCode(特定の中小企業優遇措置コード)」「SetASide(優遇措置の説明)」「ResponseDeadLine(応募期限)」「NaicsCode(NAICSコード)」「Active(アクティブ状態)」「Description(説明)」といった列である。

提供されているPythonスクリプトは、これらの特性を最大限に活用して、日次の契約機会ダイジェストを生成する。まず、requestsライブラリを使用して、CSVファイルのURLにアクセスし、データをストリーム形式で取得する。stream=Trueと設定することで、ファイル全体を一度にダウンロードするのではなく、データが少しずつ送られてくるたびに処理を開始できるため、非常に大きなファイルを扱う際にメモリの消費を抑え、処理の開始を早めることができる。

データが届き始めたら、io.TextIOWrapperを使ってエンコーディングをcp1252と指定し、csv.DictReaderでCSVデータを一行ずつ辞書形式で読み込む。これにより、各行のデータを列名で参照できるようになる。

スクリプトは、直近の数日間に掲載された案件のみを対象とする。PostedDateをチェックし、指定した期間よりも古いデータが検出された時点で処理を中断する。これは、ファイルが新しい順にソートされている特性を利用した非常に効率的な方法である。もしこの仕組みがなければ、巨大なCSVファイル全体をダウンロードし、全行を処理する必要がある。

さらに、いくつかの条件でデータをフィルタリングする。 NAICSコード:これは、企業の業種を示す標準的な分類コードであり、自分たちが得意とする分野の契約機会のみに絞り込むことができる。スクリプトでは、NAICSコードの接頭辞(例: "5415")を指定することで、そのコードで始まる全ての関連業種(例: 541511、541512など)を対象にできる。 Set-Asideコード:特定の中小企業向けの優遇措置が適用される契約機会に絞り込む場合に利用する。重要なのは、SetASideというテキストフィールドではなく、SetASideCodeというコードフィールドでフィルタリングすることである。テキストフィールドは表記揺れがあるため、コードの方が正確である。 アクティブな案件のみ:すでに終了した「Award Notice(落札通知)」や「Active(アクティブ状態)」が「No」の案件は除外する。 このようなフィルタリングを行うことで、興味のある分野の、新しく掲載された、入札可能な案件だけを効率的に抽出できる。

スクリプトは、日付の扱いにも配慮している。例えば、応募期限ResponseDeadLineのデータにはタイムゾーン情報が含まれる場合があるが、最初の10文字だけを切り出すことで日付部分のみを取得し、シンプルな表示を可能にしている。

ただし、このスクリプトには限界もある。例えば、契約機会に添付されている追加資料や、掲載後の変更履歴を追跡することはできない。実際の入札に参加する場合は、抽出された通知IDをもとにSAM.govのウェブサイトで直接詳細を確認し、最新の情報や添付ファイルを必ず確認することが重要である。

このスクリプトは一日一回、例えば早朝に自動で実行するように設定することで、毎日新しい契約機会のダイジェストを自動的に受け取ることができる。同じ案件が繰り返し通知されるのを避けるためには、一度処理した案件のNoticeIdを保存しておき、次回の実行時にそのNoticeIdがリストに含まれていればスキップするといった工夫も考えられる。

記事の後半では、この基本的な考え方を拡張し、より高度な機能を提供する商用サービス「Apify Actor: SAM.gov & Grants.gov Scraper」も紹介されている。これはAPIキー不要で、キーワードフィルタリング、Grants.gov(政府助成金情報)との連携、新規通知や修正に関するアラート機能などを提供し、より専門的なニーズに対応する。しかし、その根底にあるのは、公開されたCSVファイルを効率的に取得し、フィルタリングするという、この記事で説明された基本的な技術である。

関連コンテンツ

関連IT用語

関連ITニュース