如何使用 SERP API 擷取 Google Jobs 結果

了解如何使用 SERP API 擷取 Google Jobs 結果,並用 Python 提取職缺標題、公司、地點、描述、發布時間、申請連結和搜尋 metadata。

如何使用 SERP API 擷取 Google Jobs 結果
Cecilia Hill
最後更新於
5 分鐘閱讀

Google Jobs results 對很多資料工作流程都很有用。你可以從搜尋結果中取得職缺標題、公司名稱、工作地點、發布時間、職缺描述、申請連結和來源平台。

這些資料可以用於招聘市場研究、職缺看板監測、薪資與職類趨勢分析、競爭對手招聘動向追蹤,也可以作為 AI recruiting agent 的資料來源。

比較麻煩的做法是自己抓取 Google 頁面,處理版面變化、請求失敗、反爬限制和自訂 parser。

更穩定的方式是使用 SERP API。你發送一個 Google Jobs query,API 返回結構化 JSON,然後你只需要提取工作流程需要的欄位。

Google Jobs 可以提取哪些資料?

Google Jobs result 和普通 organic result 不太一樣。普通搜尋結果通常是 title、link、snippet;Google Jobs 則包含更多職缺相關欄位。

欄位

含義

title

職缺標題

company_name

招聘公司

location

工作地點

via

來源平台,例如 LinkedIn 或公司官網

description

職缺描述摘要

detected_extensions

結構化細節,例如發布時間、工作類型

job_id

provider 返回的職缺 ID

apply_options

申請入口

thumbnail

公司 Logo 或相關圖片,如果有

多數場景下,可以先提取 title、company、location、description、posted_at 和 apply link。等到業務需要更細的資料,再擴展欄位。

基礎請求結構

不同 SERP API 的 endpoint 和參數命名可能不同,但請求思路通常一致:

{
  "engine": "google_jobs",
  "query": "software engineer jobs in New York",
  "location": "United States",
  "language": "en",
  "output": "json"
}

幾個核心參數:

參數

作用

query

定義職缺搜尋意圖

location

控制國家、城市或市場

language

控制本地化結果

engine

指定返回 Google Jobs 結果

output

通常選 JSON,方便解析

例如下面幾個 query 會得到完全不同的資料集:

data analyst jobs in Austin
remote product manager jobs
nurse practitioner jobs in California
entry level Python developer jobs
marketing manager jobs in London

Query 越具體,後續分析越容易。

Google Jobs JSON 示例

一個簡化的 SERP JSON response 可能像這樣:

{
  "search_parameters": {
    "engine": "google_jobs",
    "query": "software engineer jobs in New York",
    "location": "United States",
    "language": "en"
  },
  "jobs_results": [
    {
      "title": "Software Engineer",
      "company_name": "ExampleTech",
      "location": "New York, NY",
      "via": "LinkedIn",
      "description": "Build backend services and APIs for a fast-growing SaaS platform.",
      "detected_extensions": {
        "posted_at": "3 days ago",
        "schedule_type": "Full-time"
      },
      "job_id": "eyJqb2JfdGl0bGUiOiJ...",
      "apply_options": [
        {
          "title": "Apply on LinkedIn",
          "link": "https://www.linkedin.com/jobs/view/example"
        }
      ]
    }
  ]
}

不同 API provider 的欄位可能略有差異。比如有些使用 jobs_results,有些使用 job_results;有些使用 company_name,有些使用 company。所以 parser 最好做得靈活一點。

Python 示例:抓取並解析 Google Jobs 結果

下面是一個 provider-neutral 的 Python 示例。你只需要替換 SERP_API_ENDPOINT 和 authentication 方式即可。

import os
import csv
import requests


SERP_API_KEY = os.getenv("SERP_API_KEY")
SERP_API_ENDPOINT = os.getenv("SERP_API_ENDPOINT")


def clean_text(value):
    if not value:
        return ""
    return " ".join(str(value).split())


def fetch_google_jobs(query, location="United States", language="en"):
    params = {
        "engine": "google_jobs",
        "query": query,
        "location": location,
        "language": language,
        "output": "json"
    }

    headers = {
        "Authorization": f"Bearer {SERP_API_KEY}"
    }

    response = requests.get(
        SERP_API_ENDPOINT,
        params=params,
        headers=headers,
        timeout=30
    )

    response.raise_for_status()
    return response.json()


def extract_jobs(serp_json):
    raw_jobs = (
        serp_json.get("jobs_results")
        or serp_json.get("job_results")
        or []
    )

    extracted = []

    for item in raw_jobs:
        extensions = item.get("detected_extensions") or {}

        apply_options = item.get("apply_options") or []
        apply_link = ""
        if apply_options and isinstance(apply_options, list):
            apply_link = apply_options[0].get("link", "")

        extracted.append({
            "title": clean_text(item.get("title")),
            "company": clean_text(item.get("company_name") or item.get("company")),
            "location": clean_text(item.get("location")),
            "source": clean_text(item.get("via")),
            "posted_at": clean_text(extensions.get("posted_at")),
            "schedule_type": clean_text(extensions.get("schedule_type")),
            "description": clean_text(item.get("description")),
            "job_id": item.get("job_id", ""),
            "apply_link": apply_link
        })

    return extracted


