Python Web Scraping το 2026: httpx + BeautifulSoup + Θεατρικός συγγραφέας — Πότε να χρησιμοποιήσετε ποιο
Τα περισσότερα σεμινάρια "Python web scraping" από το 2018 εξακολουθούν να προτείνουν " αιτήματα + BeautifulSoup". Το τμήμα "αιτήματα" είναι εντάξει, αλλά υπάρχουν πλέον καλύτερες προεπιλογές και ο μισός σύγχρονος ιστός αποδίδει περιεχόμενο σε JavaScript, έτσι ώστε η κλασική στοίβα να επιστρέφει αθόρυβα κενές σελίδες.
Αυτός ο οδηγός καλύπτει το δέντρο αποφάσεων του 2026: πότε το "httpx + BeautifulSoup" είναι σωστό (ακόμα το 90%+ των ιστότοπων), πότε πρέπει να προσεγγίσετε το "Playwright", πώς να αποφύγετε τον αποκλεισμό και τους δύο κανόνες που κρατούν το scraper σας τόσο νόμιμο όσο και ηθικό.
Το δέντρο αποφάσεων σε μία εικόνα
Αυτό είναι όλο. Το ενενήντα τοις εκατό των εργασιών απόξεσης είναι στατικό HTML — η κλασική στοίβα (μετονομασία) είναι το σωστό εργαλείο. Τα υπόλοιπα χρειάζονται εκτέλεση JS και το Playwright είναι η σύγχρονη απάντηση.
Βήμα 1: httpx + BeautifulSoup (το 90% της περίπτωσης)
Το "httpx" είναι η αναπτυσσόμενη αντικατάσταση για τα "αιτήματα". Ίδιο API, συν υποστήριξη HTTP/2 και εγγενής ασυγχρονισμός. Το "BeautifulSoup" παραμένει αμετάβλητο από το 2015 — η επιλογή του αναλυτή έχει σημασία (το "lxml" είναι 5 φορές ταχύτερο από την προεπιλογή).
Βασικές επιλογές:
- `headers={"User-Agent": ...}` — ορίζετε πάντα μια πραγματική UA (μια διεύθυνση επαφής είναι ευγενική). Το προεπιλεγμένο "httpx" UA είναι συχνά αποκλεισμένο.
- `timeout=10` — μην κάνετε ποτέ απεριόριστο αίτημα. κρεμασμένες συνδέσεις διαρροές αρχείων περιγραφής.
- `raise_for_status()` — αυξάνει σε 4xx/5xx, ώστε οι αποτυχίες να είναι δυνατές, όχι σιωπηρές.
- `"lxml"` αναλυτής — 5 φορές ταχύτερος από τον προεπιλεγμένο «html.parser» και πιο επιεικής με HTML με κακή μορφή.
- `soup.select("css-selector")` — αντιμετωπίστε την απόξεση ως "προσποιηθείτε ότι χρησιμοποιείτε το "document.querySelectorAll" της JavaScript. Οι επιλογείς CSS είναι συνήθως αυτό που θέλετε, όχι το δέντρο-περπάτημα API.
Βήμα 2: Θεατρικός συγγραφέας (όταν η JS αποδίδει το περιεχόμενο)
Πολλά σύγχρονα SPA (React, Vue, Angular) αποστέλλουν ένα άδειο <div id="root"> και ενυδατώνουν τα πάντα από την πλευρά του πελάτη. Το "httpx.get" σας δίνει ένα κενό κέλυφος — τα δεδομένα που θέλετε φορτώνονται μέσω του "fetch" μετά τη φόρτωση της σελίδας.
Δοκιμή: httpx.get(url).text — αναζητήστε τα δεδομένα που θέλετε. Εάν δεν υπάρχει, ο ιστότοπος χρειάζεται εκτέλεση JS.
Εγκατάσταση: «pip install playwrit && playwright install chromium» (η λήψη του προγράμματος περιήγησης είναι ~150MB — αξίζει μια φορά, επώδυνη σε κάθε εκτέλεση CI χωρίς αποθήκευση στην προσωρινή μνήμη).
Κόστος: Ο θεατρικός συγγραφέας είναι 10-50 φορές πιο αργός από το «httpx» (φόρτωση σελίδας + εκτέλεση JS + επιβάρυνση του προγράμματος περιήγησης). Προσεγγίστε το μόνο όταν τα δεδομένα δεν είναι στο στατικό HTML.
Οι τέσσερις τρόποι για να μπλοκαριστείτε
Τα περισσότερα συστήματα κατά της απόξεσης παρακολουθούν αυτά τα τέσσερα δακτυλικά αποτυπώματα:
1. Λείπει / προφανές User-Agent
2. Χωρίς καθυστέρηση μεταξύ των αιτημάτων
Ακατέργαστα διαδοχικά αιτήματα σφυρηλατούν έναν διακομιστή. Προσθέστε μια καθυστέρηση ανάλογη με τον χρόνο απόκρισής τους — εάν μια σελίδα χρειάζεται 500 ms για να εμφανιστεί, περιμένετε 500-2000 ms μεταξύ των αιτημάτων. asyncio.sleep(random.uniform(0,5, 2,0)).
3. Αίτημα «/robots.txt» μη επιτρεπόμενων διαδρομών
Ορισμένοι ιστότοποι χρησιμοποιούν το «robots.txt» για νόμιμα σήματα ρυθμού — ελέγξτε πριν από την απόξεση:
4. TLS / αναντιστοιχία δακτυλικού αποτυπώματος προγράμματος περιήγησης
Προηγμένο δακτυλικό αποτύπωμα κατά της απόξεσης (Cloudflare, DataDome) της χειραψίας TLS και του περιβάλλοντος JS. Το "httpx" δεν μοιάζει σε τίποτα με το Chrome στο επίπεδο TLS. Επιλογές:
curl_cffi— μια βιβλιοθήκη βασισμένη σε πλαστοπροσωπία που μιμείται το πραγματικό TLS του προγράμματος περιήγησης.- Θεατρικός συγγραφέας — πραγματικό πρόγραμμα περιήγησης TLS εξ ορισμού.
- Εναλλαγή οικιστικών πληρεξουσίων — η πυρηνική επιλογή.
Για το 99% των περιπτώσεων χρήσης (μη εχθρικοί ιστότοποι, μέτριος όγκος, δεν απαιτείται σύνδεση), αρκεί ο σεβασμός "httpx" + πραγματικό UA + καθυστέρηση + "robots.txt". Εάν κάνετε scraping τοποθεσίες που προστατεύονται από το Cloudflare σε κλίμακα, χρειάζεστε πραγματικά προγράμματα περιήγησης ή υπηρεσίες ξεμπλοκαρίσματος επί πληρωμή.
Βαθμολογήστε περιορίζοντας τον εαυτό σας (ο σηματοφόρος + μοτίβο ύπνου)
Για μαζική απόξεση, συνδυάστε το «asyncio.Semaphore» (μέγ. ταυτόχρονα) με το «asyncio.sleep» (καθυστέρηση ανά αίτημα):
Ο περιορισμός στα 5-10 ταυτόχρονα + 500ms-2s ανά αίτημα καθυστέρησης σας κρατά πολύ κάτω από αυτό που ενεργοποιεί συναγερμούς ορίου ρυθμού στους περισσότερους ιστότοπους.
Νομικοί + ηθικοί κανόνες
1. Διαβάστε τους Όρους Παροχής Υπηρεσιών του ιστότοπου. Πολλοί απαγορεύουν την απόξεση εντελώς — μπορείτε ακόμα να το κάνετε (οι Όροι Παροχής Υπηρεσιών είναι δίκαιο των συμβάσεων, όχι ποινικό δίκαιο στις περισσότερες δικαιοδοσίες), αλλά αναλαμβάνετε νομικό κίνδυνο. Το LinkedIn v. hiQ (2022) διαπίστωσε ότι η απόξεση δεδομένων που είναι ορατά στο κοινό δεν αποτελεί παραβίαση της CFAA στις ΗΠΑ, αλλά το να φοράς κουκούλα δεν σε κάνει αόρατο.
2. Μην ξύνετε προσωπικά δεδομένα. Ο GDPR / CCPA / οτιδήποτε άλλο τιμωρεί τη συλλογή προσωπικών πληροφοριών χωρίς συναίνεση. Εάν δημιουργείτε ένα σύνολο δεδομένων με "εργαζόμενους στην εταιρεία X", σταματήστε.
Ηθικές προσθήκες που όλοι ξεχνάνε:
- Στείλτε μια πραγματική διεύθυνση επικοινωνίας στο UA σας. Εάν το bot σας προκαλεί προβλήματα, ο κάτοχος του ιστότοπου θα πρέπει να μπορεί να σας στείλει email.
- Εάν αποθηκεύετε προσωρινά τα δεδομένα του ιστότοπου, αποθηκεύστε προσωρινά επιθετικά — μην χτυπάτε τους διακομιστές τους σε κάθε εκτέλεση.
- Προτιμήστε δημόσια API ακόμα κι αν είναι πληρωμένα. Φθηνότερο από νομικό κίνδυνο.
Η σύνοψη εργαλείων 2026
| Εργασία | Προσεγγίστε |
|---|---|
| Στατικές σελίδες HTML | httpx + BeautifulSoup(html, "lxml") |
| JS-rendered SPA | Συγγραφέας (ακέφαλο Chromium) |
| Cloudflare / anti-bot | curl_cffi ή Θεατρικός συγγραφέας + οικιακός πληρεξούσιος |
| Απόξεση μεγάλου όγκου | httpx.AsyncClient + Semaphore + sleep |
| Δομημένα δεδομένα API | httpx.get + .json() — δεν χρειάζεται σούπα |
Η απόξεση ιστού το 2026 εξακολουθεί να είναι κατά 90% «httpx + BeautifulSoup», καθώς και να γνωρίζετε πότε πρέπει να κλιμακωθείτε σε ένα πραγματικό πρόγραμμα περιήγησης. Εξοικειωθείτε με τις συνήθειες της ευγενικής απόξεσης (πραγματικό UA, σηματοφόρος, ύπνος, robots.txt) και θα δημιουργήσετε ανθεκτικές σωληνώσεις δεδομένων χωρίς να σας μπλοκάρουν ή να σας μηνύσουν.
Επόμενο βήμα: το Data Science track έχει 15 μαθήματα σχετικά με το scraping, το ETL και τα panda — θα δημιουργήσετε μια πραγματική διοχέτευση από άκρο σε άκρο από την ανάκτηση HTTP στην εξαγωγή DataFrame σε CSV.