Πώς να κάνετε Scrape το Indeed με Python (και να αποφύγετε τα σφάλματα 403) το 2026

Τελευταία ενημέρωση: April 22, 2026
Πώς να κάνετε Scrape το Indeed με Python (και να αποφύγετε τα σφάλματα 403) το 2026

Κάπου γύρω στην πεντηκοστή φορά που έκανα copy-paste έναν τίτλο θέσης από το Indeed σε ένα υπολογιστικό φύλλο, άρχισα να αμφισβητώ τις επαγγελματικές μου επιλογές. Αν έχετε προσπαθήσει ποτέ να αντλήσετε δομημένα δεδομένα από το Indeed προγραμματιστικά, ξέρετε ήδη το αστείο: το σφάλμα 403 δεν είναι bug — είναι χαρακτηριστικό του αμυντικού συστήματος του Indeed.

Το Indeed είναι το μεγαλύτερο job board στον κόσμο, με περίπου 350 εκατομμύρια μοναδικούς επισκέπτες τον μήνα, 130 εκατομμύρια αγγελίες εργασίας οποιαδήποτε στιγμή και δραστηριότητα σε 60+ χώρες. Αυτό το κάνει μία από τις πλουσιότερες πηγές δεδομένων για την αγορά εργασίας στον πλανήτη — και μία από τις πιο δύσκολες για scraping. Ο ανοιχτού κώδικα scraper JobFunnel (με χιλιάδες αστέρια στο GitHub) αρχειοθετήθηκε από τον maintainer του τον Δεκέμβριο του 2025, έπειτα από χρόνια απωλειών στον πόλεμο κατά των bot. Τα ίδια τα λόγια του maintainer: "All users can scrape some jobs, but are quickly hit by captcha, and the scraping fails, yielding no jobs." Ένας άλλος contributor ανέφερε ότι πήρε CAPTCHA από το πρώτο κιόλας αίτημα. Άρα ναι — αυτό δεν είναι καθόλου απλό target για scraping. Σε αυτόν τον οδηγό, θα σας δείξω κάθε πρακτική μέθοδο για scrape το Indeed με Python, θα σας δείξω πώς να επιβιώσετε πραγματικά από τη δοκιμασία του 403 και — για όσους προτιμούν να παραλείψουν εντελώς το debugging — θα δείξω μια no-code εναλλακτική με το Thunderbit.

Τι σημαίνει να κάνετε Scrape το Indeed με Python;

Το web scraping, στην ουσία του, είναι η αυτοματοποιημένη εξαγωγή δομημένων δεδομένων από ιστοσελίδες. Όταν μιλάμε για scraping του Indeed με Python, εννοούμε ότι γράφουμε ένα script που επισκέπτεται τα αποτελέσματα αναζήτησης και τις σελίδες λεπτομερειών αγγελίας στο Indeed, διαβάζει το υποκείμενο HTML (ή τα ενσωματωμένα δεδομένα) και αντλεί πεδία όπως τίτλο θέσης, εταιρεία, τοποθεσία, μισθό και περιγραφή σε μια μορφή που μπορεί να χρησιμοποιηθεί — ένα CSV, μια βάση δεδομένων, ένα Google Sheet.

Οι συνήθεις Python βιβλιοθήκες που εμπλέκονται είναι οι Requests (για HTTP calls), BeautifulSoup (για ανάλυση HTML) και Selenium ή Playwright (για αυτοματοποίηση browser). Όμως το Indeed δεν είναι ένα απλό στατικό site. Είναι ένα υβρίδιο: HTML που αποδίδεται από τον server με ένα ενσωματωμένο JSON state blob, μπροστά από το οποίο βρίσκεται το Cloudflare Bot Management. Αυτό σημαίνει ότι ο scraper σας πρέπει να χειριστεί περιεχόμενο που αποδίδεται μέσω JavaScript, CSS class names που αλλάζουν, και επιθετικές αντι-bot προστασίες — πριν καν αναλύσετε έναν μόνο τίτλο εργασίας.

Επίσης, το 2026 δεν υπάρχει επίσημο, δωρεάν, read-only Indeed API. Το παλιό Publisher Jobs API καταργήθηκε γύρω στο 2020, και ό,τι απέμεινε αφορά μόνο εργοδότες (Job Sync, Sponsored Jobs). Άρα το scraping ή η πληρωμή τρίτου παρόχου δεδομένων είναι οι μόνες ρεαλιστικές επιλογές.

Γιατί να κάνετε Scrape τα δεδομένα εργασίας του Indeed;

Το επιχειρηματικό σκεπτικό για scraping του Indeed είναι ξεκάθαρο: η χειροκίνητη περιήγηση σε χιλιάδες αγγελίες είναι μη πρακτική, και τα δεδομένα μέσα σε αυτές τις αγγελίες είναι πραγματικά πολύτιμα.

indeed_stats_dca2a43cec.png

ΧρήσηΠοιοι ωφελούνταιΠαράδειγμα
Δημιουργία leadsΟμάδες πωλήσεων & στελέχωσηςΔημιουργία λιστών εταιρειών που προσλαμβάνουν με στοιχεία επικοινωνίας
Έρευνα αγοράς εργασίαςΑναλυτές, ομάδες HRΕντοπισμός δεξιοτήτων που ανεβαίνουν, benchmarks μισθών ανά περιοχή
Ανταγωνιστική πληροφόρησηΕργοδότες, γραφεία στελέχωσηςΠαρακολούθηση μοτίβων προσλήψεων και προσφορών μισθού των ανταγωνιστών
Αυτοματοποίηση προσωπικής αναζήτησης εργασίαςΥποψήφιοιΣυγκέντρωση αγγελιών που ταιριάζουν στα κριτήριά σας σε πολλές τοποθεσίες
Δεδομένα εκπαίδευσης για μοντέλα MLData scientistsΔημιουργία μοντέλων πρόβλεψης μισθών από ιστορικά δεδομένα

