目次
🎯 目的
- 求人サイト2社の検索結果をスクレイピング
- 「勤務地=東京」「リモート可」などの条件に一致する求人のみ抽出
- 一致求人があれば、管理者にメール通知(本文にタイトル+URL一覧)
- 処理ログをCSVに記録(日時/件数/対象サイト)
🔄 自動化の全体フロー
[1] サイトA / B の検索ページを自動操作
↓
[2] 結果ページから求人タイトル・URLを抽出
↓
[3] 条件に一致する求人だけをフィルタ
↓
[4] 一致リストがあればメールで通知
↓
[5] ログファイルに処理記録を追記
📁 フォルダ構成(推奨)
JobScraperBot/
├─ main_flow.padx
├─ modules/
│ ├─ ScrapeSiteA.padx
│ ├─ ScrapeSiteB.padx
│ ├─ FilterJobs.padx
│ ├─ SendEmail.padx
│ └─ WriteLog.padx
├─ data/
│ ├─ config.json ← 条件設定
│ ├─ log.csv ← 処理ログ
├─ templates/
│ └─ email_template.txt ← メール本文テンプレ
📄 ファイル詳細
config.json
{
"keywords": ["東京", "リモート", "在宅"],
"emailTo": "admin@example.com",
"siteA_url": "https://example.com/jobs/search",
"siteB_url": "https://example2.com/search"
}
log.csv(実行履歴)
日時,対象サイト,取得件数,一致件数
2025/09/11 08:30,SiteA,30,5
2025/09/11 08:30,SiteB,25,2
email_template.txt
以下の条件に一致する求人が見つかりました({{サイト名}}):
{{一致リスト}}
ご確認ください。
🛠 フロー構築ステップ(初心者でも安心)
✅ STEP1:求人サイトから検索結果を取得(ScrapeSiteA / ScrapeSiteB)
アクションの概要:
- Chromeを起動(プロファイル指定でログイン維持も可)
- 検索欄に「キーワード(例:エンジニア)」を入力
- 「検索」ボタンを押す
- 結果リストをループで取得 →
Title + URLをリストで出力
UIセレクタ例(サイトによって変更):
| 項目 | セレクタ例 |
|---|---|
| 検索入力欄 | input[name="q"] |
| 検索ボタン | button[type="submit"] |
| タイトル | div.job-card h2.title |
| 詳細リンク | a[href*="/job/"](同一ノード内で取得) |
出力:
[
{"title": "Webエンジニア|東京勤務(リモート可)", "url": "https://example.com/job/123"},
{"title": "インフラエンジニア|大阪", "url": "https://example.com/job/456"}
]
変数名:JobList_SiteA / JobList_SiteB
🧠 STEP2:条件で求人をフィルタ(FilterJobs.padx)
処理内容:
- 各サイトの
JobListをループ config["keywords"]に1つでも含まれていれば「一致」と判定
実装ポイント:
ループ:各Job
条件:Job["title"] に "東京" or "リモート" or "在宅" を含むか?
→ 一致リストに追加
出力:
FilteredJobs_SiteA(リスト)
FilteredJobs_SiteB(リスト)
✉️ STEP3:一致求人をメール送信(SendEmail.padx)
条件:
- 一致リストが1件以上ある場合に実行
メール本文生成:
email_template.txtを読み込む{{サイト名}}→SiteA/SiteBに置換{{一致リスト}}→ タイトルとURLを箇条書きで整形
📌 Webエンジニア|東京勤務(リモート可)
https://example.com/job/123
📌 フロントエンド|東京・在宅OK
https://example.com/job/234
アクション:
- 「Outlookメールを送信」
- 宛先:
config["emailTo"] - 件名:
「求人アラート|{{サイト名}}」 - 本文:上記生成テキスト
- 送信元:既定のOutlookアカウント
- 宛先:
🧾 STEP4:ログ出力(WriteLog.padx)
アクション:
- 日時:
Now - サイト名:SiteA / SiteB
- 総取得数:
length(JobList) - 一致数:
length(FilteredJobs)
書き出し先:
log.csv(追記モード)
📋 実行の流れ(main_flow.padx)
[1] config.json 読み込み
[2] ScrapeSiteA → FilterJobs → SendEmail → WriteLog
[3] ScrapeSiteB → FilterJobs → SendEmail → WriteLog
🧪 テスト手順
config.jsonに「東京」「リモート」などのキーワードを設定- テスト用の求人が出るワード(例:「エンジニア」)を入力
- フロー実行
- メールが届くか確認
log.csvに記録されているか確認
✨ 応用Tips
| 応用内容 | 実装アイデア |
|---|---|
| 件名に一致件数を入れる | 件名 → 求人アラート(5件ヒット) のように動的生成 |
| メールの代わりにSlack通知 | Slack Web送信 or APIに置き換え可能(別記事参照) |
| 処理時間の記録 | 処理開始〜終了をタイムスタンプでログ記録 |
| 結果をExcelで保存 | FilteredJobs を 結果一覧.xlsx に出力可能 |
❓ よくある質問(FAQ)
Q1. スクレイピングがブロックされない?
A. 正規のブラウザ操作+セレクタによるDOM取得のため、人が操作しているのと同じ扱いになります。
頻度が高すぎると弾かれる可能性はあるため、時間帯分散や待機を挟むのがおすすめです。
Q2. 検索条件は変えられる?
A. 検索フォームに入力する値を外部ファイル(config.jsonなど)で管理すれば、自由に差し替え可能です。
Q3. メール送信にGmailは使えない?
A. Power Automate DesktopではOutlookの使用が最も安定しています。Gmailは送信にOAuthやSMTP設定が必要で手間です。
