Πώς να ρυθμίσετε περιστρεφόμενους proxies στο Puppeteer χωρίς να μπλοκαριστείτε

Τελευταία ενημέρωση στις August 10, 2026
Hand-drawn diagram of a Puppeteer-controlled browser rotating requests through multiple proxy nodes
Σύνοψη AI
  • Συγκρίνετε πρακτικές αρχιτεκτονικές rotation στο Puppeteer, όπως επανεκκίνηση browser ανά proxy, rotation μέσω gateway, απομονωμένες δεξαμενές browser και browser sharding.
  • Μάθετε πού πρέπει να τοποθετούνται τα proxy credentials, πώς το HTTPS CONNECT αλλάζει τη διαδρομή του request και γιατί το page-level authentication από μόνο του ίσως να μην λύνει αποτυχίες εκκίνησης browser ή tunnel.
  • Χτίστε επιλογή με επίγνωση της υγείας των proxies, με περιορισμένα retries, cooldowns, failures με κωδικούς αιτίας και συνέπεια session αντί να περιστρέφετε τυφλά μετά από κάθε σφάλμα.
  • Αντιμετωπίστε σφάλματα 403, 407, 429, navigation timeout, DNS και TLS εντοπίζοντας το επίπεδο που τα δημιούργησε πριν αλλάξετε διαδρομή.
  • Χρησιμοποιήστε checklist παραγωγής που καλύπτει observability, διαχείριση μυστικών, όρια concurrency, graceful shutdown και fail-closed συμπεριφορά με βάση πολιτικές.

Ένα γνώριμο μοτίβο αποτυχίας στο Puppeteer είναι να περνάνε τα πρώτα requests και μετά τα επόμενα να γυρίζουν 403 ή 429, να κάνουν timeout ή να σε στέλνουν σε σελίδα challenge. Παρ’ όλα αυτά, πολλοί οδηγοί συνεχίζουν να αντιμετωπίζουν το rotating proxies σαν να είναι μια ρύθμιση δύο γραμμών.

Δεν είναι έτσι. Η απόσταση ανάμεσα σε ένα παράδειγμα του τύπου "πρόσθεσε το flag --proxy-server" και σε ένα σύστημα που συντηρείται αξιόπιστα είναι τεράστια. Αυτός ο οδηγός καλύπτει rotation σε επίπεδο browser, authenticated gateways, browser sharding ή εξωτερικά relays, σταθερά browser profiles, χειρισμό σφαλμάτων επιπέδου production και μια ξεκάθαρη απάντηση στο πότε δεν αξίζει να διαχειρίζεσαι proxies μόνος σου.

Τι είναι ένας rotating proxy και γιατί το χρειάζεται το Puppeteer;

Ο proxy λειτουργεί ως ενδιάμεσος ανάμεσα στο Puppeteer instance σου και τον ιστότοπο που επισκέπτεσαι. Ο ιστότοπος βλέπει το exit IP του proxy, όχι το δικό σου μηχάνημα. Ένας rotating proxy εναλλάσσει ένα pool από τέτοια exit IPs — άλλοτε ανά request, άλλοτε ανά session — ώστε η κίνησή σου να μην μοιάζει με έναν μόνο client που χτυπά έναν server χίλιες φορές στη σειρά.

Το Puppeteer το χρειάζεται αυτό ιδιαίτερα επειδή το headless Chrome που κάνει εκατοντάδες συνεχόμενα requests από ένα μόνο IP είναι ακριβώς το μοτίβο που έχουν σχεδιαστεί να εντοπίζουν τα anti-bot συστήματα. Η τεκμηρίωση της Cloudflare περιγράφει πολλαπλά επίπεδα ανίχνευσης που τρέχουν μαζί — heuristics, έλεγχο JavaScript fingerprint, μοντέλα machine learning και ανίχνευση συμπεριφορικών ανωμαλιών. Η αλλαγή IP λύνει μόνο ένα από αυτά τα επίπεδα. Μόνο ένα.

Υπάρχουν τρεις τύποι proxy που αξίζει να ξέρεις και δεν είναι εναλλάξιμοι:

  • Datacenter proxies — φθηνοί, γρήγοροι και από hosting providers. Εντοπίζονται εύκολα επειδή το ASN (το network block) δείχνει καθαρά data center και όχι σπίτι.
  • Residential proxies — δρομολογούνται μέσω πραγματικών consumer ISP, άρα μοιάζουν με κανονικές οικιακές συνδέσεις. Πιο αργοί και ακριβοί, αλλά πολύ πιο πειστικοί.
  • Mobile proxies — IPs από δίκτυα παρόχων κινητής, συνήθως η ακριβότερη επιλογή και χρήσιμη όταν χρειάζεται πραγματική ταυτότητα mobile δικτύου.

Τα residential exits μπορεί να φαίνονται λιγότερο ύποπτα από πλευράς ASN σε σχέση με τα datacenter exits, αλλά καμία κατηγορία δεν είναι άτρωτη στο μπλοκάρισμα. Δεν υπάρχει καθολικό ποσοστό ανίχνευσης: το αποτέλεσμα εξαρτάται από τον στόχο, τη φήμη του exit, την τοποθεσία, το session history, το browser profile και τη συμπεριφορά των requests.