Η ίδια η έρευνα του Indeed Hiring Lab επιβεβαιώνει ότι τα δεδομένα αγγελιών ακολουθούν στενά τα BLS JOLTS και μπορούν να λειτουργήσουν ως σχεδόν real-time proxy για τις συνθήκες της αγοράς εργασίας στις ΗΠΑ. Τα hedge funds χρησιμοποιούν τον ρυθμό δημοσίευσης αγγελιών ως εναλλακτικό data signal. Οι ομάδες HR κάνουν benchmarking αποδοχών με βάση τα scraped salary ranges. Και οι recruiters φτιάχνουν prospect lists από εταιρείες που προσλαμβάνουν ενεργά.

Μια πρακτική σημείωση: τα salary data στο Indeed βελτιώνονται, αλλά εξακολουθούν να είναι ατελή. Στα μέσα του 2025, περίπου 59% των αμερικανικών αγγελιών περιλαμβάνουν πληροφορίες μισθού, αλλά μόνο περίπου 22% δίνουν ακριβές ποσό — τα υπόλοιπα είναι ranges. Οποιαδήποτε ανάλυση μισθών βασισμένη σε δεδομένα του Indeed πρέπει να λάβει υπόψη αυτή τη σπανιότητα.

Πώς να επιλέξετε μέθοδο για να κάνετε Scrape το Indeed με Python

Δεν υπάρχει ένας και μοναδικός «σωστός» τρόπος για scraping του Indeed. Η καλύτερη προσέγγιση εξαρτάται από το επίπεδο δεξιοτήτων σας, πόσα δεδομένα χρειάζεστε και πόση συντήρηση είστε διατεθειμένοι να ανεχθείτε. Έχω δοκιμάσει και τις τέσσερις βασικές προσεγγίσεις, και ιδού πώς συγκρίνονται:

ΚριτήριοBS4 + RequestsSeleniumΚρυφό JSON (window.mosaic)No-Code (Thunderbit)
ΔυσκολίαΑρχάριοςΕνδιάμεσοςΕνδιάμεσος-ΠροχωρημένοςΚαμία (2 κλικ)
ΤαχύτηταΓρήγορηΑργή (απόδοση browser)ΓρήγορηΓρήγορη (cloud scraping)
Περιεχόμενο που αποδίδεται με JSΌχιΝαιΝαι (ενσωματωμένα δεδομένα)Ναι
Ανθεκτικότητα σε anti-botΧαμηλήΜεσαία (ανιχνεύσιμη)Μεσαία-ΥψηλήΥψηλή (χειρίζεται αυτόματα)
Συντήρηση όταν αλλάζει το HTMLΥψηλή (σπάνε τα selectors)ΥψηλήΜεσαία (η JSON δομή είναι πιο σταθερή)Καμία (η AI προσαρμόζεται)
Ιδανικό γιαΓρήγορα πρωτότυπαΔυναμικές σελίδες, content πίσω από loginΜαζικά δομημένα δεδομέναΜη προγραμματιστές, γρήγορα αποτελέσματα

Αυτός ο οδηγός περνάει από κάθε μέθοδο. Αν είστε Python developer, αξίζει να διαβάσετε τα τμήματα BS4, Κρυφό JSON και Selenium. Αν δεν γράφετε κώδικα (ή απλώς έχετε βαρεθεί να διορθώνετε 403), πηδήξτε κατευθείαν στην ενότητα για το Thunderbit.

Πριν ξεκινήσετε

  • Δυσκολία: Αρχάριος έως Ενδιάμεσος (ενότητες Python)· Καμία (ενότητα Thunderbit)
  • Απαιτούμενος χρόνος: ~20–60 λεπτά για ρύθμιση Python και πρώτο scrape· ~2 λεπτά με το Thunderbit
  • Τι θα χρειαστείτε: Python 3.9+, έναν code editor, browser Chrome και (για τη no-code διαδρομή) το Thunderbit Chrome Extension

Ρύθμιση του Python περιβάλλοντος σας για Scraping του Indeed

Πριν γράψετε οποιονδήποτε κώδικα scraping, ετοιμάστε το περιβάλλον σας.

Εγκαταστήστε τις απαραίτητες βιβλιοθήκες

Δημιουργήστε ένα virtual environment και εγκαταστήστε τα πακέτα που θα χρειαστείτε:

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

# Για την προσέγγιση αυτοματοποίησης browser
pip install selenium

Μερικές σημειώσεις:

  • Το curl_cffi είναι το default του 2026 για scraping sites που προστατεύονται από Cloudflare. Μιμείται πραγματικά browser TLS fingerprints, κάτι που δεν μπορούν να κάνουν τα απλά requests και httpx. Περισσότερα για το γιατί αυτό έχει σημασία στο τμήμα anti-bot.
  • Το Selenium 4.6+ περιλαμβάνει το Selenium Manager, οπότε δεν χρειάζεται πια να κατεβάζετε χειροκίνητα το ChromeDriver — διαχειρίζεται αυτόματα το browser binary.
  • Χρησιμοποιήστε το lxml ως parser backend για το BeautifulSoup. Είναι περίπου 1,5x ταχύτερο από το stdlib html.parser.

Δημιουργήστε τη δομή του project σας

Κρατήστε το απλό:

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

Όλα τα παραδείγματα κώδικα παρακάτω βασίζονται στο scraper.py.

Πώς να κάνετε Scrape το Indeed με Python χρησιμοποιώντας BeautifulSoup

