כיצד לגרד את Indeed עם Python (ולמנוע שגיאות 403) ב-2026

עודכן לאחרונה ב- April 22, 2026
כיצד לגרד את Indeed עם Python (ולמנוע שגיאות 403) ב-2026

בערך איפשהו סביב ההעתקה־והדבקה החמישים של כותרת משרה מ-Indeed לגיליון אלקטרוני, התחלתי לפקפק בבחירות הקריירה שלי. אם אי פעם ניסית לחלץ נתונים מובְנים מ-Indeed באופן תכנותי, אתה כבר מכיר את הפאנץ' ליין: שגיאת 403 היא לא תקלה — זו תכונת ההגנה של מערכת ההגנה של Indeed.

Indeed הוא לוח הדרושים הגדול בעולם, עם בערך 350 מיליון מבקרים חודשיים ייחודיים, 130 מיליון משרות בכל רגע נתון, ופעילות ביותר מ-60 מדינות. זה הופך אותו לאחד ממקורות נתוני שוק העבודה העשירים ביותר על פני כדור הארץ — וגם לאחד הקשים ביותר לגריפה. פרויקט הקוד הפתוח JobFunnel (עם אלפי כוכבי GitHub) ממש נכנס לארכיון על ידי המתחזק שלו בדצמבר 2025 אחרי שנים של הפסדים במרוץ החימוש נגד בוטים. במילותיו של המתחזק: "כל המשתמשים יכולים לגרד חלק מהמשרות, אבל מהר מאוד נתקלים בקפצ'ה, והגריפה נכשלת, כך שלא מתקבלות משרות." תורם אחר דיווח שקיבל CAPTCHA כבר בבקשה הראשונה. אז כן — זו לא מטרה פשוטה לגריפה. במדריך הזה אעבור על כל שיטה מעשית לגריפת Indeed עם Python, אראה לך איך באמת לשרוד את משוכת ה-403, ו—למי שמעדיף לדלג על כל הבאגים — אדגים חלופה ללא קוד באמצעות Thunderbit.

מה זה אומר לגרד את Indeed עם Python?

Web Scraping, בבסיסו, הוא חילוץ אוטומטי של נתונים מובְנים מדפי אינטרנט. כשמדברים על גריפת Indeed עם Python, הכוונה היא לכתיבת סקריפט שמבקר בדפי תוצאות החיפוש ובדפי פרטי המשרה של Indeed, קורא את ה-HTML הבסיסי (או נתונים מוטמעים), ומחלץ שדות כמו כותרת המשרה, החברה, המיקום, השכר והתיאור לפורמט שימושי — CSV, מסד נתונים או Google Sheet.

ספריות Python הטיפוסיות שמעורבות הן Requests (לבקשות HTTP), BeautifulSoup (לניתוח HTML), ו-Selenium או Playwright (לאוטומציה של דפדפן). אבל Indeed הוא לא אתר סטטי פשוט. זהו אתר היברידי: HTML שנוצר בצד השרת עם בלוב JSON מוטמע, ומוגן על ידי Cloudflare Bot Management. המשמעות היא שה-Scraper שלך צריך להתמודד עם תוכן שנוצר ב-JavaScript, שמות מחלקות CSS מתחלפים, והגנות אגרסיביות נגד בוטים — וכל זה עוד לפני שפרסת כותרת משרה אחת.

גם אין ב-2026 API חינמי ורשמי של Indeed לקריאה בלבד. Publisher Jobs API הישן הוצא משימוש סביב 2020, ומה שנשאר מיועד לצד המעסיקים בלבד (Job Sync, Sponsored Jobs). לכן גריפה או תשלום לספק נתונים צד שלישי הן למעשה האפשרויות הריאליות היחידות.

למה לגרד נתוני משרות מ-Indeed?

הצד העסקי של גריפת Indeed פשוט: גלישה ידנית באלפי מודעות היא לא פרקטית, והנתונים בתוך המודעות האלה באמת שווים הרבה.

indeed_stats_dca2a43cec.png

מקרה שימושמי מרוויחדוגמה
יצירת לידיםצוותי מכירות וגיוסבניית רשימות של חברות מגייסות עם פרטי קשר
מחקר שוק העבודהאנליסטים, צוותי HRזיהוי מיומנויות בולטות, מדדי שכר לפי אזור
מודיעין תחרותימעסיקים, סוכנויות השמהמעקב אחר דפוסי גיוס והצעות שכר של מתחרים
אוטומציה אישית לחיפוש עבודהמחפשי עבודהאיגוד משרות שעונות לקריטריונים שלך ממיקומים שונים
נתוני אימון למודלי MLמדעני נתוניםבניית מודלים לחיזוי שכר על סמך נתונים היסטוריים

המחקר של Indeed Hiring Lab עצמו מאשר שנתוני המשרות מתאימים מקרוב ל-BLS JOLTS ויכולים לשמש קירוב כמעט בזמן אמת לתנאי שוק העבודה בארה״ב. קרנות גידור משתמשות במהירות פרסום המשרות כאות נתונים חלופי. צוותי HR משווים תגמול באמצעות טווחי שכר שנגרפו. ומגייסים בונים רשימות לקוחות פוטנציאליים מתוך חברות שמגייסות באופן פעיל.

הערה מעשית: נתוני השכר ב-Indeed משתפרים, אבל עדיין אינם שלמים. נכון לאמצע 2025, בערך 59% מהמשרות בארה״ב כוללות מידע על שכר, אבל רק כ-22% מציגות מספר מדויק — והשאר הן טווחים. כל ניתוח שכר המבוסס על נתוני Indeed צריך לקחת את החסר הזה בחשבון.

איך לבחור שיטה לגריפת Indeed עם Python