Μια ακόμη διάκριση που μπερδεύει πολλούς: μια στατική λίστα που την περιστρέφεις μόνος σου (εσύ διαχειρίζεσαι το pool, διαλέγεις το επόμενο IP και χειρίζεσαι τις αποτυχίες) είναι διαφορετική από ένα backconnect/gateway proxy (χτυπάς ένα endpoint και ο πάροχος αλλάζει τα exits από πίσω, αυτόματα). Και τα δύο είναι έγκυρα· απλώς μεταφέρουν την πολυπλοκότητα αλλού.

Γιατί να στήσεις rotating proxies στο Puppeteer; Συνήθεις χρήσεις

Η ειλικρινής απάντηση είναι: πιθανότατα δεν χρειάζεσαι rotation μέχρι να το χρειαστείς, και τότε το χρειάζεσαι άμεσα.

Περίπτωση χρήσηςΓιατί έχει σημασία η περιστροφή
Παρακολούθηση τιμών σε καταλόγους προϊόντωνΤα επαναλαμβανόμενα requests στον ίδιο κατάλογο από ένα IP μπορούν να φέρουν rate limits και σήματα φήμης
Εμπλουτισμός leads / εξαγωγή στοιχείων επικοινωνίαςΟι επαναλαμβανόμενες επισκέψεις προφίλ από ένα IP μοιάζουν με scraping, όχι με browsing, και ενεργοποιούν συμπεριφορικούς μηχανισμούς
Scraping SERPΟι μηχανές αναζήτησης είναι από τις πιο επιθετικές στον περιορισμό μέσω IP και στο CAPTCHA gating
Ανάλυση ανταγωνισμούΗ συνεχής συλλογή από το ίδιο domain για μέρες δημιουργεί fingerprint δεμένο με το IP και το cookie history σου
Συγκέντρωση περιεχομένουΥψηλός όγκος σελίδων με χαμηλή αξία ανά σελίδα — ακριβώς το μοτίβο κίνησης που τα bot detection συστήματα είναι φτιαγμένα να πιάνουν

Δεν υπάρχει σταθερός, τεκμηριώσιμος αριθμός τύπου "το Amazon μπλοκάρει στο request 51". Οι ιστότοποι δεν δημοσιεύουν καθολικά όρια, και οι έλεγχοι μπορούν να αλλάζουν ανά endpoint, κατάσταση λογαριασμού, φήμη ASN και μοτίβο κίνησης. Ξεκίνα με το χαμηλότερο επιτρεπόμενο request rate, έλεγξε όχι μόνο τα status codes αλλά και το περιεχόμενο, και πρόσθεσε rotation μόνο όταν η μετρημένη συμπεριφορά και οι πολιτικές του στόχου το δικαιολογούν.

Τρεις στρατηγικές proxy rotation στο Puppeteer: ποια χρειάζεσαι;

Σύγκριση τριών στρατηγικών proxy στο Puppeteer: επανεκκίνηση browser, rotating gateway και browser sharding

Εδώ είναι το σημείο που τα περισσότερα tutorials το προσπερνούν εντελώς ή, ακόμα χειρότερα, δείχνουν μόνο την πιο πρόχειρη εκδοχή. Υπάρχουν τρία επίπεδα λεπτομέρειας, και η λάθος επιλογή είτε σου τρώει χρόνο είτε περιπλέκει υπερβολικά μια απλή δουλειά.

Στρατηγική περιστροφήςΛεπτομέρειαΧρειάζονται επανεκκινήσεις browser;ΠολυπλοκότηταΙδανικό για
Ανά browser (--proxy-server)1 proxy ανά browser instanceΝαιΧαμηλήΑπλά, μικρού όγκου scrapes
Gateway-managed (proxy-chain + backconnect endpoint)Πολιτική παρόχου / sessionΌχιΜεσαίαAuthenticated rotating gateways
Browser sharding ή εξωτερικό relay1 proxy ανά browser shard ή κανόνα relayΌχι swap σε ένα μόνο processΥψηλήΕλεγχόμενη ταυτόχρονη εκτέλεση και λεπτομερής δρομολόγηση

Μια γρήγορη σημείωση πριν διαλέξεις: η τεκμηρίωση network interception του Puppeteer είναι σαφής ότι το setRequestInterception δεν είναι καθαρό κουμπί για "αλλαγή proxy ανά request" — κάθε intercepted request σταματά μέχρι να το συνεχίσεις, να απαντήσεις ή να το απορρίψεις ρητά. Η πραγματική δρομολόγηση proxy ανά request συνήθως σημαίνει ότι περνάς τα requests μέσα από ένα τοπικό programmable gateway (όπως το proxy-chain) αντί να εναλλάσσεις proxies απευθείας μέσα στο interception handler. Κράτα το αυτό στο μυαλό πριν δεσμευτείς στη Μέθοδο 3 παρακάτω.

Πώς να ρυθμίσεις rotating proxy στο Puppeteer: βήμα προς βήμα