Αυτή είναι η προσέγγιση φιλική προς αρχάριους: χρησιμοποιείτε requests για να φέρετε τη σελίδα και BeautifulSoup για να αναλύσετε το HTML. Είναι η πιο γρήγορη στη ρύθμιση, αλλά και η πιο εύθραυστη στο Indeed.

Βήμα 1: Δημιουργήστε το URL αναζήτησης του Indeed

Τα search URLs του 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 κάνει pagination ανά 10 αποτελέσματα, με σκληρό ανώτατο όριο 1.000 αποτελεσμάτων (start <= 990). Κάθε offset πάνω από το 990 επιστρέφει αθόρυβα την ίδια σελίδα.

Βήμα 2: Στείλτε ένα HTTP αίτημα με σωστά headers

Το Indeed μπλοκάρει αμέσως αιτήματα με default Python user-agent strings. Χρειάζεστε ρεαλιστικά headers:

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 για να επιλέξετε στοιχεία καρτών θέσεων. Στοχεύστε attributes data-testid — είναι πιο σταθερά από τα τυχαία CSS class names του 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"Βρέθηκαν {len(jobs)} θέσεις")

Βήμα 4: Χειριστείτε το pagination

Κάντε loop στις σελίδες αυξάνοντας την παράμετρο 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 βιβλιοθήκη της stdlib της Python, η οποία παράγει ένα JA3 fingerprint που το Cloudflare αναγνωρίζει αμέσως ως «όχι browser». Επίσης δεν υποστηρίζει HTTP/2, το οποίο σερβίρει το Indeed. Πιθανότατα θα μπλοκαριστείτε μετά από λίγες μόνο σελίδες. Και τα CSS selectors; Το Indeed αλλάζει class names όπως css-1m4cuuf και jobsearch-JobComponent-embeddedBody-1n0gh5s συχνά — οπότε κάθε selector που τα στοχεύει είναι ωρολογιακή βόμβα.

Χρησιμοποιήστε αυτή τη μέθοδο για γρήγορα πρωτότυπα σε μία μόνο σελίδα. Για οτιδήποτε σε κλίμακα, χρησιμοποιήστε την προσέγγιση κρυφού JSON.

Πώς να κάνετε Scrape το Indeed με Python χρησιμοποιώντας Κρυφά JSON δεδομένα

Αυτή είναι η μέθοδος που προτείνω για τους περισσότερους Python developers. Αντί να αναλύετε εύθραυστα HTML στοιχεία, εξάγετε δομημένα δεδομένα από μια JavaScript μεταβλητή ενσωματωμένη στο page source του Indeed: window.mosaic.providerData["mosaic-provider-jobcards"].

Κάθε πεδίο που σας ενδιαφέρει — τίτλος θέσης, εταιρεία, τοποθεσία, μισθός, job key, ημερομηνία δημοσίευσης, ένδειξη remote — υπάρχει ήδη μέσα σε αυτό το JSON blob. Δεν απαιτείται εκτέλεση JavaScript. Το schema έχει παραμείνει σταθερό τουλάχιστον από το 2023, κάτι που το κάνει πολύ πιο ανθεκτικό από τα DOM selectors.

Βήμα 1: Φέρτε το HTML της σελίδας

Χρησιμοποιήστε curl_cffi αντί για requests — μιμείται πραγματικά browser TLS fingerprints, κάτι κρίσιμο για να επιβιώσετε από το 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 binding πάνω στο curl-impersonate, το οποίο αναπαράγει ακριβώς το TLS ClientHello, το HTTP/2 SETTINGS frame και τη σειρά των headers των πραγματικών browsers. Είναι ο μόνος ενεργά συντηρούμενος Python HTTP client που νικά και τα JA3/JA4 και το Akamai H2 fingerprint με ένα μόνο call. Οι υποστηριζόμενοι στόχοι impersonation περιλαμβάνουν chrome120, chrome124, chrome131, Safari και εκδόσεις Edge.

Βήμα 2: Εξαγάγετε το JSON με κανονική έκφραση

Το JSON blob είναι ενσωματωμένο σε ένα <script> tag. Τραβήξτε το με 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 συχνά περιλαμβάνει εκτιμήσεις μισθών, taxonomy attributes (ετικέτες δεξιοτήτων) και αξιολογήσεις εταιρειών που δεν είναι πάντα ορατές στο rendered HTML.

Βήμα 4: Κάντε scrape σε πολλές σελίδες

Χρησιμοποιήστε τα tierSummaries στο JSON για να καταλάβετε το σύνολο των αποτελεσμάτων και μετά κάντε loop:

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)} θέσεις που έγινε scrape")

Γιατί το κρυφό JSON είναι πιο ανθεκτικό

Η δομή window.mosaic.providerData αλλάζει λιγότερο συχνά από τα CSS class names. Παίρνετε καθαρά, δομημένα δεδομένα χωρίς να αναλύετε ακατάστατο HTML. Παρ’ όλα αυτά, εξακολουθείτε να χρειάζεστε anti-bot μετριασμό (headers, καθυστερήσεις, proxies) — κάτι που θα καλύψουμε αμέσως μετά.

Πώς να κάνετε Scrape το Indeed με Python χρησιμοποιώντας Selenium

Το Selenium είναι η προσέγγιση αυτοματοποίησης browser. Είναι χρήσιμο όταν χρειάζεται να αλληλεπιδράσετε με τη σελίδα — να κάνετε κλικ σε panels λεπτομερειών θέσης, να χειριστείτε περιεχόμενο πίσω από login ή να κάνετε scrape περιγραφές που φορτώνονται δυναμικά και δεν υπάρχουν στο αρχικό HTML.

