Skip to content
Intermediate / 5 min read

So richten Sie Smartproxy Datacenter-Proxys unter Linux für die Python-Preisüberwachung ein

Leiten Sie geplante Python-Anfragen zur Preisüberwachung über Smartproxy Datacenter-Proxys unter Linux, mit Zugangsdaten außerhalb Ihres Codes, Wiederholungen und Backoff, Rotationshinweisen, CSV-Protokollierung und einem Cron-Zeitplan.

Linux SOCKS5 HTTP(S) Web Scraping

Überblick

Smartproxy ist ein anfängerfreundliches Proxy-Netzwerk mit Residential- und Datacenter-Pools, die über HTTP und SOCKS5 erreichbar sind und nach einem monatlichen Pauschalmodell abgerechnet werden. Dieses Tutorial richtet den Datacenter-Pool auf eine konkrete, häufige Aufgabe unter Linux aus: geplante Preisüberwachung in Python.

Preisüberwachung eignet sich gut für Datacenter-IPs. Anfragen sind schnell, die Ziele sind öffentliche Produktseiten, und die Arbeitslast ist leseintensiv. Wenn ein bestimmter Händler beginnt, Datacenter-Bereiche zu blockieren, läuft dasselbe Skript gegen den Residential-Pool — nur der Endpunkt und die Zugangsdaten ändern sich.

Am Ende haben Sie:

  • Zugangsdaten, die außerhalb Ihres Quellcodes gespeichert sind
  • Eine Proxy-Anfrage, die von der Kommandozeile aus verifiziert wurde
  • Ein Python-Skript, das Produktseiten über den Proxy mit Wiederholungen und Backoff abruft
  • Preise, die mit Zeitstempeln an eine CSV-Datei angehängt werden
  • Einen Cron-Eintrag, der den Job nach Zeitplan ausführt

Für all das benötigen Sie keine GUI. Smartproxy bietet auch Browser-Erweiterungen an, aber ein Headless-Linux-Job benötigt nur Host, Port, Benutzername und Passwort aus Ihrem Dashboard.

Voraussetzungen

  • Einen Linux-Host — die folgenden Befehle funktionieren in den Debian/Ubuntu- und Fedora/RHEL-Familien
  • Python 3.9 oder neuer
  • Ein Smartproxy-Konto mit Zugriff auf Datacenter-Proxys
  • Den Proxy-Host, Port, Benutzername und Passwort, die in Ihrem Smartproxy-Dashboard aufgeführt sind

Datacenter oder Residential?

Beide Pool-Typen werden im Code identisch konfiguriert, daher geht es bei der Entscheidung um die Zielseite, nicht um das Tooling.

Faktor Datacenter Residential
Geschwindigkeit pro Anfrage Schnell Mittel
Kosten pro GB Niedriger Höher
Blockierrisiko bei großen Händlern Höher Niedriger
Beste Eignung Hochvolumige Lesezugriffe auf tolerante Seiten Geschützte Seiten und geografisch genaue Preisangaben

Faustregeln:

  • Beginnen Sie mit Datacenter, weil es der günstigere und schnellere Weg ist, um zu prüfen, ob Ihr Parser funktioniert.
  • Verschieben Sie ein einzelnes hartnäckiges Ziel zu Residential, anstatt den gesamten Job zu migrieren.
  • Halten Sie Proxy-Schema und Authentifizierung zwischen den Pools identisch, damit der Wechsel eine Konfigurationsänderung und keine Neuimplementierung ist.

Schritte

Schritt 1 — Zugangsdaten exportieren und Endpunkt verifizieren

Legen Sie die vier Werte aus Ihrem Dashboard als Umgebungsvariablen für die aktuelle Shell-Sitzung fest. Ersetzen Sie die Platzhalter durch Ihre eigenen Werte.

export SMART_HOST="<host-from-dashboard>"
export SMART_PORT="<port-from-dashboard>"
export SMART_USER="<username>"
export SMART_PASS="<password>"

Führen Sie eine einzelne Anfrage über den Proxy aus. Die Übergabe der Zugangsdaten mit -U vermeidet Probleme mit Sonderzeichen im Passwort.

curl -sS --max-time 20 -x "http://${SMART_HOST}:${SMART_PORT}" -U "${SMART_USER}:${SMART_PASS}" https://api.ipify.org

Die Antwort sollte eine IP-Adresse sein, die nicht die eigene IP Ihres Servers ist. Wenn Sie stattdessen einen 407-Fehler sehen, springen Sie zur Fehlerbehebungstabelle am Ende.

Schritt 2 — Projekt erstellen und Geheimnisse in eine Datei verschieben

  1. Erstellen Sie ein Verzeichnis und eine virtuelle Umgebung.
  2. Installieren Sie requests plus python-dotenv, wodurch die .env-Datei zur Laufzeit in die Umgebung geladen wird.
mkdir -p ~/price-monitor && cd ~/price-monitor
python3 -m venv .venv && source .venv/bin/activate
pip install requests python-dotenv