Δυσκολία: Μεσαία
Χρόνος που απαιτείται: ~30–45 λεπτά για και τις τρεις μεθόδους
Τι θα χρειαστείς: Node.js 18+, npm, μια λίστα proxy ή account σε πάροχο (μορφή: protocol://user:pass@host:port) και τα packages puppeteer, proxy-chain και puppeteer-extra

Προαπαιτούμενα: Τι χρειάζεσαι πριν ξεκινήσεις

Εγκατέστησε τα βασικά packages:

npm install puppeteer proxy-chain puppeteer-extra puppeteer-extra-plugin-stealth

Πάρε μια λίστα proxy από πάροχο (residential κατά προτίμηση για οτιδήποτε πέρα από απλό testing) ή, τουλάχιστον, μερικούς δοκιμαστικούς proxies για να επαληθεύσεις τον κώδικα πριν επενδύσεις πραγματικό request volume. Αποθήκευσε τα credentials σε environment variables — ποτέ hardcode, και ποτέ μέσα σε URL που μπορεί να καταλήξει σε log file.

Μέθοδος 1: Περιστροφή proxy ανά browser με --proxy-server

Αυτό είναι το βασικό σημείο εκκίνησης για όλους, και όχι τυχαία — είναι προβλέψιμο. Η τεκμηρίωση LaunchOptions του Puppeteer δείχνει το args ως τον υποστηριζόμενο τρόπο για να περνάς Chrome command-line flags, και το --proxy-server είναι native Chromium flag.

import puppeteer from 'puppeteer';

const proxyPool = [
  'http://proxy1.example:8080',
  'http://proxy2.example:8080',
  'http://proxy3.example:8080',
];

let proxyIndex = 0;

async function scrapeWithRotation(url) {
  const proxy = proxyPool[proxyIndex % proxyPool.length];
  proxyIndex++;

  const browser = await puppeteer.launch({
    headless: true,
    args: [`--proxy-server=${proxy}`],
  });

  const page = await browser.newPage();

  // Αν ο proxy απαιτεί auth, αυτό πρέπει να τρέξει πριν από οποιαδήποτε πλοήγηση
  await page.authenticate({
    username: process.env.PROXY_USER,
    password: process.env.PROXY_PASS,
  });

  await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 30_000 });
  const content = await page.content();

  await browser.close(); // κλείσε πριν αλλάξεις proxy
  return content;
}

Σημείωσε ότι το page.authenticate() ενεργοποιεί αθόρυβα request interception στο παρασκήνιο, σύμφωνα με την ίδια την τεκμηρίωση του Puppeteer — ένα μικρό performance κόστος που αξίζει να το ξέρεις πριν αναρωτηθείς γιατί όλα φαίνονται πιο αργά απ’ όσο περίμενες.

Αναμενόμενο αποτέλεσμα: κάθε κλήση ανοίγει έναν νέο browser δεμένο με διαφορετικό proxy. Για να γίνει rotation, κλείνεις και ξανανοίγεις — δεν υπάρχει τρόπος να αποφύγεις το startup overhead. Για ένα scrape 50 σελίδων, περίμενε αισθητά πιο αργή εκτέλεση από τις άλλες δύο μεθόδους, καθαρά λόγω του χρόνου εκκίνησης του browser.

Πότε να το χρησιμοποιήσεις: scripts με χαμηλό concurrency, one-off scrapes, περιπτώσεις όπου η απλότητα στο debugging μετράει περισσότερο από την ταχύτητα.

Μέθοδος 2: Authenticated rotating gateway με proxy-chain

Το Chrome δεν δέχεται credentials user:pass@host ενσωματωμένα απευθείας σε proxy URL. Το package proxy-chain (maintained by Apify) λύνει το θέμα της αυθεντικοποίησης δημιουργώντας έναν τοπικό anonymous proxy που προωθεί προς τον authenticated upstream σου. Αν ο upstream είναι rotating ή backconnect gateway του παρόχου, ο πάροχος αλλάζει τα exit IPs πίσω από αυτό το endpoint σύμφωνα με την πολιτική του session. Το proxy-chain από μόνο του δεν αναθέτει διαφορετικό proxy σε κάθε ήδη ανοιχτό Puppeteer page.

import puppeteer from 'puppeteer';
import { anonymizeProxy, closeAnonymizedProxy } from 'proxy-chain';

async function scrapeThroughGateway(upstreamProxyUrl, targetUrl) {
  const localProxy = await anonymizeProxy(upstreamProxyUrl);
  let browser;

  try {
    browser = await puppeteer.launch({
      headless: true,
      args: [`--proxy-server=${localProxy}`],
    });
    const page = await browser.newPage();
    await page.goto(targetUrl, { waitUntil: 'domcontentloaded' });
    return await page.content();
  } finally {
    if (browser) await browser.close();
    await closeAnonymizedProxy(localProxy, true); // πάντα cleanup
  }
}

Αυτό το finally block δεν είναι διακοσμητικό — τα ορφανά local proxy servers αφήνουν ports ανοιχτά, και έχω δει scrapers να εξαντλούν σιωπηλά διαθέσιμα file descriptors μέσα στη νύχτα επειδή κανείς δεν έκλεισε τον anonymized proxy. Το proxy-chain επίσης εμφανίζει συγκεκριμένους κωδικούς σφάλματος (593 για DNS προβλήματα, 594 για connection refused, 597 για auth failure) που είναι πραγματικά χρήσιμοι για κατηγοριοποίηση αποτυχιών — περισσότερα γι’ αυτό παρακάτω.