אין דרך אחת "נכונה" לגרד את Indeed. הגישה הטובה ביותר תלויה ברמת המיומנות שלך, בכמות הנתונים שאתה צריך, ובכמות התחזוקה שאתה מוכן לסבול. בדקתי את כל ארבע הגישות המרכזיות, והנה ההשוואה ביניהן:

קריטריוןBS4 + RequestsSeleniumJSON סמוי (window.mosaic)ללא קוד (Thunderbit)
קושימתחילבינוניבינוני-מתקדםאין (2 קליקים)
מהירותמהירהאיטית (רינדור דפדפן)מהירהמהירה (גריפה בענן)
תוכן שנוצר ב-JSלאכןכן (נתונים מוטמעים)כן
עמידות בפני בוטיםנמוכהבינונית (ניתנת לזיהוי)בינונית-גבוההגבוהה (מטופלת אוטומטית)
תחזוקה כש-HTML משתנהגבוהה (הסלקטורים נשברים)גבוההבינונית (מבנה JSON יציב יותר)אין (ה-AI מסתגל)
מתאים במיוחד לאבטיפוס מהירדפים דינמיים, תוכן מאחורי התחברותנתונים מובְנים בכמות גדולהלא-מפתחים, תוצאות מהירות

המדריך הזה עובר על כל אחת מהשיטות. אם אתה מפתח Python, כדאי לקרוא את החלקים על BS4, JSON סמוי ו-Selenium. אם אתה לא כותב קוד (או פשוט עייף מבאגי 403), דלג קדימה לחלק של Thunderbit.

לפני שמתחילים

  • רמת קושי: מתחיל עד בינוני (בחלקי Python); אין (בחלק של Thunderbit)
  • זמן נדרש: כ-20–60 דקות להגדרת Python ולגריפה הראשונה; כ-2 דקות עם Thunderbit
  • מה צריך: Python 3.9+, עורך קוד, דפדפן Chrome, ו-(למסלול ללא קוד) את תוסף Chrome של Thunderbit

הגדרת סביבת Python לגריפת Indeed

לפני שכותבים קוד גריפה, צריך להכין את הסביבה.

התקנת הספריות הדרושות

צור סביבה וירטואלית והתקן את החבילות שתצטרך:

python -m venv indeed_env
source indeed_env/bin/activate  # ב-Windows: indeed_env\Scripts\activate

# לגישת HTTP + ניתוח
pip install requests beautifulsoup4 lxml httpx

# לגישת ה-JSON הסמוי (מומלץ)
pip install curl_cffi parsel tenacity

# לגישת אוטומציית דפדפן
pip install selenium

כמה הערות:

  • curl_cffi הוא ברירת המחדל של 2026 לגריפה של אתרים המוגנים על ידי Cloudflare. הוא מחקה חתימות TLS אמיתיות של דפדפן, דבר ש-requests ו-httpx רגילים לא מסוגלים לעשות. עוד על למה זה חשוב בחלק על אנטי-בוט.
  • Selenium 4.6+ מגיע עם Selenium Manager, כך שכבר לא צריך להוריד ידנית את ChromeDriver — הוא מנהל את קובץ הדפדפן אוטומטית.
  • השתמש ב-lxml כ-parser של BeautifulSoup. הוא בערך מהיר פי 1.5 מה-html.parser המובנה של Python.

יצירת מבנה הפרויקט שלך

שמור על זה פשוט:

indeed_scraper/
├── scraper.py
├── requirements.txt
└── output/

כל דוגמאות הקוד בהמשך מתבססות על scraper.py.

איך לגרד את Indeed עם Python באמצעות BeautifulSoup

זו הגישה הידידותית למתחילים: משתמשים ב-requests כדי להביא את הדף וב-BeautifulSoup כדי לנתח את ה-HTML. הכי מהיר להקמה, אבל גם הכי שביר ב-Indeed.

שלב 1: בניית כתובת החיפוש של Indeed

כתובות החיפוש של Indeed עוקבות אחרי תבנית צפויה:

https://www.indeed.com/jobs?q=<query>&l=<location>&start=<offset>

לדוגמה, חיפוש "data analyst" ב-"Austin, TX" החל מהעמוד הראשון:

from urllib.parse import urlencode

params = {
    "q": "data analyst",
    "l": "Austin, TX",
    "start": 0,
}
url = f"https://www.indeed.com/jobs?{urlencode(params)}"
print(url)
# https://www.indeed.com/jobs?q=data+analyst&l=Austin%2C+TX&start=0

Indeed מחלק את התוצאות במרווחים של 10, עם תקרה קשיחה של 1,000 תוצאות (start <= 990). כל היסט מעל 990 מחזיר בשקט את אותו דף.

שלב 2: שליחת בקשת HTTP עם כותרות מתאימות

Indeed חוסם מיידית בקשות עם מחרוזות User-Agent ברירת מחדל של Python. צריך כותרות ריאליסטיות:

import requests

headers = {
    "User-Agent": (
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
        "(KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36"
    ),
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
    "Accept-Language": "en-US,en;q=0.9",
    "Accept-Encoding": "gzip, deflate, br",
    "Referer": "https://www.indeed.com/",
}

response = requests.get(url, headers=headers, timeout=30)
print(response.status_code)

אם קיבלת 200, כרגע נכנסת. אם קיבלת 403, Cloudflare תפס אותך. (עוד על איך לשרוד את זה בהמשך.)

שלב 3: ניתוח רשימות המשרות מתוך ה-HTML

השתמש ב-BeautifulSoup כדי לבחור רכיבי כרטיסי משרה. עדיף למקד ל-data-testid — הם יציבים יותר משמות המחלקות האקראיים של Indeed:

from bs4 import BeautifulSoup