Erstellen Sie die Geheimnisdatei und schränken Sie ihre Berechtigungen ein. Diese Datei sollte niemals committet werden.

# ~/price-monitor/.env
SMART_HOST=<host-from-dashboard>
SMART_PORT=<port-from-dashboard>
SMART_USER=<username>
SMART_PASS=<password>
chmod 600 .env
cat > .gitignore <<'EOF'
.env
.venv/
EOF

Schritt 3 — Proxy-URL in Python erstellen

Erstellen Sie die URL einmal und verwenden Sie sie erneut. Das Quoten von Benutzername und Passwort mit quote() schützt vor Zeichen wie @, : oder #, die andernfalls die URL-Analyse beschädigen würden.

# ~/price-monitor/proxy_config.py
import os
from urllib.parse import quote
from dotenv import load_dotenv

load_dotenv()

def proxy_url(scheme='http'):
    user = quote(os.environ['SMART_USER'], safe='')
    password = quote(os.environ['SMART_PASS'], safe='')
    host = os.environ['SMART_HOST']
    port = os.environ['SMART_PORT']
    return f'{scheme}://{user}:{password}@{host}:{port}'

PROXIES = {'http': proxy_url(), 'https': proxy_url()}

Wenn Ihr Endpunkt einen anderen Port für HTTPS-Datenverkehr verwendet, legen Sie beide Schlüssel separat fest, anstatt anzunehmen, dass der Port gemeinsam genutzt wird.

Schritt 4 — Seite über den Proxy mit Wiederholungen abrufen

Umwickeln Sie die Anfrage mit einer kleinen Wiederholungsschleife. Exponentielles Backoff verhindert, dass Sie ein Ziel überlasten, das Sie rate-limitiert.

# ~/price-monitor/fetch_price.py
import time
import requests
from proxy_config import PROXIES

HEADERS = {
    'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 '
                  '(KHTML, like Gecko) Chrome/124.0 Safari/537.36',
    'Accept-Language': 'en-US,en;q=0.9',
}

def fetch(url, retries=3, timeout=25):
    last_error = None
    for attempt in range(1, retries + 1):
        try:
            response = requests.get(url, headers=HEADERS, proxies=PROXIES, timeout=timeout)
            if response.status_code == 200:
                return response.text
            last_error = 'HTTP %s' % response.status_code
        except requests.RequestException as exc:
            last_error = str(exc)
        time.sleep(2 ** attempt)
    raise RuntimeError('Failed to fetch %s: %s' % (url, last_error))

if __name__ == '__main__':
    html = fetch('https://example.com/product/123')
    print(html[:500])

Schritt 5 — Preis extrahieren und an CSV anhängen

HTML-Parser wie BeautifulSoup oder selectolax ermöglichen eine robustere Extraktion, aber ein Regex reicht aus, um die Pipeline zu validieren, bevor Sie in Selektoren investieren.

# ~/price-monitor/parse_price.py
import csv
import datetime
import re
import sys
from fetch_price import fetch

def parse_price(html):
    # Ersetzen Sie dieses Muster durch einen Selektor, der zum Markup der Zielseite passt.
    match = re.search(r'data-price=([0-9.]+)', html)
    return float(match.group(1)) if match else None

def main(url):
    price = parse_price(fetch(url))
    with open('prices.csv', 'a', newline='', encoding='utf-8') as handle:
        writer = csv.writer(handle)
        writer.writerow([datetime.datetime.now(datetime.UTC).isoformat(), url, price])

if __name__ == '__main__':
    main(sys.argv[1] if len(sys.argv) > 1 else 'https://example.com/product/123')

Schritt 6 — Entscheiden, wie die Rotation für Ihren Endpunkt funktionieren soll

Das Rotationsverhalten hängt vom Endpunkt ab, den Sie erhalten haben. Prüfen Sie daher Ihr Dashboard, bevor Sie etwas annehmen:

  • Wenn der Port die Exit-IP bei jeder Anfrage rotiert, reicht ein erneuter Aufruf von fetch() aus — jede neue Verbindung kann von einer anderen IP ausgehen.
  • Wenn der Port eine Sticky Session hält, wechseln Sie durch die in Ihrem Dashboard aufgeführten Ports und behalten Sie einen Port pro Worker bei.
  • Verwenden Sie dieselbe requests.Session() nur weiter, wenn Sie eine Sticky Session wünschen; eine frische Session pro Anfrage ist die sicherere Standardeinstellung für die Überwachung.

Um die Rotation zu bestätigen, rufen Sie den IP-Endpunkt einige Male hintereinander auf.

def check_ip():
    return fetch('https://api.ipify.org').strip()

if __name__ == '__main__':
    for _ in range(5):
        print(check_ip())

Schritt 7 — Mäßige Parallelität hinzufügen

Ein Thread-Pool verkürzt eine lange Liste von URLs, aber Parallelität ist auch der schnellste Weg, blockiert zu werden. Beginnen Sie klein und erhöhen Sie die Worker-Anzahl nur, solange die Fehlerraten konstant bleiben.