Πότε να το χρησιμοποιήσεις: authenticated residential/datacenter gateways όπου η περιστροφή ελέγχεται από το endpoint ή τις παραμέτρους session του παρόχου. Αν χρειάζεσαι αρκετές σταθερές proxy ταυτόχρονα, χρησιμοποίησε ξεχωριστά browser processes (browser sharding) ή ένα ειδικά σχεδιασμένο external relay· το native Puppeteer δεν παρέχει υποστηριζόμενη ρύθμιση proxy ανά page.

Μέθοδος 3: Δρομολόγηση ανά request απαιτεί εξωτερικό relay

Αυτή είναι η επιλογή με τη μεγαλύτερη λεπτομέρεια — θεωρητικά, κάθε εικόνα, script και API call σε μια σελίδα θα μπορούσε να περνά από διαφορετικό exit. Στην πράξη, είναι η πιο εύθραυστη και η λιγότερο τεκμηριωμένη προσέγγιση, επειδή το request interception του Puppeteer σχεδιάστηκε για φιλτράρισμα και τροποποίηση requests, όχι για αλλαγή network transport ανά request.

import puppeteer from 'puppeteer';

async function inspectRequests(url) {
  const browser = await puppeteer.launch({ headless: true });
  const page = await browser.newPage();

  await page.setRequestInterception(true);

  page.on('request', async (request) => {
    // Στην πράξη, η πραγματική αλλαγή proxy ανά request απαιτεί δρομολόγηση
    // μέσω τοπικού relay (proxy-chain) αντί για αλλαγή του browser transport
    // εν κινήσει — το Chrome δεν το υποστηρίζει αυτό.
    // Τα περισσότερα production setups χρησιμοποιούν αυτόν τον handler για
    // φιλτράρισμα/απόρριψη resource types και όχι για per-request proxy swap,
    // σε συνδυασμό με browser sharding ή gateway.
    if (['image', 'font', 'stylesheet'].includes(request.resourceType())) {
      request.abort();
    } else {
      request.continue();
    }
  });

  await page.goto(url, { waitUntil: 'networkidle2' });
  await browser.close();
}

Ειλικρινής άποψη: το πραγματικό switching IP ανά request μέσα στο Puppeteer δεν παρέχεται από το setRequestInterception(). Αν όντως χρειάζεσαι τέτοια λεπτομέρεια, πέρασε το Chrome από ένα programmable external relay ή χρησιμοποίησε ένα scraping framework χτισμένο γύρω από proxy sessions. Για τα περισσότερα projects, ένας proxy ανά browser shard ή ένα provider-managed rotating gateway είναι πιο εύκολο στη λειτουργία και στο auditing.

Η πλήρης anti-detection στοίβα: οι rotating proxies από μόνοι τους δεν αρκούν για να μείνεις ξεμπλοκαρισμένος

Ένα συνηθισμένο παράπονο είναι: "Χρησιμοποιώ proxies και πάλι με μπλοκάρουν." Η IP είναι μόνο ένα από τα σήματα που μπορεί να αξιολογήσει ένα σύγχρονο bot system, και η αλλαγή της ενώ όλα τα άλλα παραμένουν ασύμβατα μπορεί να δημιουργήσει ισχυρότερη ανωμαλία. Ένα browser που δηλώνει Windows Chrome ενώ τα client hints, η timezone ή το locale δείχνουν κάτι διαφορετικό είναι χαρακτηριστικό παράδειγμα.

Επίπεδο 1: Rotating residential proxies

Όπως καλύφθηκε παραπάνω — τα residential exits συχνά μοιάζουν πιο πειστικά από τα datacenter exits, αλλά δεν υπάρχει καθολικό ελάχιστο μέγεθος pool. Υπολόγισε το μέγεθος του pool με βάση τον μετρημένο όγκο requests, τη διάρκεια session, τα cooldowns και τη συμπεριφορά επαναχρησιμοποίησης του παρόχου, αντί να ακολουθήσεις έναν αυθαίρετο αριθμό IP.

Επίπεδο 2: Stealth plugin για να κρύβει τα σήματα του headless Chrome

Το puppeteer-extra-plugin-stealth διορθώνει μια σειρά από γνωστά headless σημάδια: navigator.webdriver, WebGL vendor strings, αντικείμενα Chrome runtime που λείπουν και μερικές ακόμη διαρροές από το CDP. Είναι πραγματικά χρήσιμο ως layer συμβατότητας, αλλά το δικό του README παραδέχεται με ειλικρίνεια ότι αυτό είναι παιχνίδι γάτας-ποντικιού και ότι η πλήρης αποτροπή μάλλον δεν είναι εφικτή. Αντιμετώπισέ το ως βάση, όχι ως εγγύηση.

Επίπεδο 3: Συνεπή browser profiles και σωστός ρυθμός