Πότε να χρησιμοποιήσετε Selenium αντί για HTTP clients

  • Το Indeed φορτώνει μέρος του περιεχομένου δυναμικά (πλήρεις περιγραφές θέσεων στο δεξί panel)
  • Πρέπει να κάνετε scrape σελίδες που απαιτούν session state ή login
  • Κάνετε μικρής κλίμακας scraping όπου η ταχύτητα δεν είναι κρίσιμη

Γρήγορη παρουσίαση

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 είναι αργό — κάθε σελίδα απαιτεί πλήρη απόδοση browser. Το headless Chrome είναι ανιχνεύσιμο από το anti-bot σύστημα του Indeed (το Cloudflare ελέγχει navigator.webdriver, strings του WebGL vendor, counts των plugins και άλλα). Ακόμα και το undetected-chromedriver απλώς καθυστερεί την ανίχνευση· δεν την αποτρέπει μόνιμα. Και όπως και το BS4, τα selectors σας θα σπάσουν όταν το Indeed ενημερώσει το UI του.

Για τις περισσότερες χρήσεις, η προσέγγιση του κρυφού JSON σας δίνει τα ίδια δεδομένα πιο γρήγορα και με λιγότερη συντήρηση. Κρατήστε το Selenium για περιπτώσεις όπου πραγματικά χρειάζεστε browser.

Πώς να αποφύγετε σφάλματα 403 όταν κάνετε Scrape το Indeed με Python

Αυτή είναι η ενότητα που έχει τη μεγαλύτερη σημασία. Αν φτάσατε εδώ από ένα εκνευρισμένο Google search, είστε στο σωστό μέρος.

indeed_antibot_374d080ff4.png

Γιατί το Indeed μπλοκάρει τον scraper σας

Το Indeed χρησιμοποιεί Cloudflare Bot Management μαζί με Cloudflare Turnstile — όχι DataDome, όχι PerimeterX. Τα headers της απάντησης το επιβεβαιώνουν: server: cloudflare, cf-ray και το cookie διαχείρισης bot __cf_bm. Το Cloudflare ελέγχει το TLS fingerprint σας (JA3/JA4), τη σειρά των HTTP/2 headers, τα μοτίβα αιτήσεων και τα σήματα συμπεριφοράς του browser. Αν κάποιο από αυτά μοιάζει μη ανθρώπινο, θα πάρετε 403, 429, 503 ή — στη πιο ύπουλη περίπτωση — ένα 200 OK με σελίδα πρόκλησης Turnstile αντί για πραγματικά δεδομένα θέσεων.

Περιστρέψτε το User-Agent και τα request headers

Ένα μόνο, στατικό User-Agent είναι ο πιο γρήγορος τρόπος να μπλοκαριστείτε. Περιστρέψτε από μια δεξαμενή σύγχρονων, ρεαλιστικών strings. Σημαντικό: τα minor-version fields του Chrome είναι κλειδωμένα στο 0.0.0 από το User-Agent Reduction — μην επινοείτε μη μηδενικές minor εκδόσεις ή τα anti-bots θα σας σημαδέψουν.

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 Client Hints ταιριάζουν με την έκδοση του UA. Ένα sec-ch-ua: "Chrome";v="131" δίπλα σε User-Agent που δηλώνει Chrome 145 είναι άμεσο red flag.

Προσθέστε τυχαίες καθυστερήσεις ανάμεσα στα αιτήματα

Τα σταθερά διαστήματα εντοπίζονται από pattern detection. Χρησιμοποιήστε τυχαίο jitter:

import time, random

# Ανάμεσα σε κάθε αίτημα
time.sleep(random.uniform(3, 6))

# Σε retry μετά από μπλοκάρισμα
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 ανά session πριν γίνει rotation.

Χρησιμοποιήστε rotation proxies

Αυτός είναι ο μεγαλύτερος μεμονωμένος παράγοντας επιτυχίας. Τα datacenter proxies από AWS/GCP ranges πιάνουν περίπου 5–15% επιτυχία σε Cloudflare Enterprise targets — πρακτικά άχρηστα στο Indeed. Residential proxies μαζί με σωστό TLS fingerprinting ανεβάζουν την επιτυχία στο 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 proxies το 2026 κυμαίνονται περίπου στα $4–8.50 ανά GB, ανάλογα με τον πάροχο και το επίπεδο δέσμευσης. Για το Indeed ειδικά, ξεκινήστε με μικρό pool και κλιμακώστε ανάλογα με τις ανάγκες.

Χειριστείτε σωστά τους κωδικούς 403, 429 και 503

Μην κάνετε απλώς blind retries. Οι διαφορετικοί κωδικοί σημαίνουν διαφορετικά πράγματα:

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 με challenge"
            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 — μπλοκάρισμα. Αλλαγή proxy, προσπάθεια {attempt + 1}")
            elif r.status_code == 429:
                print("429 — περιορισμός ρυθμού. Επιβράδυνση.")
            elif r.status_code == 503:
                print("503 — υπερφόρτωση server ή πρόκληση JS.")

            backoff_sleep(attempt)
        except Exception as e:
            print(f"Σφάλμα αιτήματος: {e}")
            backoff_sleep(attempt)

    raise RuntimeError(f"Αποτυχία μετά από {max_retries} retries: {url}")

Η περίπτωση 200-with-challenge είναι η πιο δύσκολη. Πάντα σαρώνετε το response body για δείκτες όπως cf-turnstile ή Just a moment πριν θεωρήσετε ότι το 200 σημαίνει επιτυχία.

Η πιο εύκολη εναλλακτική: αφήστε το Thunderbit να χειριστεί το anti-bot για εσάς