Gleichzeitige Worker Wann es sinnvoll ist
1 bis 3 Erster Lauf gegen ein neues Ziel
4 bis 6 Stabiler Datacenter-Lauf, keine Rate-Limit-Antworten
8 oder mehr Nur nach Tests und normalerweise mit Residential-IPs
from concurrent.futures import ThreadPoolExecutor, as_completed
from fetch_price import fetch

urls = [f'https://example.com/product/{sku}' for sku in range(1, 6)]

with ThreadPoolExecutor(max_workers=5) as pool:
    futures = {pool.submit(fetch, url): url for url in urls}
    for future in as_completed(futures):
        url = futures[future]
        try:
            print(url, len(future.result()))
        except Exception as exc:
            print(url, 'failed:', exc)

Schritt 8 — Job mit cron planen

Bearbeiten Sie Ihre crontab und fügen Sie eine Zeile hinzu. Das cd ist wichtig, weil das Skript darauf angewiesen ist, dass sich seine .env-Datei im Arbeitsverzeichnis befindet.

crontab -e
0 */6 * * * cd /home/<user>/price-monitor && .venv/bin/python parse_price.py https://example.com/product/123 >> run.log 2>&1

Verwenden Sie den absoluten Pfad zum Python der virtuellen Umgebung. Ein bloßes python unter cron verweist oft auf den System-Interpreter und sieht Ihre installierten Pakete nicht.

SOCKS5 statt HTTP verwenden

Smartproxy unterstützt SOCKS5 neben HTTP, und der Wechsel ist eine einzeilige Änderung. Bestätigen Sie den SOCKS5-Port in Ihrem Dashboard, da er sich vom HTTP-Port unterscheiden kann.

pip install 'requests[socks]'
PROXIES = {'http': proxy_url('socks5'), 'https': proxy_url('socks5')}

SOCKS5 ist nützlich, wenn Sie auch die DNS-Auflösung durch den Proxy leiten möchten oder wenn ein anderes Tool in Ihrer Pipeline nur SOCKS5 spricht.

Fehlerbehebung

Symptom Wahrscheinliche Ursache Was zu versuchen ist
407 Proxy Authentication Required Falsche oder veraltete Zugangsdaten oder ein Passwort mit nicht maskierten Sonderzeichen Kopieren Sie die Werte erneut aus dem Dashboard, verifizieren Sie mit dem curl -U-Befehl aus Schritt 1 und verlassen Sie sich in Python auf quote()
403 oder eine CAPTCHA-Seite Ziel blockiert Datacenter-Bereiche, oder Header wirken automatisiert Verlangsamen Sie den Lauf, senden Sie realistische Browser-Header und verschieben Sie dieses Ziel in den Residential-Pool
429 Too Many Requests Zu viele gleichzeitige Worker Reduzieren Sie max_workers, behalten Sie das exponentielle Backoff bei und fügen Sie eine Pause zwischen Batches hinzu
Verbindungs-Timeout bei jeder Anfrage Falscher Host oder Port oder ausgehender Datenverkehr auf diesem Port ist blockiert Führen Sie die curl-Prüfung erneut aus; prüfen Sie ufw, iptables oder eine Unternehmens-Egress-Richtlinie für den Proxy-Port
Funktioniert mit einem IP-Checker, schlägt aber beim Ziel fehl Website-spezifischer Anti-Bot-Schutz Testen Sie eine Anfrage in einer normalen Browsersitzung, passen Sie Header an und rechnen Sie damit, dass einige Ziele Residential-IPs benötigen
CERTIFICATE_VERIFY_FAILED Veraltetes CA-Bundle auf dem Host Aktualisieren Sie ca-certificates und die Pakete der virtuellen Umgebung, anstatt die Verifikation zu deaktivieren

Zusammenfassung

  • Der Datacenter-Pool von Smartproxy ist eine praktische Standardwahl für hochvolumige, leseintensive Preisüberwachung unter Linux.
  • Bewahren Sie Host, Port, Benutzername und Passwort in einer .env-Datei mit 600-Berechtigungen auf und laden Sie sie mit python-dotenv.
  • Quoten Sie Zugangsdaten, bevor Sie sie in eine Proxy-URL einfügen, sonst brechen Sonderzeichen die Analyse.
  • Legen Sie immer ein Anfrage-Timeout fest, wiederholen Sie mit Backoff und halten Sie die Parallelität niedrig, bis Fehlerraten beweisen, dass eine Erhöhung sicher ist.
  • Prüfen Sie Ihr Dashboard, um zu erfahren, ob Ihr Endpunkt pro Anfrage rotiert oder eine Sticky Session hält, und entwerfen Sie den Lauf entsprechend.
  • Wechseln Sie ein einzelnes blockiertes Ziel in den Residential-Pool, anstatt den Job neu aufzubauen, und verwenden Sie SOCKS5 nur, wenn Sie es aus DNS- oder Tooling-Gründen benötigen.