def save_jobs_to_csv(jobs, filename="google_jobs_results.csv"):
    fieldnames = [
        "title",
        "company",
        "location",
        "source",
        "posted_at",
        "schedule_type",
        "description",
        "job_id",
        "apply_link"
    ]

    with open(filename, "w", newline="", encoding="utf-8") as file:
        writer = csv.DictWriter(file, fieldnames=fieldnames)
        writer.writeheader()
        writer.writerows(jobs)


if __name__ == "__main__":
    serp_json = fetch_google_jobs(
        query="software engineer jobs in New York",
        location="United States"
    )

    jobs = extract_jobs(serp_json)
    save_jobs_to_csv(jobs)

    print(f"Saved {len(jobs)} job listings.")

這段程式完成四件事:發送 Google Jobs query、接收 SERP JSON、提取職缺欄位、匯出 CSV。

CSV 可以直接在 Excel 中打開,也可以匯入 dashboard、資料庫或招聘分析系統。

加入搜尋 Metadata

職缺資料本身有用,但和搜尋上下文一起保存時,價值更高。

同樣是 “software engineer jobs”,New York、San Francisco、London 和 Singapore 的結果可能完全不同。

可以這樣加入 metadata:

from datetime import datetime, timezone


def add_metadata(jobs, query, location, language="en"):
    collected_at = datetime.now(timezone.utc).isoformat()

    for job in jobs:
        job["query"] = query
        job["search_location"] = location
        job["language"] = language
        job["collected_at"] = collected_at

    return jobs

正式使用時,建議至少保存:

  • query

  • search location

  • language

  • collection timestamp

  • job title

  • company

  • job location

  • source platform

  • apply link

沒有 metadata,後續就很難比較不同城市、時間段或職類的變化。

常見使用場景

招聘市場研究

你可以追蹤某個市場中最常出現的職缺類型。例如比較 “data analyst”、“machine learning engineer” 和 “AI product manager” 在不同城市的需求變化。

競爭對手招聘情報

公司招聘方向常常會透露產品和業務重點。如果競爭對手突然發布大量 “AI infrastructure engineer” 或 “partnerships manager” 職位,這可能是值得關注的信號。

Job Board Monitoring

如果你運營招聘網站,Google Jobs data 可以幫助你了解重要 query 下有哪些職缺和來源平台正在曝光。

AI Recruiting Agent

AI recruiting agent 可以把 Google Jobs results 當作 source discovery layer。它可以收集職缺、按 title 或 location 篩選、總結職缺要求,並把合適職位推薦給候選人或招聘人員。

流程可以很簡單:

User asks for job market insight
→ Generate Google Jobs query
→ Fetch SERP JSON
→ Extract job listings
→ Filter by title, company, location, and schedule
→ Summarize trends or recommend listings

Agent 不需要盲目處理所有欄位。先用結構化欄位做篩選,只在需要時再抓取更深層頁面。

如何選擇 SERP API?

對 Google Jobs scraping 來說,選型時應比較 field completeness、JSON quality、location controls、pricing model 和 schema stability。

你可以用 SerpApi、Bright Data、Serper.dev、SearchAPI 或 Talordata 測試這類 workflow。真正重要的是 response 是否能返回乾淨的職缺欄位,讓你的 script、dashboard 或 AI workflow 直接使用。

如果只是快速 prototype,輕量 Google Search API 可能已經足夠。如果要跨國家、城市和職類長期監測職缺資料,就需要更好的 localization、穩定 JSON、可靠 retry 和可預期的 usable result 成本。

正式選型前,可以用同樣 20 個 job queries 測試 2–3 個 provider,然後比較:

  • 返回職缺數量

  • 缺失 company name 的比例

  • 缺失 apply link 的比例

  • location 是否準確

  • posted date 是否可用

  • duplicate listings 數量

  • cost per usable job record

這個小測試通常比看功能清單更有價值。

FAQ

什麼是 Google Jobs scraping?

Google Jobs scraping 是指從 Google Jobs results 中收集結構化職缺資料,例如職缺標題、公司、工作地點、來源平台、描述、發布時間和申請連結。

可以用 Python 擷取 Google Jobs results 嗎?

可以。最簡單的方式是使用 Python 調用 SERP API,接收結構化 JSON,解析 jobs result array,並將欄位匯出為 CSV 或寫入資料庫。

Google Jobs 應該提取哪些欄位?

可以先提取 title、company name、job location、source platform、description、posting date、schedule type、job ID 和 apply link。也應保存 query、search location、language 和 timestamp 等 metadata。

Google Jobs data 對 AI Agent 有用嗎?

有用。AI Agent 可以用 Google Jobs results 發現職缺、總結市場需求、比較公司招聘方向、按地點或工作類型篩選職位,並支援 recruiting workflow。

結語

擷取 Google Jobs results,不只是收集職缺列表,而是把搜尋結果轉化為結構化招聘資料。

先從明確 query 開始。使用 SERP API 獲取 JSON。提取 title、company、location、source、description、posting date 和 apply link。再保存 metadata,方便之後比較。

當資料被結構化後,它可以支援市場研究、招聘工具、競爭對手監測、dashboard 和 AI recruiting agent。

立即開展您的數據業務

加入全球最強大的代理網絡

免費試用