soup = BeautifulSoup(response.text, "lxml")
cards = soup.find_all("div", attrs={"data-testid": "slider_item"})

jobs = []
for card in cards:
    title_el = card.find("h2", class_="jobTitle")
    title = title_el.get_text(strip=True) if title_el else None
    company = card.find(attrs={"data-testid": "company-name"})
    location = card.find(attrs={"data-testid": "text-location"})
    link = title_el.find("a")["href"] if title_el and title_el.find("a") else None

    jobs.append({
        "title": title,
        "company": company.get_text(strip=True) if company else None,
        "location": location.get_text(strip=True) if location else None,
        "url": f"https://www.indeed.com{link}" if link else None,
    })

print(f"Found {len(jobs)} jobs")

שלב 4: טיפול בדפדוף בין עמודים

לולאה דרך הדפים על ידי הגדלת הפרמטר start:

import time, random

all_jobs = []
for page in range(0, 50, 10):  # 5 העמודים הראשונים
    params["start"] = page
    url = f"https://www.indeed.com/jobs?{urlencode(params)}"
    response = requests.get(url, headers=headers, timeout=30)
    # ... לנתח כפי שמופיע למעלה ...
    all_jobs.extend(jobs)
    time.sleep(random.uniform(3, 6))

מגבלות של הגישה הזו

אומר את זה בגלוי: BS4 + Requests היא השיטה החלשה ביותר ל-Indeed ב-2026. requests רגיל משתמש בספריית ה-TLS המובנית של Python, שמייצרת טביעת JA3 ש-Cloudflare מזהה מייד כ"לא דפדפן." היא גם לא תומכת ב-HTTP/2, ש-Indeed כן מספקת. סביר שתיחסם אחרי כמה עמודים. ומה לגבי הסלקטורים? Indeed מחליף שמות מחלקות כמו css-1m4cuuf ו-jobsearch-JobComponent-embeddedBody-1n0gh5s לעיתים קרובות — כך שכל סלקטור שמכוון אליהם הוא פצצה מתקתקת.

השתמש בשיטה הזו לאבטיפוס מהיר על דף אחד. לכל דבר בקנה מידה, עדיף להשתמש בגישת ה-JSON הסמוי.

איך לגרד את Indeed עם Python באמצעות נתוני JSON סמויים

זו השיטה שאני ממליץ עליה לרוב מפתחי Python. במקום לנתח רכיבי HTML שבירים, מחלצים נתונים מובְנים ממשתנה JavaScript המוטמע בקוד המקור של Indeed: window.mosaic.providerData["mosaic-provider-jobcards"].

כל שדה שמעניין אותך — כותרת המשרה, החברה, המיקום, השכר, מפתח המשרה, תאריך הפרסום, דגל עבודה מרחוק — כבר נמצא בבלוב ה-JSON הזה. לא צריך להריץ JavaScript. הסכמה יציבה לפחות מאז 2023, ולכן היא עמידה הרבה יותר מסלקטורים ב-DOM.

שלב 1: להביא את HTML הדף

השתמש ב-curl_cffi במקום requests — הוא מחקה חתימות TLS אמיתיות של דפדפן, וזה קריטי לשרידות מול Cloudflare:

from curl_cffi import requests as cffi_requests

response = cffi_requests.get(
    "https://www.indeed.com/jobs?q=python+developer&l=Remote&start=0",
    impersonate="chrome124",
    headers={
        "Accept-Language": "en-US,en;q=0.9",
        "Referer": "https://www.indeed.com/",
    },
    timeout=30,
)
print(response.status_code, len(response.text))

למה curl_cffi? זו מעטפת Python מעל curl-impersonate, המשחזרת בדיוק את ה-TLS ClientHello, את מסגרת HTTP/2 SETTINGS, ואת סדר הכותרות של דפדפנים אמיתיים. זהו לקוח ה-HTTP של Python המתוחזק הפעיל היחיד שעוקף גם JA3/JA4 וגם את טביעת Akamai H2 בקריאה אחת. יעדי התחזות נתמכים כוללים chrome120, chrome124, chrome131, Safari וגרסאות Edge.

שלב 2: חילוץ ה-JSON באמצעות ביטוי רגולרי

בלוב ה-JSON מוטמע בתוך תגית <script>. נחלץ אותו עם regex:

import re, json

MOSAIC_RE = re.compile(
    r'window\.mosaic\.providerData\["mosaic-provider-jobcards"\]=(\{.+?\});',
    re.DOTALL,
)

match = MOSAIC_RE.search(response.text)
if match:
    data = json.loads(match.group(1))
    results = data["metaData"]["mosaicProviderJobCardsModel"]["results"]
    print(f"נמצאו {len(results)} משרות ב-JSON הסמוי")
else:
    print("ה-JSON הסמוי לא נמצא — ייתכן חסימה או שינוי בדף")

שלב 3: ניתוח שדות המשרה מתוך ה-JSON

כל פריט ב-results מכיל יותר נתונים ממה שנראה בדף:

jobs = []
for job in results:
    jobs.append({
        "jobkey": job["jobkey"],
        "title": job["title"],
        "company": job.get("company"),
        "location": job.get("formattedLocation"),
        "remote": job.get("remoteLocation"),
        "salary": (job.get("salarySnippet") or {}).get("text"),
        "posted": job.get("formattedRelativeTime"),
        "job_type": job.get("jobTypes"),
        "easy_apply": job.get("indeedApplyEnabled"),
        "url": f"https://www.indeed.com/viewjob?jk={job['jobkey']}",
    })

ה-JSON כולל לעיתים קרובות גם הערכות שכר, מאפייני טקסונומיה (תגי מיומנות), ודירוגי חברה שלא תמיד נראים ב-HTML המרונדר.

שלב 4: גריפה של כמה עמודים