Τα user-agent strings πρέπει να είναι εσωτερικά συνεπή με όλα τα υπόλοιπα που δηλώνει ο browser. Τα User-Agent Client Hints του Chrome εκθέτουν δομημένα δεδομένα πλατφόρμας, οπότε ένα χειροκίνητα γραμμένο user-agent string μπορεί να έρχεται σε σύγκρουση με την πραγματική πλατφόρμα. Προτίμησε το user agent που δίνει το bundled Chrome build, κράτα σταθερά viewport/locale/timezone μέσα σε ένα session και προχώρα με συντηρητικό ρυθμό αντί να φτιάχνεις καινούριο fingerprint για κάθε σελίδα.

Δες πώς δένονται και τα τρία επίπεδα σε ένα launch config:

import puppeteer from 'puppeteer-extra';
import StealthPlugin from 'puppeteer-extra-plugin-stealth';
import { anonymizeProxy, closeAnonymizedProxy } from 'proxy-chain';

puppeteer.use(StealthPlugin());

function boundedDelay(minMs = 800, maxMs = 1800) {
  return new Promise((r) => setTimeout(r, minMs + Math.random() * (maxMs - minMs)));
}

async function stableProfileScrape(targetUrl, upstreamProxy) {
  const localProxy = await anonymizeProxy(upstreamProxy);
  let browser;

  try {
    browser = await puppeteer.launch({
      headless: true,
      args: [`--proxy-server=${localProxy}`, '--lang=en-US'],
    });
    const page = await browser.newPage();
    await page.setViewport({ width: 1366, height: 768 });
    await boundedDelay();
    await page.goto(targetUrl, { waitUntil: 'domcontentloaded' });
    return await page.content();
  } finally {
    if (browser) await browser.close();
    await closeAnonymizedProxy(localProxy, true);
  }
}

Αυτό είναι το block που οι περισσότεροι ανταγωνιστικοί οδηγοί δεν δείχνουν ποτέ — proxy, stealth και randomization του fingerprint σε ένα σημείο, έτοιμο για αντιγραφή και προσαρμογή.

Χειρισμός σφαλμάτων επιπέδου production και έλεγχοι υγείας proxy

State machine υγείας proxy pool για διαχείριση 403, 407, 429, timeout, cooldown και quarantine

Τα περισσότερα tutorials σταματούν τη στιγμή που δουλεύει το happy path. Η πραγματική συλλογή δεδομένων αποτυγχάνει συνεχώς — proxies πεθαίνουν, τα credentials λήγουν, οι στόχοι σου rate-limitάρουν στη μέση της διαδικασίας — και τίποτα από αυτά δεν αντιμετωπίζεται με την ελπίδα ότι "θα πάει καλά".

Retry logic με exponential backoff και jitter

function backoffMs(attempt, base = 1000, cap = 30_000) {
  const exponential = Math.min(cap, base * 2 ** attempt);
  return Math.floor(exponential * (0.5 + Math.random() * 0.5)); // το jitter αποφεύγει το thundering herd
}

async function withRetry(fn, maxRetries = 4) {
  for (let attempt = 0; attempt <= maxRetries; attempt++) {
    try {
      return await fn();
    } catch (err) {
      if (attempt === maxRetries) throw err;
      const delay = backoffMs(attempt);
      console.warn(`Η προσπάθεια ${attempt + 1} απέτυχε: ${err.message}. Νέα προσπάθεια σε ${delay}ms`);
      await new Promise((r) => setTimeout(r, delay));
    }
  }
}

Αυτόματο blacklisting σε proxies που αποτυγχάνουν

const proxyStats = new Map(); // proxyUrl -> { success, failure }

function recordResult(proxyUrl, success) {
  const stats = proxyStats.get(proxyUrl) || { success: 0, failure: 0 };
  success ? stats.success++ : stats.failure++;
  proxyStats.set(proxyUrl, stats);
}

function isHealthy(proxyUrl) {
  const stats = proxyStats.get(proxyUrl);
  if (!stats) return true;
  const total = stats.success + stats.failure;
  if (total < 5) return true; // ακόμα δεν έχουμε αρκετά δεδομένα
  return stats.failure / total < 0.5; // blacklist αν το failure rate ξεπεράσει το 50%
}

function getHealthyProxy(pool) {
  const healthy = pool.filter(isHealthy);
  if (healthy.length === 0) throw new Error('Δεν απομένουν υγιείς proxies στο pool');
  return healthy[Math.floor(Math.random() * healthy.length)];
}

Παρακολούθησε τον τύπο του σφάλματος, όχι μόνο το pass/fail — ένα 407 (λάθος credentials) και ένα 429 (rate limit) χρειάζονται τελείως διαφορετική αντιμετώπιση. Το να χτυπάς ξανά και ξανά έναν proxy που αποτυγχάνει στην αυθεντικοποίηση απλώς πετάει χρόνο· η λύση είναι ο έλεγχος των credentials, όχι πιο γρήγορη περιστροφή.

Αντιμετώπιση συνηθισμένων σφαλμάτων rotating proxy στο Puppeteer