Για χρήστες που δεν θέλουν να φτιάξουν και να συντηρούν pools από proxies, rotation headers και TLS fingerprint impersonation, το cloud scraping του Thunderbit χειρίζεται αυτόματα CAPTCHA, rotation proxies και anti-bot προστασίες. Χωρίς ρύθμιση proxy, χωρίς παραμετροποίηση curl_cffi, χωρίς βιβλιοθήκες επίλυσης CAPTCHA. Είναι η διαδρομή με τη λιγότερη τριβή όταν απλώς χρειάζεστε τα δεδομένα.

Γιατί ο scraper σας στο Indeed συνεχίζει να χαλάει (και πώς να το διορθώσετε)

Το 403 wall είναι ο οξύς πόνος. Ο χρόνιος πόνος είναι η συντήρηση — scrapers που δουλεύουν σήμερα χαλάνε την επόμενη εβδομάδα, επιστρέφοντας σιωπηλά κενά δεδομένα ή παλιά αποτελέσματα.

Πώς το Indeed σπάει τα selectors σας

Το Indeed αλλάζει τα CSS class names επιθετικά. Ο οδηγός της Bright Data προειδοποιεί ρητά ότι classes όπως css-1m4cuuf και css-1rqpxry «φαίνεται να παράγονται τυχαία — πιθανότατα κατά το build time». Το A/B testing σημαίνει ότι διαφορετικά sessions βλέπουν διαφορετικά layouts. Και η αναδιάρθρωση του DOM γίνεται χωρίς προειδοποίηση.

Η ιστορία του JobFunnel είναι διδακτική. Ένας contributor ανέφερε: "CaptchaBuster has successfully mitigated the captcha, and the reason for still unsuccessfully scraping the page [is] due to outdated beautiful soup selectors." Ο scraper δεν μπλοκαρίστηκε — απλώς διάβαζε τα λάθος στοιχεία.

Στρατηγική: Προτιμήστε το κρυφό JSON αντί για parsing του DOM

Το blob window.mosaic.providerData έχει παραμείνει schema-stable τουλάχιστον από το 2023. Η διαδρομή metaData.mosaicProviderJobCardsModel.results[] παραμένει canonical το 2026. Τα DOM selectors σπάνε κάθε μήνα. Η εξαγωγή JSON σπάει ετησίως, αν σπάσει καθόλου.

Στρατηγική: Χρησιμοποιήστε data attributes αντί για class names

Όταν πραγματικά χρειάζεται να αγγίξετε το DOM, στοχεύστε λειτουργικά attributes:

SelectorΣκοπός
[data-testid="slider_item"]Το container κάθε κάρτας θέσης
[data-testid="job-title"] ή h2.jobTitle > aΟ σύνδεσμος του τίτλου της θέσης
[data-testid="company-name"]Το όνομα του εργοδότη
[data-testid="text-location"]Το κείμενο της τοποθεσίας
data-jk="<jobkey>" σε κάθε κάρταΤο πιο σταθερό hook — αμετάβλητο από το 2019

Προσθέστε assertion checks για να εντοπίζετε παλιούς selectors

Ποτέ μην αφήνετε τον scraper σας να τρέχει σιωπηλά με μηδενικά αποτελέσματα. Προσθέστε έλεγχο μετά από κάθε fetch:

results = parse_hidden_json(html)
assert len(results) > 0, (
    f"Το Indeed επέστρεψε κενό σύνολο αποτελεσμάτων στο start={start} — "
    "πιθανό μπλοκάρισμα, CAPTCHA ή μετατόπιση selectors. "
    f"Τα πρώτα 500 chars της απάντησης: {html[:500]}"
)

Καταγράψτε τα πρώτα 500–2000 characters της raw απάντησης σε περίπτωση αποτυχίας. Έτσι μπορείτε αμέσως να καταλάβετε αν λάβατε πρόκληση Turnstile, wall σύνδεσης ή αλλαγή schema. Τρέξτε ένα καθημερινό smoke test επιπέδου CI σε ένα σταθερό query (π.χ. q=python&l=remote) που να επιβεβαιώνει ότι τα αποτελέσματα δεν είναι μηδενικά.

Η AI εναλλακτική: scrapers που δεν σπάνε ποτέ

Το Thunderbit διαβάζει τη δομή της σελίδας φρέσκια κάθε φορά — δεν βασίζεται σε hardcoded selectors ή regex patterns. Όταν το Indeed αλλάζει το HTML του, το Thunderbit προσαρμόζεται αυτόματα. Αυτό αντιμετωπίζει άμεσα το βάρος συντήρησης που οι χρήστες των forums αναφέρουν σταθερά ως τη μεγαλύτερη ενόχλησή τους. Αν έχετε ξυπνήσει ποτέ με μήνυμα στο Slack που λέει «ο scraper επιστρέφει πάλι κενές γραμμές», ξέρετε την αξία του να μην χρειάζεται να το διορθώσετε.

Scrape το Indeed χωρίς να γράψετε Python: η no-code εναλλακτική

Κάθε ανταγωνιστικός οδηγός υποθέτει ότι θα γράψετε Python code. Όμως τα δεδομένα των forums λένε κάτι διαφορετικό. Οι χρήστες λένε πράγματα όπως "it's just so difficult with constant bugs and errors" και κάποιοι προτείνουν να προσλάβετε κάποιον στο Fiverr μόνο και μόνο για να πάρετε τα δεδομένα. Αν αυτό σας θυμίζει τον εαυτό σας, αυτή η ενότητα είναι η έξοδος διαφυγής σας.

Πώς να κάνετε Scrape το Indeed με το Thunderbit (βήμα προς βήμα)

Βήμα 1: Εγκαταστήστε το Thunderbit Chrome Extension από το Chrome Web Store. Είναι δωρεάν για να ξεκινήσετε.