השתמש ב-tierSummaries שב-JSON כדי להבין את סך התוצאות, ואז לולאה:

import time, random

all_jobs = []
for start in range(0, 50, 10):  # 5 העמודים הראשונים
    url = f"https://www.indeed.com/jobs?q=python+developer&l=Remote&start={start}&sort=date"
    response = cffi_requests.get(
        url,
        impersonate="chrome124",
        headers={"Accept-Language": "en-US,en;q=0.9", "Referer": "https://www.indeed.com/"},
        timeout=30,
    )
    match = MOSAIC_RE.search(response.text)
    if match:
        data = json.loads(match.group(1))
        results = data["metaData"]["mosaicProviderJobCardsModel"]["results"]
        all_jobs.extend([{
            "jobkey": j["jobkey"],
            "title": j["title"],
            "company": j.get("company"),
            "location": j.get("formattedLocation"),
            "salary": (j.get("salarySnippet") or {}).get("text"),
            "url": f"https://www.indeed.com/viewjob?jk={j['jobkey']}",
        } for j in results])
    time.sleep(random.uniform(3, 7))

print(f"סה״כ נגרדו {len(all_jobs)} משרות")

למה JSON סמוי עמיד יותר

המבנה window.mosaic.providerData משתנה בתדירות נמוכה יותר משמות מחלקות CSS. מקבלים נתונים מסודרים ומובְנים בלי לנתח HTML מבולגן. עם זאת, עדיין צריך מיתון אנטי-בוטים (כותרות, השהיות, פרוקסי) — ועל זה נדבר מיד.

איך לגרד את Indeed עם Python באמצעות Selenium

Selenium היא הגישה של אוטומציית דפדפן. היא שימושית כשצריך אינטראקציה עם הדף — למשל לחיצה לתוך פאנלים של פרטי משרה, טיפול בתוכן שמאחורי התחברות, או גריפת תיאורים שנטענים דינמית ואינם ב-HTML הראשוני.

מתי להשתמש ב-Selenium במקום בלקוחות HTTP

  • Indeed טוען חלק מהתוכן באופן דינמי (תיאורי משרה מלאים בפאנל הימני)
  • צריך לגרד דפים שדורשים מצב סשן או התחברות
  • מבצעים גריפה קטנה שבה המהירות אינה קריטית

מעבר מהיר

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
import time

options = Options()
options.add_argument("--disable-blink-features=AutomationControlled")
# options.add_argument("--headless=new")  # Headless מזוהה יותר — להשתמש בזהירות

driver = webdriver.Chrome(options=options)
driver.get("https://www.indeed.com/jobs?q=data+engineer&l=New+York")
time.sleep(3)

cards = driver.find_elements(By.CSS_SELECTOR, "[data-testid='slider_item']")
for card in cards:
    try:
        title = card.find_element(By.CSS_SELECTOR, "h2.jobTitle").text
        company = card.find_element(By.CSS_SELECTOR, "[data-testid='company-name']").text
        location = card.find_element(By.CSS_SELECTOR, "[data-testid='text-location']").text
        print(f"{title} | {company} | {location}")
    except Exception:
        continue

driver.quit()

מגבלות

Selenium איטית — כל דף דורש רינדור מלא של דפדפן. Chrome במצב headless ניתן לזיהוי על ידי מערכת האנטי-בוט של Indeed (Cloudflare בודקת navigator.webdriver, מחרוזות של ספק WebGL, ספירת תוספים ועוד). אפילו undetected-chromedriver רק מעכב את הזיהוי; הוא לא מונע אותו לצמיתות. וכמו ב-BS4, הסלקטורים שלך יישברו כשהממשק של Indeed יתעדכן.

לרוב השימושים, גישת ה-JSON הסמוי נותנת לך את אותם נתונים מהר יותר ועם פחות תחזוקה. שמור את Selenium למקרי קצה שבהם באמת צריך דפדפן.

איך להימנע משגיאות 403 כשמגרדים את Indeed עם Python

זה החלק החשוב ביותר. אם הגעת לכאן מחיפוש גוגל מתוסכל, אתה במקום הנכון.

indeed_antibot_374d080ff4.png

למה Indeed חוסם את ה-Scraper שלך

Indeed משתמש ב-Cloudflare Bot Management יחד עם Cloudflare Turnstile — לא ב-DataDome, לא ב-PerimeterX. כותרות התגובה מאשרות זאת: server: cloudflare, cf-ray, ו-cookie ניהול-הבוט __cf_bm. Cloudflare בוחן את טביעת ה-TLS שלך (JA3/JA4), את סדר הכותרות ב-HTTP/2, את דפוסי הבקשות ואת אותות ההתנהגות של הדפדפן. אם אחד מהם נראה לא אנושי, תקבל 403, 429, 503, או — המקרה הערמומי ביותר — 200 OK עם דף אתגר Turnstile במקום נתוני משרה אמיתיים.

החלפת User-Agent וכותרות בקשה

User-Agent קבוע אחד הוא הדרך המהירה ביותר להיחסם. כדאי להחליף מתוך מאגר של מחרוזות עדכניות וריאליסטיות. חשוב: שדות גרסת המשנה של Chrome נעולים על 0.0.0 מאז User-Agent Reduction — אל תמציא גרסאות משניות לא־אפסיות, אחרת מערכות אנטי-בוט יסמנו אותך.

import random

USER_AGENTS = [
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
    "(KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 "
    "(KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
    "(KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36 Edg/145.0.3800.97",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101 Firefox/128.0",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 "
    "(KHTML, like Gecko) Version/17.4 Safari/605.1.15",
]