ΣφάλμαΠιθανή αιτίαΔιόρθωση
ERR_PROXY_CONNECTION_FAILEDΟ proxy έχει πέσει ή δεν είναι προσβάσιμοςΑφαίρεσέ τον από το pool, δοκίμασε τον επόμενο proxy
407 Proxy Authentication RequiredΛάθος credentials ή μη υποστηριζόμενη μέθοδος authΈλεγξε τα creds του page.authenticate(); χρησιμοποίησε proxy-chain για auth μέσα στο URL
TimeoutErrorΑργός proxy ή μπλοκάρισμα από τον στόχοΑύξησε το timeout· άλλαξε σε residential proxy
403 ForbiddenΤο IP ή το fingerprint επισημάνθηκε ως ύποπτοΠεριστροφή proxy + ενεργοποίηση stealth + τυχαία μεταβολή του UA
ERR_TUNNEL_CONNECTION_FAILEDΠρόβλημα στο HTTPS tunnelΈλεγξε τη στήριξη του CONNECT method· δοκίμασε το τοπικό tunneling του proxy-chain

Μερικά πράγματα που αξίζει να ξέρεις και δεν χωρούν όμορφα στον πίνακα: ένα status code 200 δεν σημαίνει απαραίτητα επιτυχία. Τα soft blocks συχνά επιστρέφουν μια πλήρη HTML σελίδα — login wall ή challenge screen — με κανονικό status code, οπότε έλεγξε το πραγματικό περιεχόμενο και όχι μόνο το status της απόκρισης. Και όταν κολλάς, ο οδηγός debugging του Puppeteer προτείνει να τρέξεις με headless: false, να προσθέσεις slowMo και να ορίσεις NODE_DEBUG="puppeteer:*" για verbose protocol logs — απλώς πρόσεξε ότι αυτά τα logs μπορεί να περιέχουν ευαίσθητα request data, οπότε μην τα αφήνεις να τρέχουν δίπλα από production credentials.

Self-managed proxy rotation vs proxy gateway vs AI extraction API

ΚριτήριοSelf-managed list rotationBackconnect gateway (Bright Data, Oxylabs, Decodo)AI Extraction API (Thunderbit)
Κόστος (χαμηλός όγκος)Χαμηλό έως μεσαίοΜεσαίο–υψηλό ανά GBΧαμηλό (free tier, μετά ανά μονάδα)
ΑξιοπιστίαΕξαρτάται από τους ελέγχους υγείας σουΥψηλή (managed από τον πάροχο)Υψηλή (managed υποδομή)
Anti-detectionDIY — το χτίζεις εσύΜερικό (μόνο IP rotation)Ενσωματωμένο
Δομημένο outputΌχι (raw HTML)Όχι (raw HTML)Ναι (JSON μέσω schema)
Χρόνος setupΏρεςΛεπτάΛεπτά
ΈλεγχοςΠλήρηςΠεριορισμένος στο API του παρόχουΠεριορισμένος στο schema model

Οι τρέχουσες τιμές των παρόχων (έλεγχος 2026-08-07) δίνουν μια εικόνα για το κόστος του gateway: η τιμολόγηση residential της Bright Data προσφέρει pay-as-you-go και volume plans με προσφορές που αλλάζουν· η Oxylabs δείχνει $6/GB στα 5 GB και $2.50/GB στο 1 TB· και η Decodo (πρώην Smartproxy) εμφανίζει $3.75/GB στα 3 GB, $2.75/GB στα 100 GB και μια pay-as-you-go προσφορά στα $4/GB. Η Decodo διαφημίζει επίσης pool άνω των 115M IP και success rate 99.92% — ισχυρισμοί του παρόχου, όχι ανεξάρτητα επαληθευμένα benchmarks.

Το decision tree που χρησιμοποιώ στην πράξη: χρειάζεσαι αλληλεπίδραση με τη σελίδα — clicks, scrolling, συμπλήρωση φορμών, διατήρηση session σύνδεσης; Χτίσε με Puppeteer και proxies. Θέλεις μόνο τα δεδομένα που υπάρχουν ήδη στη σελίδα; Κοίτα πρώτα μια extraction API πριν χτίσεις υποδομή proxy που θα συντηρείς για πάντα.

Όταν το Puppeteer + proxies είναι υπερβολή: εξάγαγε δομημένα δεδομένα με API

Κάποια στιγμή, περίπου την τρίτη φορά που ξανάστησα σύστημα ελέγχου υγείας proxy για ένα project που ήθελε απλώς τιμές προϊόντων σε spreadsheet, το κατάλαβα: μεγάλο μέρος αυτής της υποδομής υπάρχει για να λύσει ένα πρόβλημα — να πάρει raw HTML από μια σελίδα — που στην πραγματικότητα δεν είναι ο στόχος του developer. Ο στόχος είναι τα δομημένα δεδομένα. Το HTML είναι απλώς το ενοχλητικό ενδιάμεσο format.

Το Thunderbit Open API αντιμετωπίζει την εξαγωγή ως κύρια λειτουργία, όχι ως παρενέργεια του browser automation. Το POST /extract δέχεται ένα URL και ένα JSON Schema και επιστρέφει τα αντιστοιχισμένα δομημένα δεδομένα — διαχειριζόμενο JS rendering, anti-bot μέτρα και CAPTCHAs στο backend αντί να χρειάζεται να στήσεις μόνος σου stealth plugins και proxy pools:

curl -X POST https://openapi.thunderbit.com/openapi/v1/extract \
  -H "Authorization: Bearer $THUNDERBIT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.com/product",
    "schema": {
      "type": "object",
      "properties": {
        "name": {"type": "string"},
        "price": {"type": "number"}
      },
      "required": ["name", "price"]
    }
  }'

Υπάρχει επίσης endpoint POST /distill για περιπτώσεις που θέλεις απλώς καθαρό Markdown αντί για αυστηρό schema, καθώς και υποστήριξη batch extraction για να τρέξεις το ίδιο schema σε πολλά URLs με ένα μόνο call. Σύμφωνα με την τρέχουσα τιμολόγηση API του Thunderbit, το Distill κοστίζει 1 unit ανά σελίδα και το Extract 20 units ανά σελίδα — το free tier περιλαμβάνει 600 one-time units, αρκετά για να δοκιμάσεις τη ροή πριν δεσμευτείς.

Για developers που δουλεύουν μέσα σε Claude, Cursor ή άλλο MCP-compatible client, το Thunderbit εκθέτει επίσης τα thunderbit_extract και thunderbit_distill ως MCP tools, επιτρέποντας σε έναν agent να αποφασίζει μέσα στην εργασία πότε χρειάζεται να τραβήξει δεδομένα από μια σελίδα αντί να απαιτείται ξεχωριστό scraping βήμα. Θα έλεγχα το ζωντανό API reference πριν στήσεις MCP config, επειδή τα ονόματα εργαλείων και οι παράμετροι μπορεί να αλλάζουν από έκδοση τεκμηρίωσης σε έκδοση τεκμηρίωσης.

ΔιάστασηPuppeteer + Rotating ProxiesThunderbit API
Πολυπλοκότητα setupΥψηλή — proxy pool, λογική rotation, stealth, retriesΧαμηλή — ένα API call με JSON Schema
Anti-bot χειρισμόςΧειροκίνητοςΕνσωματωμένος
OutputRaw HTML (απαιτεί parsing)Δομημένο JSON που ταιριάζει στο schema σου
ΣυντήρησηΥψηλή — selectors σπάνε, proxies φθείρονταιΧαμηλή
Ιδανικό γιαCustom automation, login flows, εξειδικευμένες αλληλεπιδράσειςΕξαγωγή δεδομένων σε μεγάλη κλίμακα

Για να είμαστε δίκαιοι με τη DIY προσέγγιση: αν η περίπτωση χρήσης σου περιλαμβάνει login σε account, κλικ σε πολύβημα flow ή οτιδήποτε απαιτεί διατήρηση κατάστασης μέσα σε session, μια extraction API συνήθως δεν μπορεί να το αντικαταστήσει — το δικό του FAQ του Thunderbit είναι ξεκάθαρο ότι τα interactive login flows δεν υποστηρίζονται προς το παρόν μέσω του API. Εκεί το Puppeteer με proxies εξακολουθεί να υπερέχει. Αλλά αν η δουλειά είναι "πάρε δεδομένα από πολλές δημόσιες σελίδες σε ένα schema που ορίζω", το να χτίζεις μόνος σου proxy rotation stack λύνει ένα δυσκολότερο πρόβλημα από αυτό που πραγματικά έχεις. Για ομάδες που προτιμούν να αποφύγουν εντελώς τον κώδικα, το Thunderbit Chrome Extension προσφέρει την ίδια AI-driven εξαγωγή με point-and-click περιβάλλον — αξίζει να το δεις αν συγκρίνεις no-code web scraping με ένα πλήρες developer setup.

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

Οι rotating proxies στο Puppeteer δεν είναι μία τεχνική. Η περιστροφή ανά browser είναι απλή και απομονωμένη. Ένα authenticated backconnect gateway μπορεί να αλλάζει exits πίσω από ένα browser-wide endpoint. Η λεπτομερής δρομολόγηση ανά request ή ταυτόχρονες identities απαιτούν browser sharding ή εξωτερικό relay· το request interception μόνο του δεν αλλάζει το network route του Chrome.

Τίποτα από αυτά όμως δεν έχει μεγάλη σημασία χωρίς το υπόλοιπο stack. Οι proxies λύνουν το πρόβλημα της IP reputation· τα stealth plugins και η συνέπεια του fingerprint λύνουν το πρόβλημα των browser signals· το jitter και ο ρυθμός λύνουν το πρόβλημα της συμπεριφοράς. Παράλειψε οποιοδήποτε επίπεδο και παραμένεις ευάλωτος σε μπλοκάρισμα, απλώς για διαφορετικό λόγο.