Βήμα 2: Μεταβείτε σε μια σελίδα αποτελεσμάτων αναζήτησης του Indeed στον browser σας — για παράδειγμα, https://www.indeed.com/jobs?q=data+analyst&l=Austin%2C+TX.

Βήμα 3: Κάντε κλικ στο εικονίδιο του Thunderbit στη γραμμή εργαλείων του browser και μετά πατήστε "AI Suggest Fields." Η AI του Thunderbit σαρώνει τη σελίδα και εντοπίζει αυτόματα στήλες όπως Τίτλος Θέσης, Εταιρεία, Τοποθεσία, Μισθός, URL Θέσης και Ημερομηνία Δημοσίευσης. Μπορείτε να ελέγξετε και να προσαρμόσετε τα προτεινόμενα πεδία — να αφαιρέσετε στήλες που δεν χρειάζεστε ή να προσθέσετε προσαρμοσμένες περιγράφοντας τι θέλετε σε απλά αγγλικά.

Βήμα 4: Πατήστε "Scrape." Το Thunderbit εξάγει τα δεδομένα από τη σελίδα και τα εμφανίζει σε δομημένο πίνακα. Θα πρέπει να δείτε γραμμές από αγγελίες εργασίας με τα πεδία που ρυθμίσατε.

Εμπλουτισμός με scraping υποσελίδων

Αφού κάνετε scrape τη σελίδα λιστών, πατήστε "Scrape Subpages" ώστε το Thunderbit να επισκεφθεί κάθε μεμονωμένη σελίδα λεπτομερειών θέσης. Αντλεί πλήρεις περιγραφές θέσεων, απαιτούμενα προσόντα, παροχές και links αίτησης — χωρίς πρόσθετη ρύθμιση. Αυτό είναι το ισοδύναμο του να γράψετε έναν δεύτερο Python scraper για να επισκέπτεται κάθε URL /viewjob?jk=<jobkey>, μόνο που χρειάζεται ένα κλικ.

Αυτόματο χειρισμό pagination

Το Thunderbit χειρίζεται αυτόματα το click-based pagination του Indeed. Δεν χρειάζεται να φτιάχνετε χειροκίνητα offset URLs ή να γράφετε loops pagination. Κάνει κλικ ανάμεσα στις σελίδες και συγκεντρώνει τα αποτελέσματα.

Εξαγωγή στα αγαπημένα σας εργαλεία

Εξαγάγετε τα scraped δεδομένα σε CSV, Excel, Google Sheets, Airtable ή Notion — εντελώς δωρεάν. Δεν χρειάζεται να γράψετε κώδικα csv.writer() ή pandas.to_csv().

Πότε να χρησιμοποιήσετε Python vs. Thunderbit

ΣενάριοΚαλύτερο εργαλείο
Προσαρμοσμένα data pipelines, προγραμματισμένη αυτοματοποίηση μέσω cron/AirflowPython
Ενσωμάτωση σε μεγαλύτερο codebasePython
Πολύ προσαρμοσμένη λογική ανάλυσηςPython
Εφάπαξ έρευνα ή ανάλυση αγοράςThunderbit
Μέλη μη τεχνικής ομάδας χρειάζονται δεδομέναThunderbit
Θέλετε δεδομένα τώρα χωρίς debugging 403Thunderbit
Εμπλουτισμός υποσελίδων χωρίς καμία ρύθμισηThunderbit

Σύγκριση χρόνου: Ρύθμιση Python + debugging anti-bot = ώρες έως ημέρες (ειδικά την πρώτη φορά). Thunderbit = κάτω από 2 λεπτά για τα ίδια δεδομένα. Δεν λέω ότι η Python είναι λάθος — λέω ότι εξαρτάται από το τι χρειάζεστε.

Είναι νόμιμο το Scraping του Indeed; Τι πρέπει να ξέρετε

Κανένας από τους κορυφαίους οδηγούς για scraping του Indeed δεν αγγίζει τη νομιμότητα, κάτι που είναι περίεργο αν σκεφτεί κανείς πόσο συχνά εμφανίζεται το ερώτημα "Is scraping Indeed legal?" στα forums. Αυτό δεν αποτελεί νομική συμβουλή, αλλά ιδού το τοπίο.

Οι όροι χρήσης του Indeed

Οι Όροι Χρήσης του Indeed (indeed.com/legal) δεν περιέχουν γενική ρήτρα «no scraping». Η μόνη ρητή απαγόρευση αυτοματοποίησης είναι η Ενότητα A.3.5, που απαγορεύει τη "use of any automation, scripting, or bots to automate the Indeed Apply process." Αυτό περιορίζεται στενά στη ροή Apply, όχι στην παθητική ανάγνωση δημόσιων αγγελιών. Το βασικό εργαλείο επιβολής του Indeed είναι τεχνικό — προκλήσεις Cloudflare, IP bans, device fingerprinting — όχι οι αίθουσες δικαστηρίων.

Σχετικό νομικό προηγούμενο

Η πιο συχνά αναφερόμενη υπόθεση στις ΗΠΑ είναι η hiQ Labs v. LinkedIn. Το 9ο Εφετείο έκρινε τον Απρίλιο του 2022 ότι το scraping δημόσια προσβάσιμων δεδομένων «πιθανότατα δεν παραβιάζει το CFAA» (Computer Fraud and Abuse Act). Ωστόσο, αργότερα η hiQ κρίθηκε υπεύθυνη για παραβίαση σύμβασης, επειδή οι υπάλληλοί της είχαν δημιουργήσει ψεύτικα προφίλ στο LinkedIn και είχαν αποδεχθεί τους όρους χρήσης.