headers = {
    "User-Agent": random.choice(USER_AGENTS),
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
    "Accept-Language": "en-US,en;q=0.9",
    "Accept-Encoding": "gzip, deflate, br, zstd",
    "Referer": "https://www.indeed.com/",
    "Sec-Fetch-Dest": "document",
    "Sec-Fetch-Mode": "navigate",
    "Sec-Fetch-Site": "same-origin",
}

ודא גם שכותרות ה-sec-ch-ua שלך תואמות לגרסת ה-UA. sec-ch-ua: "Chrome";v="131" לצד User-Agent שטוען ל-Chrome 145 הוא דגל אדום מיידי.

הוספת השהיות אקראיות בין בקשות

מרווחים קבועים מזוהים על ידי ניתוח דפוסים. השתמש ב-jitter אקראי:

import time, random

# בין כל בקשה
time.sleep(random.uniform(3, 6))

# בהמתנה אחרי חסימה
def backoff_sleep(attempt):
    base = 4
    sleep_time = base * (2 ** attempt) + random.uniform(0, 2)
    time.sleep(min(sleep_time, 60))

הסכמה המקובלת לפי ScrapeOps ו-WebScraping.AI היא 3–6 שניות בין בקשות לכל IP, עם תקרה קשיחה של בערך 100 בקשות לכל IP לכל סשן לפני שמחליפים.

שימוש ברוטציית פרוקסי

זהו הגורם המשמעותי ביותר להצלחה. פרוקסי דאטה-סנטר מכתובות AWS/GCP מצליחים בערך ב-5–15% מול יעדי Cloudflare Enterprise — למעשה לא שמישים ב-Indeed. פרוקסי Residential יחד עם טביעת TLS נכונה מטפסים ל-80–95% הצלחה.

PROXIES = [
    "http://user:pass@us.residential.example:7777",
    "http://user:pass@us.residential.example:7778",
    "http://user:pass@us.residential.example:7779",
]

proxy = random.choice(PROXIES)
response = cffi_requests.get(
    url,
    impersonate="chrome124",
    headers=headers,
    proxies={"https": proxy},
    timeout=30,
)

תמחור פרוקסי Residential ב-2026 עומד בערך על $4–8.50 לג׳יגה־בייט בהתאם לספק ולרמת ההתחייבות. עבור Indeed במיוחד, כדאי להתחיל עם מאגר קטן ולהגדיל לפי הצורך.

טיפול אלגנטי בקודי מצב 403, 429 ו-503

אל תנסה שוב בעיוורון. קודי מצב שונים אומרים דברים שונים:

def fetch_with_retry(url, proxy_pool, max_retries=5):
    for attempt in range(max_retries):
        proxy = random.choice(proxy_pool)
        headers["User-Agent"] = random.choice(USER_AGENTS)
        try:
            r = cffi_requests.get(
                url,
                impersonate=random.choice(["chrome124", "chrome120", "edge101"]),
                headers=headers,
                proxies={"https": proxy},
                timeout=30,
            )
            # בדיקת המקרה הערמומי של "200 עם אתגר"
            if r.status_code == 200 and "cf-turnstile" not in r.text and "Just a moment" not in r.text:
                return r

            if r.status_code == 403:
                print(f"403 — נחסמת. מחליף פרוקסי, ניסיון {attempt + 1}")
            elif r.status_code == 429:
                print(f"429 — הגבלת קצב. מאט את הקצב.")
            elif r.status_code == 503:
                print(f"503 — השרת עמוס או שיש אתגר JS.")

            backoff_sleep(attempt)
        except Exception as e:
            print(f"שגיאת בקשה: {e}")
            backoff_sleep(attempt)

    raise RuntimeError(f"נכשל אחרי {max_retries} ניסיונות: {url}")

המקרה של 200-עם-אתגר הוא המסובך ביותר. תמיד סרוק את גוף התגובה אחרי cf-turnstile או Just a moment לפני שאתה מתייחס ל-200 כהצלחה.

החלופה הקלה יותר: לתת ל-Thunderbit לטפל באנטי-בוט עבורך

למשתמשים שלא רוצים לבנות ולתחזק מאגרי פרוקסי, רוטציית כותרות והתחזות לטביעות TLS, הגריפה בענן של Thunderbit מטפלת אוטומטית ב-CAPTCHAs, ברוטציית פרוקסי ובהגנות נגד בוטים. בלי הגדרת פרוקסי, בלי קונפיגורציה של curl_cffi, בלי ספריות לפתרון CAPTCHA. זה המסלול עם הכי פחות חיכוך כשפשוט צריך את הנתונים.

למה ה-Scraper שלך ל-Indeed ממשיך להישבר (ואיך לתקן את זה)

חומת ה-403 היא הכאב החריף. הכאב הכרוני הוא התחזוקה — Scrapers שעובדים היום נשברים בשבוע הבא, ומחזירים בשקט נתונים ריקים או תוצאות מיושנות.

איך Indeed שובר את הסלקטורים שלך

Indeed מחליף שמות מחלקות CSS באגרסיביות. המדריך של Bright Data מזהיר במפורש שמחלקות כמו css-1m4cuuf ו-css-1rqpxry "נראות כאילו נוצרו באקראי — כנראה בזמן הבנייה." בדיקות A/B משמען שסשנים שונים רואים פריסות דף שונות. ושינויי DOM קורים בלי הודעה מראש.

סאגת JobFunnel מלמדת. תורם אחד דיווח: "CaptchaBuster הצליח לצמצם את הקפצ'ה, והסיבה לכך שהגריפה עדיין לא הצליחה [הייתה] סלקטורים מיושנים של BeautifulSoup." ה-Scraper לא נחסם — הוא פשוט ניתח את הרכיבים הלא נכונים.

אסטרטגיה: להעדיף JSON סמוי על פני ניתוח DOM