Αν το χτίζεις μόνος σου, ξεκίνα από το repository του proxy-chain και τα παραπάνω code blocks — θα σε πάνε πιο μακριά από τα περισσότερα paid courses. Αν προτιμάς να παρακάμψεις εντελώς τη διαχείριση proxy και απλώς να παίρνεις δομημένα δεδομένα πίσω, τα API docs του Thunderbit αξίζουν δέκα λεπτά από τον χρόνο σου πριν αφιερώσεις ένα Σαββατοκύριακο για να χτίσεις υποδομή health checks που θα πρέπει να συντηρείς για πάντα. Και οι δύο δρόμοι είναι νόμιμοι — απλώς βεβαιώσου ότι λύνουν το πρόβλημα που πραγματικά έχεις, όχι αυτό που υποθέτουν όλα τα tutorials ότι έχεις. Για μια ευρύτερη ματιά στο πώς η AI αλλάζει αυτόν τον χώρο, δες το αναλυτικό μας άρθρο για το AI web scraping και το πώς συγκρίνεται με τις παραδοσιακές προσεγγίσεις.

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

Πόσο συχνά πρέπει να αλλάζω proxies στο Puppeteer;

Εξαρτάται από το πόσο επιθετικό είναι το rate limiting του στόχου. Για ιστότοπους με αυστηρό bot detection, περιστρέψου ανά σελίδα ή ανά session. Για πιο επιεικείς ιστότοπους, ανά session ή ακόμα και ένα sticky IP για όλο το scraping run μπορεί να δουλέψει μια χαρά. Δεν υπάρχει καθολικός αριθμός — αντιμετώπισε τα 403, 429 και timeouts ως σήμα ότι πρέπει να περιστρέφεις πιο επιθετικά, όχι ως σταθερό πλήθος requests.

Μπορώ να χρησιμοποιήσω δωρεάν proxies για scraping με Puppeteer;

Τεχνικά ναι, αλλά δεν θα το πρότεινα για οτιδήποτε πέρα από γρήγορα tests. Οι λίστες δωρεάν proxies είναι συνήθως αργές, αναξιόπιστες και συχνά ήδη μπλοκαρισμένες από τους ιστότοπους που προσπαθείς να κάνεις scrape. Για παραγωγική χρήση, τα residential proxies από πληρωμένο πάροχο ή ένα managed gateway αξίζουν το κόστος.

Το puppeteer-extra-plugin-stealth λειτουργεί απέναντι σε όλα τα anti-bot συστήματα;

Όχι, και η δική του τεκμηρίωση το λέει ξεκάθαρα. Μειώνει κάποια συνηθισμένα σήματα του headless Chrome, αλλά ο στόχος μπορεί ακόμα να αξιολογήσει network reputation, TLS χαρακτηριστικά, cookies, client hints και συμπεριφορά. Αντιμετώπισε το plugin ως ένα επίπεδο συμβατότητας, όχι ως εγγύηση.

Ποια είναι η διαφορά ανάμεσα στο proxy-chain και το --proxy-server στο Puppeteer;

Το --proxy-server είναι native Chromium launch flag που αναθέτει ένα proxy endpoint σε ολόκληρο το browser instance, και το Chrome δεν δέχεται εκεί ενσωματωμένα proxy credentials. Το proxy-chain δημιουργεί ένα τοπικό anonymous tunnel προς ένα authenticated upstream. Η περιστροφή προκύπτει από relaunch με άλλο upstream, από provider-managed backconnect gateway ή από ξεχωριστά σχεδιασμένο relay — όχι επειδή το proxy-chain αναθέτει proxies σε μεμονωμένες Puppeteer σελίδες.

Αρκεί η περιστροφή proxies για να αποφύγω εντελώς τα μπλοκαρίσματα;

Όχι — και αυτή είναι η πιο συνηθισμένη παρεξήγηση. Σύγχρονα anti-bot συστήματα, όπως το bot management της Cloudflare, συσχετίζουν τη φήμη IP με browser fingerprint, συμπεριφορικά μοτίβα και ιστορικό session. Οι proxies λύνουν το κομμάτι της IP reputation· εξακολουθείς να χρειάζεσαι stealth ρυθμίσεις, συνεπή fingerprints και ρεαλιστικό timing για να μην επισημανθείς από άλλα σήματα.

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

Ke
Ke
CTO στη Thunderbit | Senior Data Scientist & ML Expert Με σχεδόν μια δεκαετία εμπειρίας στη μηχανική μάθηση και την επιστήμη δεδομένων, ο Ke Shen είναι απόφοιτος του Columbia University και πρώην Senior Data Scientist στα Walmart Labs. Με βαθιά, αναγνωρισμένη από συναδέλφους τεχνογνωσία σε Python, R, Java και Στατιστική, μοιράζεται δοκιμασμένες στην πράξη γνώσεις για το πώς οι σύνθετοι αλγόριθμοι τεχνητής νοημοσύνης περνούν από τη θεωρία σε αρχιτεκτονική έτοιμη για παραγωγή.
Topics
Puppeteer proxy rotationProxy rotationBrowser automation
Πίνακας Περιεχομένων
Thunderbit · Πράκτορας δεδομένων ιστού AI

Εξαγωγή δεδομένων από οποιαδήποτε σελίδα σε 1 κλικ

Εμπιστεύονται πάνω από 250.000 χρήστες
διαθέσιμο δωρεάν πρόγραμμα
Εξαγωγή Δεδομένων χρησιμοποιώντας AI
Μεταφέρετε εύκολα δεδομένα σε Google Sheets, Airtable ή Notion
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week