Πιο πρόσφατα, η υπόθεση Meta v. Bright Data (N.D. Cal., Ιαν. 2024) έδωσε μια ακόμη πιο καθαρή απόφαση. Ο δικαστής Chen έκρινε ότι οι Όροι του Facebook και του Instagram «δεν απαγορεύουν το logged-off scraping δημόσιων δεδομένων». Η Meta απέσυρε οικειοθελώς τις υπόλοιπες αξιώσεις τον επόμενο μήνα.

Το robots.txt του Indeed

Το robots.txt του Indeed απαγορεύει ευρέως τα /jobs/ και /job/ για το default User-agent: *, αλλά επιτρέπει ρητά στους Googlebot και Bingbot να έχουν πρόσβαση στο /viewjob? — τις μεμονωμένες σελίδες λεπτομερειών θέσης. Τα AI training crawlers (GPTBot, CCBot, anthropic-ai) είναι πολύ περιορισμένα. Το robots.txt δεν είναι νομικά δεσμευτικό στις ΗΠΑ, αλλά ο σεβασμός του είναι καλή πρακτική και ένδειξη καλής πίστης.

Πρακτικές οδηγίες για υπεύθυνο scraping

  • Κάντε scrape μόνο δημόσια διαθέσιμα δεδομένα — ποτέ login, ποτέ ψεύτικοι λογαριασμοί
  • Σεβαστείτε τα rate limits: 1 αίτημα κάθε 3–6 δευτερόλεπτα ανά IP, μονοψήφιο concurrency
  • Μην αναδημοσιεύετε τα scraped δεδομένα σαν να είναι δικό σας job board
  • Χρησιμοποιήστε τα δεδομένα για προσωπική ή εσωτερική έρευνα, όχι για εμπορική μεταπώληση χωρίς άδεια
  • Διαγράψτε ή κάντε hash τα PII που δεν χρειάζεστε· βάλτε όριο διατήρησης για δεδομένα που σχετίζονται με προσωπικά στοιχεία
  • Αν λειτουργείτε σε μεγάλη κλίμακα ή στην ΕΕ/ΗΒ, συμβουλευτείτε δικηγόρο — οι υποχρεώσεις διαφάνειας του GDPR άρθρου 14 ισχύουν για scraped προσωπικά δεδομένα

Το φάσμα κινδύνου: η αυτοματοποίηση προσωπικής αναζήτησης εργασίας βρίσκεται στο χαμηλό άκρο. Η μεγάλης κλίμακας εμπορική μεταπώληση δεδομένων του Indeed βρίσκεται στο υψηλό άκρο.

Συμπέρασμα και βασικά σημεία

Το scraping του Indeed με Python γίνεται, αλλά δεν είναι project Σαββατοκύριακου που το ρυθμίζετε και το ξεχνάτε. Η προστασία Cloudflare του Indeed, τα rotating selectors και τα επιθετικά anti-bot μέτρα σημαίνουν ότι πρέπει να το προσεγγίσετε με τα σωστά εργαλεία και τις σωστές προσδοκίες.

Αυτά θα κρατούσα από όλα αυτά:

  • Το Indeed είναι η πλουσιότερη πηγή δεδομένων αγοράς εργασίας στο web — 350M μηνιαίοι επισκέπτες, 130M αγγελίες — αλλά αντιστέκεται σκληρά στους scrapers.
  • Η εξαγωγή κρυφού JSON (window.mosaic.providerData) είναι η πιο ανθεκτική προσέγγιση σε Python. Το schema είναι σταθερό εδώ και χρόνια, ενώ οι CSS selectors σπάνε κάθε μήνα.
  • Το curl_cffi με browser impersonation είναι ο default HTTP client του 2026 για sites που προστατεύονται από Cloudflare. Τα απλά requests και httpx μπλοκάρονται ήδη από το TLS fingerprint.
  • Χρησιμοποιείτε πάντα rotating headers, τυχαίες καθυστερήσεις και residential proxies για να αποφύγετε τα σφάλματα 403. Τα datacenter proxies είναι σχεδόν άχρηστα απέναντι στο Cloudflare Enterprise.
  • Προσθέστε assertion checks ώστε να ξέρετε αμέσως πότε σπάνε οι selectors ή πότε σας σερβίρεται μια challenge page αντί για δεδομένα θέσεων.
  • Για μη τεχνικούς χρήστες ή για όποιον θέλει απλώς γρήγορα αποτελέσματα, το Thunderbit προσφέρει μια no-code, AI-powered διαδρομή που προσαρμόζεται αυτόματα στις αλλαγές του site — χωρίς proxies, χωρίς debugging, χωρίς συντήρηση.

Αν θέλετε να δοκιμάσετε τη no-code διαδρομή, το Thunderbit προσφέρει δωρεάν tier ώστε να το δοκιμάσετε στο Indeed χωρίς καμία δέσμευση. Και αν πάτε με τη διαδρομή της Python, τα παραπάνω code samples είναι ένα γερό σημείο εκκίνησης — απλώς θυμηθείτε να αντιμετωπίζετε την ανθεκτικότητα στο anti-bot ως πρώτης τάξης ζήτημα, όχι ως κάτι δευτερεύον.

Για περισσότερα σχετικά με προσεγγίσεις και εργαλεία web scraping, δείτε τους οδηγούς μας για πώς να κάνετε web scrape με Python, τα καλύτερα αυτοματοποιημένα web scraping tools και web scraping χωρίς μπλοκάρισμα. Μπορείτε επίσης να παρακολουθήσετε tutorials στο Thunderbit YouTube Channel.

Δοκιμάστε το Thunderbit για ταχύτερο Scrape δεδομένων από το Indeed Get Started Free

Συχνές ερωτήσεις