הבלוב window.mosaic.providerData יציב מבחינת סכימה לפחות מאז 2023. הנתיב metaData.mosaicProviderJobCardsModel.results[] עדיין הקנוני ב-2026. סלקטורים ב-DOM נשברים חודשית. חילוץ JSON נשבר, אם בכלל, בתדירות שנתית.

אסטרטגיה: להשתמש במאפייני נתונים במקום בשמות מחלקות

כשכן צריך לגעת ב-DOM, עדיף לכוון למאפיינים פונקציונליים:

סלקטורמטרה
[data-testid="slider_item"]מכלול כרטיס משרה
[data-testid="job-title"] או h2.jobTitle > aקישור כותרת המשרה
[data-testid="company-name"]שם המעסיק
[data-testid="text-location"]טקסט המיקום
data-jk="<jobkey>" על כל כרטיסה-hook היציב ביותר — לא השתנה מאז 2019

הוספת בדיקות Assert כדי לזהות סלקטורים מיושנים

לעולם אל תיתן ל-Scraper שלך לרוץ בשקט עם אפס תוצאות. הוסף בדיקה אחרי כל שליפה:

results = parse_hidden_json(html)
assert len(results) > 0, (
    f"Indeed החזיר קבוצת תוצאות ריקה ב-start={start} — "
    "ייתכן חסימה, CAPTCHA או שינוי בסלקטורים. "
    f"500 התווים הראשונים של התגובה: {html[:500]}"
)

תעד את 500–2000 התווים הראשונים של התגובה הגולמית במקרה של כשל. כך תוכל לדעת מיד אם קיבלת אתגר Turnstile, קיר התחברות או שינוי בסכימה. הפעל בדיקת עשן יומית ברמת CI מול שאילתה קבועה (למשל q=python&l=remote) שמוודאת שיש תוצאות לא-אפסיות.

החלופה מבוססת ה-AI: Scrapers שלעולם לא נשברים

ה-AI של Thunderbit קורא את מבנה הדף מחדש בכל פעם — הוא לא מסתמך על סלקטורים קשיחים או על תבניות regex קבועות. כש-Indeed משנה את ה-HTML שלו, Thunderbit מסתגל אוטומטית. זה מטפל ישירות בעומס התחזוקה שמשתמשים בפורומים מציינים שוב ושוב כהתסכלות העיקרית שלהם. אם אי פעם התעוררת להודעת Slack שאומרת "ה-Scraper מחזיר שוב שורות ריקות," אתה יודע כמה שווה לא לתקן את זה.

לגרד את Indeed בלי לכתוב Python: החלופה ללא קוד

כל מדריך מתחרה מניח שתכתוב קוד Python. אבל נתוני הפורומים מספרים סיפור אחר. משתמשים אומרים דברים כמו "זה פשוט כל כך קשה עם באגים ושגיאות כל הזמן" ויש מי שמציעים לשכור מישהו ב-Fiverr רק כדי להוציא את הנתונים. אם זה נשמע כמוך, החלק הזה הוא נתיב המילוט שלך.

איך לגרד את Indeed עם Thunderbit (שלב אחר שלב)

שלב 1: התקן את תוסף Chrome של Thunderbit מחנות Chrome. אפשר להתחיל בחינם.

שלב 2: נווט לדף תוצאות חיפוש של Indeed בדפדפן שלך — לדוגמה, https://www.indeed.com/jobs?q=data+analyst&l=Austin%2C+TX.

שלב 3: לחץ על סמל Thunderbit בסרגל הכלים של הדפדפן, ואז לחץ על "AI Suggest Fields." ה-AI של Thunderbit סורק את הדף ומזהה אוטומטית עמודות כמו Job Title, Company, Location, Salary, Job URL ו-Posted Date. אפשר לסקור ולכוונן את השדות המוצעים — להסיר עמודות שאינך צריך, או להוסיף עמודות מותאמות אישית על ידי תיאור פשוט של מה שאתה רוצה.

שלב 4: לחץ על "Scrape." Thunderbit מחלץ את הנתונים מהדף ומציג אותם בטבלה מובְנית. אמורות להופיע שורות של משרות עם השדות שהגדרת.

העשרה באמצעות גריפת תתי-דפים

אחרי גריפת דף הרשימה, לחץ על "Scrape Subpages" כדי ש-Thunderbit יבקר בכל דף משרה בנפרד. הוא מחלץ תיאורי משרה מלאים, דרישות, הטבות וקישורי הגשה — בלי צורך בהגדרה נוספת. זה המקביל לכתיבת Scraper Python שני שמבקר בכל כתובת /viewjob?jk=<jobkey>, רק שזה לוקח קליק אחד.

טיפול אוטומטי בדפדוף בין עמודים

Thunderbit מטפל אוטומטית בדפדוף מבוסס קליקים של Indeed. אין צורך לבנות ידנית כתובות עם היסטים או לכתוב לולאות פגינציה. הוא לוחץ דרך העמודים ומאגד את התוצאות.

ייצוא לכלים המועדפים עליך

ייצא נתונים שנגרפו ל-CSV, Excel, Google Sheets, Airtable או Notion — לגמרי בחינם. אין צורך לכתוב קוד כמו csv.writer() או pandas.to_csv().

מתי להשתמש ב-Python לעומת Thunderbit

תרחישהכלי הטוב ביותר
צינורות נתונים מותאמים אישית, אוטומציה מתוזמנת דרך cron/AirflowPython
שילוב בתוך קודבס רחב יותרPython
לוגיקת ניתוח מותאמת מאודPython
מחקר חד-פעמי או ניתוח שוקThunderbit
חברי צוות לא טכניים צריכים נתוניםThunderbit
לקבל נתונים עכשיו בלי באגי 403Thunderbit
העשרת תתי-דפים בלי שום הגדרהThunderbit

