Το web scraping έχει εξελιχθεί δραματικά από το 2025.
Σε αυτόν τον ανανεωμένο οδηγό για το 2026, θα καλύψουμε:
- Python HTTPX & Playwright — τα νέα standard εργαλεία
- Anti-bot bypass τεχνικές — stealth mode, browser fingerprints, rotating proxies
- AI-assisted scraping — χρήση LLMs για dynamic parsing & data extraction
- Ethical scraping & Νομοθεσία 2026 — τι επιτρέπεται, τι απαγορεύεται
- Async scraping — μαζική συλλογή δεδομένων με asyncio
1. Η Νέα Στοίβα του Web Scraping (2026)
Το 2026, η τυπική στοίβα εργαλείων για professional scraping περιλαμβάνει:
| Εργαλείο | Χρήση | Γιατί 2026 |
|---|---|---|
| HTTPX | Async HTTP client | Αντικαθιστά τα requests για async operations |
| Playwright | Headless browser automation | Stealth, anti-bot bypass, JS rendering |
| Beautiful Soup / lxml | HTML parsing | Ακόμα χρήσιμο για static HTML |
| LLM (Claude/GPT) | Dynamic data extraction | Αντί για regex/selectors — natural language parsing |
| Scrapy + Splash | Production scraping framework | Για μεγάλης κλίμακας scraping projects |
2. HTTPX: Το Νέο Standard
Το HTTPX προσφέρει async/await support, HTTP/2, connection pooling και καλύτερο timeout handling από τα requests. Ιδανικό για μαζικό scraping:
import httpx
import asyncio
async def scrape_page(url: str) -> str:
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101 Firefox/128.0",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language": "el-GR,el;q=0.9,en;q=0.7",
"Accept-Encoding": "gzip, deflate, br",
}
async with httpx.AsyncClient(http2=True, timeout=30.0) as client:
response = await client.get(url, headers=headers)
response.raise_for_status()
return response.text
async def main():
urls = [
"https://example.com/page1",
"https://example.com/page2",
"https://example.com/page3",
]
tasks = [scrape_page(url) for url in urls]
results = await asyncio.gather(*tasks)
for html in results:
print(f"Συλλέχθηκαν {len(html)} bytes")
asyncio.run(main())
3. Playwright: Η Λύση για JavaScript Sites & Anti-Bot
Το Playwright (από τη Microsoft) είναι το industry standard για scraping το 2026. Προσφέρει stealth mode, browser fingerprint customization και auto-wait για dynamic περιεχόμενο:
from playwright.sync_api import sync_playwright
from playwright_stealth import stealth_sync
import json
def scrape_with_stealth(url: str) -> dict:
with sync_playwright() as p:
# Χρήση Chrome αντί για Chromium για πιο ρεαλιστικό fingerprint
browser = p.chromium.launch(
headless=True,
args=[
"--disable-blink-features=AutomationControlled",
"--no-sandbox",
"--disable-dev-shm-usage",
]
)
context = browser.new_context(
viewport={"width": 1920, "height": 1080},
user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36",
locale="el-GR",
timezone_id="Europe/Athens",
geolocation={"latitude": 37.9838, "longitude": 23.7275},
permissions=["geolocation"],
)
# Εφαρμογή stealth mode
page = context.new_page()
stealth_sync(page)
# Απόκρυψη webdriver
page.add_init_script("""
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
});
// Απόκρυψη Chrome automation
window.chrome = {
runtime: {},
loadTimes: function() {},
csi: function() {},
app: {}
};
""")
page.goto(url, wait_until="networkidle", timeout=30000)
# Αναμονή για dynamic content
page.wait_for_selector("article", timeout=10000)
data = page.evaluate("""
() => ({
title: document.title,
articles: Array.from(document.querySelectorAll('article')).map(a => ({
title: a.querySelector('h2')?.innerText || '',
content: a.querySelector('p')?.innerText || '',
url: a.querySelector('a')?.href || ''
}))
})
""")
browser.close()
return data
# Χρήση
result = scrape_with_stealth("https://example.com/blog")
print(json.dumps(result, indent=2, ensure_ascii=False))
4. AI-Assisted Scraping με LLMs
Το 2026, η μεγαλύτερη καινοτομία στο scraping είναι η χρήση Large Language Models (LLMs) για dynamic parsing. Αντί να γράφουμε selectors που σπάνε με κάθε update, δίνουμε στο LLM το HTML και ζητάμε τα δεδομένα σε φυσική γλώσσα:
import instructor
from openai import OpenAI
from pydantic import BaseModel
from typing import List
class Article(BaseModel):
title: str
summary: str
category: str
publish_date: str
author: str
tags: List[str]
class ExtractionResult(BaseModel):
articles: List[Article]
page_title: str
total_count: int
def extract_with_ai(html_content: str) -> ExtractionResult:
client = instructor.from_openai(OpenAI())
response = client.chat.completions.create(
model="gpt-4o", # ή claude-3-opus
response_model=ExtractionResult,
messages=[
{
"role": "system",
"content": """Είσαι ένα εξειδικευμένο σύστημα εξαγωγής δεδομένων.
Ανάλυσε το HTML που θα σου δώσω και εξαγαγε τα άρθρα σε δομημένη μορφή.
Αγνόησε navigation, footers, διαφημίσεις."""
},
{
"role": "user",
"content": f"Εξαγαγε όλα τα άρθρα από το παρακάτω HTML:\n\n{html_content[:50000]}"
}
]
)
return response
# Χρήση
html = scrape_with_stealth("https://example.com/blog")
result = extract_with_ai(html)
for article in result.articles:
print(f"- {article.title} ({article.category})")
5. Anti-Bot Bypass: Τεχνικές 2026
Τα σύγχρονα anti-bot συστήματα (Cloudflare Turnstile, DataDome, PerimeterX) χρησιμοποιούν:
- Behavioral analysis: mouse movements, scroll patterns, typing speed
- Browser fingerprinting: WebGL, Canvas, AudioContext, fonts, plugins
- JS challenges: Proof-of-Work, computational challenges
- CAPTCHA v3: invisible risk scoring
Στρατηγικές αντιμετώπισης:
- Rotating residential proxies: BrightData, Oxylabs, Smartproxy
- Browser fingerprint spoofing: Playwright Stealth, Puppeteer Extra
- Human-like behavior simulation: τυχαίες κινήσεις ποντικιού, random delays
- Session management: cookies, localStorage, cache persistence
- Rate limiting respect: exponential backoff, jitter
import asyncio
import random
from playwright.async_api import async_playwright
async def human_like_scroll(page):
"""Προσομοίωση ανθρώπινης κύλισης"""
for _ in range(random.randint(3, 8)):
await page.mouse.wheel(0, random.randint(300, 700))
await asyncio.sleep(random.uniform(0.5, 2.0))
# Τυχαία μικρή κίνηση ποντικιού
x = random.randint(100, 1800)
y = random.randint(100, 900)
await page.mouse.move(x, y, steps=random.randint(5, 15))
async def smart_scrape(url: str, proxy: str = None):
async with async_playwright() as p:
browser = await p.chromium.launch(
headless=True,
proxy={"server": proxy} if proxy else None
)
context = await browser.new_context(
viewport={"width": 1920, "height": 1080},
locale="el-GR"
)
page = await context.new_page()
# Προσθήκη cookies session αν υπάρχουν
await context.add_cookies([{
"name": "session_id",
"value": "previously_saved_session",
"domain": ".example.com",
"path": "/"
}])
await page.goto(url, wait_until="domcontentloaded")
await page.wait_for_timeout(random.randint(1000, 3000))
# Ανθρώπινη συμπεριφορά
await human_like_scroll(page)
# Εξαγωγή δεδομένων
content = await page.content()
await browser.close()
return content
6. Ethical Scraping & Νομοθεσία 2026
Το 2026, το scraping ρυθμίζεται από:
- EU AI Act — απαιτεί transparency για scraping που χρησιμοποιείται σε AI training
- GDPR — προστασία προσωπικών δεδομένων κατά τη συλλογή
- Digital Services Act (DSA) — πρόσβαση σε δεδομένα πλατφορμών
- robots.txt — αν και μη νομικά δεσμευτικό, η αγνόησή του μπορεί να χρησιμοποιηθεί εναντίον σου
- Το
robots.txtτης σελίδας - Τους όρους χρήσης (Terms of Service)
- Αν τα δεδομένα είναι προσωπικά (GDPR)
- Αν θα χρησιμοποιηθούν για AI training (AI Act)
Βέλτιστες Πρακτικές Ethical Scraping
- Rate limiting: Μην στέλνεις πάνω από 1 request/sec ανά IP
- Cache: Αποθήκευσε αποτελέσματα για να μην ξαναχτυπάς το ίδιο endpoint
- Attribution: Ανέφερε την πηγή των δεδομένων
- Contact: Αν είναι δυνατόν, επικοινώνησε με τον κάτοχο του site
- API: Προτίμησε official APIs όπου υπάρχουν
7. Από το Beautiful Soup στο Pipeline 2026
Για reference, η κλασική μέθοδος με Beautiful Soup παραμένει χρήσιμη για απλά static sites:
import httpx
from bs4 import BeautifulSoup
from typing import List, Dict
def classic_scrape(url: str) -> List[Dict]:
response = httpx.get(url, follow_redirects=True)
soup = BeautifulSoup(response.text, 'lxml')
articles = []
for article in soup.select('article.post'):
articles.append({
'title': article.select_one('h2 a').get_text(strip=True),
'url': article.select_one('h2 a')['href'],
'summary': article.select_one('p.summary').get_text(strip=True),
'date': article.select_one('time')['datetime'],
})
return articles
Σύνοψη & Επόμενα Βήματα
Το web scraping το 2026 απαιτεί:
- Playwright αντί για απλό requests — για JS rendering & anti-bot bypass
- HTTPX για async HTTP operations
- LLMs για intelligent parsing αντί για fragile selectors
- Residential proxies & stealth techniques για anti-bot
- Νομική συμμόρφωση με AI Act, GDPR, DSA
Επόμενα βήματα:
- Δοκίμασε το παράδειγμα με Playwright + stealth
- Πειραματίσου με LLM-based extraction
- Στήσε ένα production pipeline με Scrapy + Splash + rotating proxies