Ποιες Python βιβλιοθήκες είναι οι καλύτερες για scraping του Indeed;

Για HTTP requests, το curl_cffi είναι η ισχυρότερη επιλογή το 2026 — μιμείται πραγματικά browser TLS fingerprints, κάτι απαραίτητο για παράκαμψη του Cloudflare. Το httpx με HTTP/2 είναι μια αξιοπρεπής εναλλακτική για λιγότερο προστατευμένους στόχους. Για ανάλυση HTML, το BeautifulSoup4 με lxml παραμένει το πρότυπο. Για αυτοματοποίηση browser, το Playwright (με playwright-stealth) ή το undetected-chromedriver δουλεύουν, αν και και τα δύο ανιχνεύονται ολοένα και περισσότερο. Η προσέγγιση regex για κρυφό JSON (window.mosaic.providerData) αποφεύγει εντελώς την ανάγκη για βαριά ανάλυση.

Γιατί συνεχώς παίρνω σφάλματα 403 όταν κάνω scrape το Indeed;

Το Indeed χρησιμοποιεί Cloudflare Bot Management, το οποίο ελέγχει το TLS fingerprint σας (JA3/JA4), τη σειρά των HTTP/2 headers, τα μοτίβα αιτήσεων και τη συμπεριφορά του browser. Αν χρησιμοποιείτε απλά requests, το TLS fingerprint σας σάς προδίδει αμέσως ως Python script — το 403 έρχεται πριν καν διαβαστούν τα headers σας. Διορθώστε το περνώντας σε curl_cffi με browser impersonation, περιστρεφόμενα ρεαλιστικά User-Agent strings, τυχαίες καθυστερήσεις (3–6 δευτερόλεπτα) και residential proxies. Επίσης, ελέγξτε την περίπτωση «200 με Turnstile challenge» — σαρώστε το response body για δείκτες cf-turnstile.

Μπορώ να κάνω scrape το Indeed χωρίς κώδικα;

Ναι. Εργαλεία όπως το Thunderbit σάς επιτρέπουν να εξαγάγετε αγγελίες του Indeed σε λίγα κλικ — εγκαθιστάτε το Chrome extension, πηγαίνετε σε μια σελίδα αναζήτησης του Indeed, κάνετε κλικ στο "AI Suggest Fields", και μετά στο "Scrape." Η AI του Thunderbit εντοπίζει αυτόματα πεδία όπως τίτλο θέσης, εταιρεία, τοποθεσία και μισθό. Χειρίζεται αυτόματα το pagination, τον εμπλουτισμό υποσελίδων (πλήρεις περιγραφές θέσεων) και τις αντι-bot προστασίες. Εξαγωγή σε CSV, Google Sheets, Airtable ή Notion δωρεάν.

Πόσο συχνά αλλάζει το Indeed τη δομή του HTML;

Το Indeed αλλάζει τακτικά τα CSS class names (π.χ. css-1m4cuuf, τυχαιοποιημένα hashed strings) και αναδιαρθρώνει τα στοιχεία του DOM χωρίς προειδοποίηση. Το A/B testing σημαίνει ότι διαφορετικοί χρήστες μπορεί να βλέπουν διαφορετικά layouts ταυτόχρονα. Η προσέγγιση του κρυφού JSON (window.mosaic.providerData) είναι σημαντικά πιο σταθερή — το schema είναι συνεπές τουλάχιστον από το 2023. Όταν πρέπει να χρησιμοποιήσετε DOM selectors, στοχεύστε στα data-testid attributes και στο data-jk (job key) αντί για CSS classes.

Είναι νόμιμο να κάνω scrape το Indeed;

Το logged-out scraping δημόσια προσβάσιμων Indeed job URLs είναι απίθανο να δημιουργήσει ευθύνη βάσει CFAA στις ΗΠΑ, με βάση την απόφαση του 9ου Εφετείου στην υπόθεση hiQ v. LinkedIn (2022) και την απόφαση Meta v. Bright Data (2024). Οι Όροι Χρήσης του Indeed απαγορεύουν ειδικά την αυτοματοποίηση της διαδικασίας Apply, όχι την παθητική ανάγνωση δημόσιων αγγελιών. Παρ’ όλα αυτά, πάντα κάντε scraping υπεύθυνα: μην κάνετε login, μην δημιουργείτε ψεύτικους λογαριασμούς, σεβαστείτε τα rate limits, μην αναδημοσιεύετε τα δεδομένα σαν να είναι δικό σας job board και χειριστείτε με προσοχή οποιαδήποτε προσωπικά δεδομένα (ονόματα recruiters, emails) υπό GDPR/CCPA. Για εμπορική κλίμακα, συμβουλευτείτε δικηγόρο.

Μάθετε περισσότερα

Fawad Khan
Fawad Khan
Ο Fawad γράφει για να ζει — και, ειλικρινά, του αρέσει κάπως πολύ. Έχει περάσει χρόνια προσπαθώντας να καταλάβει τι κάνει ένα κείμενο να μένει στο μυαλό — και τι κάνει τους αναγνώστες να το προσπερνούν. Ρωτήστε τον για το μάρκετινγκ και θα μιλάει για ώρες. Ρωτήστε τον για καρμπονάρα και θα μιλάει ακόμα περισσότερο.
Πίνακας περιεχομένων

Πάρε δεδομένα από μια ιστοσελίδα, απλώς ζητώντας το

Πες αυτό που χρειάζεσαι με απλά λόγια. Ή ακόμα καλύτερα, πες και τίποτα.

Δοκίμασε το Thunderbit δωρεάν
Εξήγαγε δεδομένα με AI
Μετέφερε εύκολα δεδομένα σε Google Sheets, Airtable ή Notion
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week