השוואת זמן: הקמת Python + איתור באגים באנטי-בוט = שעות עד ימים (במיוחד בפעם הראשונה). Thunderbit = פחות מ-2 דקות לאותם נתונים. אני לא אומר ש-Python שגוי — אני אומר שזה תלוי במה שאתה צריך.

האם גריפת Indeed חוקית? מה צריך לדעת

אף אחד ממדריכי הגריפה המובילים של Indeed לא מתייחס לחוקיות, וזה מפתיע בהתחשב בכמה פעמים עולה השאלה "האם גריפת Indeed חוקית?" בפורומים. זו לא ייעוץ משפטי, אבל הנה תמונת המצב.

תנאי השימוש של Indeed

לתנאי השימוש של Indeed (indeed.com/legal) אין סעיף גורף של "אין לגרד". האיסור המפורש היחיד על אוטומציה הוא בסעיף A.3.5, האוסר "שימוש בכל אוטומציה, סקריפטים או בוטים כדי לאוטומט את תהליך Indeed Apply." זה תחום מצומצם לזרימת ההגשה, לא לקריאה פסיבית של מודעות משרות ציבוריות. כלי האכיפה העיקרי של Indeed הוא טכני — אתגרי Cloudflare, חסימות IP, טביעת אצבע של מכשיר — ולא בית המשפט.

תקדימים משפטיים רלוונטיים

התיק האמריקאי המצוטט ביותר הוא hiQ Labs v. LinkedIn. בית המשפט של המעגל התשיעי קבע באפריל 2022 שגריפה של נתונים נגישים לציבור "כנראה אינה מפרה את CFAA" (Computer Fraud and Abuse Act). עם זאת, hiQ נמצא בהמשך אחראי להפרת חוזה משום שעובדיו יצרו פרופילי LinkedIn מזויפים והסכימו לתנאים.

לאחרונה יותר, Meta v. Bright Data (מחוז צפון קליפורניה, ינואר 2024) הניב פסיקה ברורה עוד יותר. השופט Chen קבע שתנאי השימוש של Facebook ו-Instagram "אינם אוסרים גריפה של נתונים ציבוריים כאשר המשתמש מנותק." Meta מחקה מרצונה את יתר התביעות בחודש שלאחר מכן.

קובץ robots.txt של Indeed

ה-robots.txt של Indeed אוסר באופן רחב על /jobs/ ועל /job/ עבור User-agent: * ברירת המחדל, אבל מאפשר במפורש ל-Googlebot ול-Bingbot לגשת ל-/viewjob? — דפי פרטי המשרה הבודדים. סורקי אימון ל-AI (GPTBot, CCBot, anthropic-ai) מוגבלים מאוד. robots.txt אינו מחייב משפטית בארה״ב, אבל כיבודו הוא תרגול מומלץ והוכחה לתום לב.

הנחיות מעשיות לגריפה אחראית

  • גרד רק נתונים הזמינים לציבור — לעולם אל תיכנס, לעולם אל תיצור חשבונות מזויפים
  • כבד מגבלות קצב: בקשה אחת כל 3–6 שניות לכל IP, תחרותיות חד-ספרתית
  • אל תפרסם מחדש את הנתונים שנגרפו כלוח דרושים משלך
  • השתמש בנתונים למחקר אישי או פנימי, לא למכירה מסחרית מחדש בלי אישור
  • מחק או גבה חשיש ל-PII שאינך צריך; הגדר תקרת שימור על נתונים סמוכים-אישית
  • אם אתה פועל בהיקף גדול או באיחוד האירופי/בריטניה, התייעץ עם עורך דין — חובות השקיפות של סעיף 14 ב-GDPR חלות על נתונים אישיים שנגרפו

ספקטרום הסיכון: אוטומציה אישית לחיפוש עבודה נמצאת בקצה הנמוך. מכירה מסחרית בקנה מידה גדול של נתוני Indeed נמצאת בקצה הגבוה.

סיכום ונקודות עיקריות

גריפת Indeed עם Python אפשרית, אבל זה לא פרויקט סופ״ש שמגדירים ושוכחים. ההגנה של Cloudflare, הסלקטורים המתחלפים, והאמצעים האגרסיביים נגד בוטים של Indeed אומרת שצריך לגשת לזה עם הכלים הנכונים ועם ציפיות נכונות.

הנה מה שהייתי לוקח מכל זה:

  • Indeed הוא מקור נתוני שוק העבודה העשיר ביותר ברשת — 350 מיליון מבקרים חודשיים, 130 מיליון משרות — אבל הוא נלחם בחזרה חזק מול Scrapers.
  • חילוץ JSON סמוי (window.mosaic.providerData) הוא הגישה העמידה ביותר ב-Python. הסכמה יציבה כבר שנים, בעוד שסלקטורים CSS נשברים מדי חודש.
  • curl_cffi עם התחזות לדפדפן הוא לקוח ה-HTTP ברירת המחדל של 2026 לאתרים המוגנים על ידי Cloudflare. requests ו-httpx רגילים נחסמים כבר על בסיס טביעת TLS בלבד.
  • תמיד השתמש בכותרות מתחלפות, השהיות אקראיות ופרוקסי Residential כדי להימנע משגיאות 403. פרוקסי דאטה-סנטר כמעט חסרי תועלת מול Cloudflare Enterprise.
  • הוסף בדיקות assert כדי לדעת מיד מתי סלקטורים נשברים או מתי הדף שמוחזר הוא דף אתגר במקום נתוני משרות.
  • למשתמשים לא-טכניים או לכל מי שרוצה תוצאות מהר, Thunderbit מספק נתיב ללא קוד, מבוסס AI, שמסתגל לשינויים באתר אוטומטית — בלי פרוקסי, בלי איתור באגים, בלי תחזוקה.

