
RSSはReally Simple Syndicationの略です。フィードリーダーで開ける文書形式です。RSSはXMLで記述します。XMLは構造化されたテキストです。
確認済みのデータ行を使う
Actorは、ホスティング環境で動作するデータ収集プログラムです。Taskは、保存された入力設定です。Indeed Jobs Scraper Actorは、取得元からデータ行を収集します。確認済みのデータ行を使って、RSSフィードは自分で作成します。このActorがフィードを作成するわけではありません。
これらのデータ行の取得元は、求人サイトのIndeedです。公開ビルド1.2.14は、この方法で使うデータ行のフィールドを返すことができます。対象のフィールドは、jobId、jobUrl、title、companyName、descriptionText、descriptionStatus、postedAt、postedAtRaw、scrapedAtです。jobUrlは、その求人のウェブアドレスです。ウェブアドレスはURLとも呼ばれます。
2行を使った対照検証では、取得元のID、取得元のURL、説明文の全文を妥当なものとして確認できました。この対照検証の上限は2行でした。範囲を限定したサンプルは、サイト上のすべての求人を表すものではありません。この方法は、ブロックされたUpworkでの収集を復旧するものではありません。また、Indeedが直接提供するフィードを作成するものでもありません。
現在公開されているIndeed Jobs Scraper Taskは、2026-10-13T05:55:51.545104+00:00に確認しました。保存されている入力は次のとおりです。
{"country": "us", "searchTerm": "software engineer", "maxItems": 100, "postedWithinDays": "7", "sortBy": "date", "maxPagesPerSearch": 2, "saveOnlyUniqueItems": true}この入力は、あくまで出発点として使ってください。データ行を収集するときは、サンプルの検索語を置き換えてください。国や地域も置き換えてください。maxItems 100はリクエストに上限を設定します。見つかった求人の件数ではありません。maxPagesPerSearch 2は、1回の検索で取得するページ数に上限を設定します。サイト全体を網羅するものではありません。saveOnlyUniqueItems trueは、重複しない項目を保持するように収集処理に指定します。それでも、フィードを作成する前にはIDの確認が必要です。公開Taskがあるからといって、フィード作成が自動化されているわけではありません。
この方法を使う前に、データの収集、データ行の比較、同一性の確認を行います。ここでいう識別情報は、1件の求人掲載に対して取得元が付与する安定したIDです。確認済みのデータ行のうち、範囲を限定したものだけで始めてください。IDがないデータ行や、IDがまだ確認中のデータ行は除外してください。
8つの手順でフィードを作成する
- サンプルと目的を定めます。
目的は、確認済みの求人掲載情報を有効な文書としてフィードリーダーに渡すことです。IDが分かっている有用なデータ行から始めてください。対象範囲の記録も一緒に保管します。対象範囲の記録とは、フィードに含めるデータ行を簡潔に記したものです。IDがないデータ行は除外してください。IDがまだ確認中のデータ行も除外してください。
- 項目を識別するルールを決めます。
Indeedの1件の求人掲載を識別するキーは、文字列indeed:の直後にjobIdを連結したものです。GUIDは、項目を識別する文字列です。GUIDはグローバル一意識別子の略です。RSSでは、これをguid要素に格納します。isPermaLinkはfalseに設定します。falseは、そのGUIDがウェブアドレスではないことを意味します。タイトルが変わっても同じGUIDを維持してください。説明文が変わっても同じGUIDを維持してください。このルールでは、取得元IDが新しくなると、フィードにも新しい項目を作成します。取得元IDが新しいことは、雇用主の募集職務が新しいことの証拠にはなりません。同じ職務かどうかを照合する必要がある場合は、別の方法を使ってください。
- 1つのチャンネルを持つRSS 2.0フィードを1つ作成します。
ルート要素はrssで、バージョンは2.0です。その中にchannel要素を1つ配置します。チャンネルは、フィードのタイトルと各項目をまとめる主要なグループです。項目は、フィード内の1件の求人掲載情報です。RSS仕様では、チャンネルのtitle、link、descriptionが必須とされています。この3つをすべて設定してください。有用なデータ行ごとに項目を1つ追加します。その項目にタイトルを付けます。リンクには、元の求人のウェブアドレスを設定します。短い説明文も付けます。同じ仕様では、各項目にタイトルか説明文のどちらかが必要です。この方法では両方を設定します。チャンネルのリンク先には、読者がアクセスできるようにしてください。
- XMLシリアライザーを使ってテキストを書き出します。
この書き出し処理をシリアライズと呼びます。求人のテキストを、そのまま手作業でファイルに貼り付けないでください。アンパサンドや小なり記号があると、XMLが無効になることがあります。XMLの構文規則には、これらの文字の記述方法が示されています。シリアライザーは、XMLとして安全な形式でテキストを書き出すプログラムです。éなどのUnicode文字を保持します。ウェブアドレスに含まれるクエリ文字列も保持します。クエリ文字列とは、ウェブアドレスの疑問符の後に続くテキストです。XMLとして安全なテキストが、HTMLとしても安全とは限りません。HTMLは、ウェブページの表示に使う形式です。シリアライザーを使っても、貼り付けたHTMLを安全に表示できるようになるわけではありません。項目の要約にはプレーンテキストを使ってください。求人本文の全文は、元の求人ページで参照できるようにします。descriptionTextは、データ行の確認でdescriptionStatusを妥当と判断した場合に限って使ってください。companyNameは、取得元のデータ行に残しておけば構いません。フィードの項目には必須ではありません。
- 公開時刻が確認できた場合に限ってpubDateを追加します。
pubDateは、項目の公開日時を表すRSSの要素名です。postedAtは任意のフィールドで、取得元のテキストから解析されます。postedAtに値が入っていても、正確な公開時刻の証明にはなりません。postedAtRawと取得元の根拠を確認してください。公開時刻とタイムゾーンの両方が確認できた場合に限って、pubDateを追加します。時刻が欠けている場合、相対的な表現の場合、または不確かな場合は、不明のままにします。「何日前」のような相対的な時刻表現は、正確な時刻ではありません。次の日時文字列は、この記事のために作成した架空のサンプルの一部です。RSSの日付形式は、Mon, 12 Oct 2026 09:30:00 GMTのようになります。GMTは、この形式でそのUTC時刻を表す際に使うタイムゾーン名です。UTCは協定世界時の略です。公開時刻が不明な場合は、pubDateを省略してください。観測時刻は、項目の要約または対象範囲の記録に記載できます。scrapedAtは観測時刻です。scrapedAtを公開時刻として使わないでください。lastBuildDateは、フィード文書を生成した時刻を意味します。その生成時刻を別途記録している場合に限って、lastBuildDateを追加します。不明な求人の日時を生成時刻で補わないでください。
- 取得元のデータ行とフィードの項目を照合します。
照合とは、両方の一覧を比較し、各データ行がどう扱われたかを漏れなく確認することです。使用した既知のIDを報告します。除外したデータ行を報告します。まだ判断がついていないデータ行を報告します。重複したキーを報告します。公開日時のない項目の数を報告します。範囲が限られたデータセットから作成したフィードは、その範囲に限られます。後のサンプルに項目が見つからなくても、雇用主がその求人を削除した証拠にはなりません。リーダーが項目をどのように削除または更新するかは、別途決めることです。
- フィードを解析し、3段階で確認します。
解析とは、文書を読み込んで、その構造を確認することです。最初にXMLを解析します。必須の要素を確認します。項目数を確認します。各GUIDが重複していないことを確認します。テキストが変わっても各GUIDが変わらないことを確認します。各項目のリンクを確認します。解析後のテキストが取得元のテキストと一致することを確認します。各日時が、取得元での意味を保っていることを確認します。解析に成功すれば、XMLの構造が正しいことは分かります。ただし、RSSのすべてのルールを満たす証明にはなりません。どのリーダーでもそのフィードを受け付けるという証明にもなりません。次に、使用するRSSのルールを確認します。3番目に、使用予定のリーダーでテストします。インポートとは、そのリーダーでフィードを開くことです。実際のデータ行を追加する前に、小規模な架空のフィードをインポートしてください。リーダーでのテストと文書のテストは、分けて扱ってください。
- フィードと、その内容を説明するメモを保存します。
対象範囲のメモ、日時のメモ、使用元の記録を一緒に保管します。使用元の記録には、どの確認済みデータ行を使ったかを記します。リーダーからのアクセスが必要な場合に限って、ファイルをホストしてください。ホストするとは、リーダーが取得できる場所にファイルを置くことです。この記事では、稼働中のフィードを公開しません。非公開のアクセスキーも開示しません。更新のスケジュール設定も行いません。通知も送信しません。これまでに見つけていない求人を追跡することは、別の作業です。
2項目の架空のフィードを読み解く
このセクションのフィードは、この記事のために作成した架空のものです。ルールを説明するために使います。Actorから得られた結果ではありません。求人が2件しか存在しないという証拠でもありません。
サンプルには、取得元の求人掲載情報が2件あります。取得元IDは、文字列の値000101と000102です。J1とJ2は、この2行の架空データに付けたラベルにすぎません。GUIDはindeed:000101とindeed:000102です。J1には、2026年10月12日09:30 UTCという確認済みの公開時刻があります。J2は公開時刻が不明のため、公開日時は設定できません。
| データ行 | 取得元ID | GUID | 項目のリンク | 公開日時 |
|---|---|---|---|---|
| J1 | 000101 | indeed:000101 | https://jobs.example/J1?role=analyst&city=Austin | Mon, 12 Oct 2026 09:30:00 GMT |
| J2 | 000102 | indeed:000102 | https://jobs.example/J2 | 不明 |
J1のタイトルは「Café Analyst & SQL」です。説明文は「Check values < 10 & explain results.」です。J2のタイトルは「Report Analyst」です。説明文は「Publication time unavailable. Observed 2026-10-13 05:50 UTC.」です。この観測時刻は公開時刻ではありません。
J1のタイトルでは、Unicodeとアンパサンドをテストします。J1の説明文では、小なり記号とアンパサンドをテストします。J1のリンクでは、クエリ文字列をテストします。フィードは、これらの文字をXMLとして安全なテキスト形式で格納します。
| 取得元のテキスト | フィードに書き出すテキスト |
|---|---|
| Café Analyst & SQL | Café Analyst & SQL |
| Check values < 10 & explain results. | Check values < 10 & explain results. |
| https://jobs.example/J1?role=analyst&city=Austin | https://jobs.example/J1?role=analyst&city=Austin |
<?xml version='1.0' encoding='utf-8'?>
<rss version="2.0">
<channel>
<title>Fictional checked analyst sample</title>
<link>https://jobs.example/sample</link>
<description>Two checked sample rows; source collection was capped.</description>
<item>
<title>Café Analyst & SQL</title>
<link>https://jobs.example/J1?role=analyst&city=Austin</link>
<description>Check values < 10 & explain results.</description>
<guid isPermaLink="false">indeed:000101</guid>
<pubDate>Mon, 12 Oct 2026 09:30:00 GMT</pubDate>
</item>
<item>
<title>Report Analyst</title>
<link>https://jobs.example/J2</link>
<description>Publication time unavailable. Observed 2026-10-13 05:50 UTC.</description>
<guid isPermaLink="false">indeed:000102</guid>
</item>
</channel>
</rss>J1は最初の項目に対応します。GUIDはindeed:000101で、pubDateは確認済みのUTC時刻です。J2は2番目の項目に対応します。GUIDはindeed:000102です。日時の欠損は、J2にpubDateがない形で表れています。J2の説明文に記載しているのは観測時刻だけです。この欠損を、文書の生成時刻で補わないでください。
ローカル環境で行った文書テストで、このXMLを解析しました。チャンネルが1つ、項目が2つあることを確認しました。チャンネルに必須のテキストを確認しました。2つのGUIDが重複していないことと、isPermaLinkがfalseであることを確認しました。解析後のテキストは、Unicodeを含むタイトル、小なり記号、アンパサンド、元のクエリ付きリンクと一致しました。テストでは、J1の公開日時を読み取りました。J2にpubDateがないことを確認しました。J1のタイトルを変更しても、GUIDはindeed:000101のままでした。
これらは、この架空のサンプルを対象とした文書の確認です。XMLの解析により、構造が正しいことを確認しています。GUID、リンク、テキスト、日時の確認は、ここで使用するRSSのルールを対象としています。フィードリーダーでのテストは行っていません。WordPressでのテストも行っていません。まず、作成した架空のフィードを解析してください。その後、使用するリーダーで小規模な互換性確認を行ってください。
出典と参考資料
著者 Chronometrica · 更新日
ページの先頭へ ↑

