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.
Ü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
- Erstellen Sie ein Verzeichnis und eine virtuelle Umgebung.
- Installieren Sie
requestspluspython-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 mit600-Berechtigungen auf und laden Sie sie mitpython-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.