אם תרצה לנסות את המסלול ללא קוד, Thunderbit מציע שכבה חינמית כדי שתוכל לבדוק אותו על Indeed בלי התחייבות. ואם אתה הולך על מסלול Python, דוגמאות הקוד למעלה הן נקודת התחלה טובה — רק זכור להתייחס לעמידות נגד בוטים כאל שיקול מרכזי, לא כאל מחשבה מאוחרת.

למידע נוסף על גישות וכלים ל-Web Scraping, עיין במדריכים שלנו על איך לגרד אתרים עם Python, הכלים האוטומטיים הטובים ביותר ל-Web Scraping, ו-איך לגרוף אתרים בלי להיחסם. אפשר גם לצפות בהדרכות ב-ערוץ YouTube של Thunderbit.

נסה את Thunderbit כדי לגרד נתוני Indeed מהר יותר Get Started Free

שאלות נפוצות

אילו ספריות Python הכי טובות לגריפת Indeed?

לבקשות HTTP, curl_cffi היא הבחירה החזקה ביותר ב-2026 — היא מחקה חתימות TLS אמיתיות של דפדפן, דבר שחיוני לעקיפת Cloudflare. httpx עם HTTP/2 היא חלופה סבירה ליעדים פחות מוגנים. לניתוח HTML, BeautifulSoup4 עם lxml עדיין היא הסטנדרט. לאוטומציית דפדפן, Playwright (עם playwright-stealth) או undetected-chromedriver עובדים, אם כי שניהם מזוהים יותר ויותר. גישת ה-regex של JSON סמוי (window.mosaic.providerData) חוסכת בכלל את הצורך בניתוח כבד.

למה אני ממשיך לקבל שגיאות 403 כשאני מגרד את Indeed?

Indeed משתמש ב-Cloudflare Bot Management, שבוחן את טביעת ה-TLS שלך (JA3/JA4), את סדר הכותרות ב-HTTP/2, את דפוסי הבקשות ואת התנהגות הדפדפן. אם אתה משתמש ב-requests רגיל, טביעת ה-TLS שלך מזהה אותך מיד כסקריפט Python — ה-403 מגיע לפני שהכותרות שלך בכלל נקראות. תקן זאת על ידי מעבר ל-curl_cffi עם התחזות לדפדפן, רוטציה של מחרוזות User-Agent ריאליסטיות, הוספת השהיות אקראיות (3–6 שניות), ושימוש בפרוקסי Residential. בדוק גם את המקרה של "200 עם אתגר Turnstile" — סרוק את גופי התגובה לאיתור cf-turnstile.

אפשר לגרד את Indeed בלי קוד?

כן. כלים כמו Thunderbit מאפשרים לך לחלץ רשימות משרות מ-Indeed בכמה קליקים — מתקינים את תוסף Chrome, עוברים לדף חיפוש של Indeed, לוחצים על "AI Suggest Fields," ואז על "Scrape." ה-AI של Thunderbit מזהה אוטומטית שדות כמו כותרת משרה, חברה, מיקום ושכר. הוא מטפל בפגינציה, בהעשרת תתי-דפים (תיאורי משרה מלאים), ובהגנות אנטי-בוט באופן אוטומטי. אפשר לייצא ל-CSV, Google Sheets, Airtable או Notion בחינם.

באיזו תדירות Indeed משנה את מבנה ה-HTML שלו?

Indeed מחליף באופן קבוע שמות מחלקות CSS (למשל css-1m4cuuf, מחרוזות hash אקראיות) ומשנה מבני DOM בלי הודעה מראש. בדיקות A/B אומרות שמשתמשים שונים עשויים לראות פריסות שונות בו-זמנית. גישת ה-JSON הסמוי (window.mosaic.providerData) יציבה הרבה יותר — הסכמה נשארה עקבית לפחות מאז 2023. כשחייבים להשתמש בסלקטורים ב-DOM, עדיף למקד למאפייני data-testid ול-data-jk (מפתח משרה) במקום למחלקות CSS.

האם זה חוקי לגרד את Indeed?

גריפה כאשר המשתמש מנותק מכתובות ציבוריות של Indeed לא צפויה ליצור אחריות לפי CFAA בארה״ב, על בסיס פסיקת hiQ v. LinkedIn של המעגל התשיעי (2022) וההחלטה ב-Meta v. Bright Data (2024). תנאי השימוש של Indeed אוסרים במיוחד על אוטומציה של תהליך ההגשה, לא על קריאה פסיבית של רישומים ציבוריים. עם זאת, תמיד גרד באחריות: אל תיכנס, אל תיצור חשבונות מזויפים, כבד מגבלות קצב, אל תפרסם מחדש את הנתונים כלוח דרושים משלך, וטפל בזהירות בכל נתון אישי (שמות מגייסים, אימיילים) בהתאם ל-GDPR/CCPA. בפעילות בהיקף מסחרי, התייעץ עם עורך דין.

מידע נוסף

Fawad Khan
Fawad Khan
פוואד כותב למחייתו, ובכנות — הוא די אוהב את זה. הוא השקיע שנים בלגלות מה גורם לשורת קופי להיתקע בזיכרון, ומה גורם לקוראים פשוט לדפדף הלאה. תשאלו אותו על שיווק, והוא יוכל לדבר שעות. תשאלו אותו על קרבונרה, והוא ידבר עוד יותר.
תוכן עניינים

גרדו דף אינטרנט פשוט על ידי בקשה

תגידו מה צריך באנגלית פשוטה. או אפילו לא צריך להגיד כלום.

נסו את Thunderbit חינם
חילוץ נתונים באמצעות AI
העבירו נתונים בקלות ל-Google Sheets, Airtable או Notion
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week