Inhaltsverzeichnis
2. Verwenden und Rotieren von Proxys mit Python (traditionelle Methode)
Nachdem wir die einfache Methode hinter uns gelassen haben, schauen wir uns einen traditionelleren Ansatz zur Proxy-Rotation in Python an. Wie Sie gleich sehen werden, ist diese Methode weitaus aufwändiger und erfordert viel Zeit und Sorgfalt, damit sie reibungslos funktioniert.
Schritt 1. Einrichten der Voraussetzungen
Stellen Sie sicher, dass Python auf Ihrem System installiert ist. Für dieses Tutorial können Sie Python Version 3.7 oder höher verwenden. Erstellen Sie ein neues Verzeichnis, in dem der gesamte Code für dieses Projekt gespeichert wird, und erstellen Sie eine app.py-Datei in:
$ mkdir proxy_rotator
$ cd proxy_rotator
$ touch app.py
Außerdem müssen Requests installiert sein. Das geht ganz einfach über PIP:
Schritt 2. Wie erstelle ich eine Proxy-Liste?
Bevor Sie Proxys rotieren können, benötigen Sie eine Liste der Proxys. Im Internet sind verschiedene Listen verfügbar. Einige davon sind kostenpflichtig, andere kostenlos. Jedes hat seine eigenen Vor- und Nachteile. Eine sehr bekannte Quelle für kostenlose Proxys ist Free Proxy List. Das größte Problem bei Proxys aus solchen kostenlosen Listen besteht darin, dass die meisten von ihnen möglicherweise bereits von Ihrer Zielwebsite blockiert werden. Sie müssen daher einige Tests durchführen, um sicherzustellen, dass der von Ihnen verwendete Proxy nicht blockiert ist.
Sie können die Proxy-Liste von Free Proxy List in eine TXT-Datei herunterladen.
Notiz: Wenn Sie sich für die einfache Methode entscheiden, die weiter oben in diesem Artikel beschrieben wurde, werden Sie erfreut sein zu erfahren, dass ScraperAPI automatisch alle Proxys überwacht, um sicherzustellen, dass sie nicht von der Zielwebsite blockiert werden!
Schritt 3. Eine Anfrage ohne Proxy stellen
Schauen wir uns zunächst an, wie man eine Anfrage mit Anfragen ohne Proxy stellt. Sie können dies auf zwei verschiedene Arten tun. Sie können entweder direkt die Methode „requests.get“ (oder eine ähnliche) verwenden oder eine Sitzung erstellen und diese zum Senden von Anfragen verwenden.
Die direkten Anfragen mit „requests.get“ können wie folgt erfolgen:
import requests
html = requests.get("https://yasoob.me")
print(html.status_code)
# output: 200
Die gleiche Anfrage mit Session kann wie folgt gestellt werden:
import requests
s = requests.Session()
html = s.get("https://yasoob.me")
print(html.status_code)
# Output: 200
Es ist wichtig, beide Methoden zu besprechen, da der Prozess der Verwendung eines Proxys bei beiden Methoden leicht unterschiedlich ist.
Schritt 4. Verwenden eines Proxys mit Anfragen
Es ist sehr einfach, einen Proxy für Anfragen zu verwenden. Sie müssen den Anfragen lediglich ein Wörterbuch bereitstellen, das die HTTP- und HTTPS-Schlüssel und die entsprechende Proxy-URL enthält. Sie können für beide Protokolle dieselbe Proxy-URL verwenden.
Notiz: Da in diesem Artikel kostenlose Proxys verwendet werden, funktionieren die Proxy-URLs in den Codeblöcken möglicherweise nicht mehr, wenn Sie sie lesen. Sie können mitmachen, indem Sie die Proxy-URLs in den Codebeispielen durch funktionierende Proxys aus der Free Proxy List ersetzen.
Hier ist ein Beispielcode für die Verwendung eines Proxys in Anfragen, ohne ein Sitzungsobjekt zu erstellen:
import requests
proxies = {
'http': 'http://47.245.97.176:9000',
'https': 'http://47.245.97.176:9000',
}
response = requests.get('https://httpbin.org/ip', proxies=proxies)
print(response.text)
# Output: {
# "origin": "47.245.97.176"
# }
Und hier ist das gleiche Beispiel mit dem Session-Objekt:
import requests
proxies = {
'http': 'http://47.245.97.176:9000',
'https': 'http://47.245.97.176:9000',
}
s = requests.Session()
s.proxies = proxies
response = s.get('https://httpbin.org/ip')
print(response.text)
# Output: {
# "origin": "47.245.97.176"
# }
Es ist üblich, das zu bekommen CERTIFICATE_VERIFY_FAILED SSL
Fehler bei der Verwendung kostenloser Proxys. So sieht der Fehler aus:
requests.exceptions.SSLError: HTTPSConnectionPool(host='httpbin.org', port=443): Max retries exceeded with url: /ip (Caused by SSLError(SSLCertVerificationError(1, '(SSL: CERTIFICATE_VERIFY_FAILED) certificate verify failed: unable to get local issuer certificate (_ssl.c:997)')))
Sie können diesen Fehler umgehen, indem Sie ihn übergeben verify=False
zur get-Methode wie folgt:
requests.get('https://httpbin.org/ip', proxies=proxies, verify=False)
# or
s.get('https://httpbin.org/ip', verify=False)
Schritt 5. Verwenden eines authentifizierten Proxys mit Anfragen
Ebenso einfach ist es, bei Anfragen authentifizierte Proxys zu verwenden. Sie müssen lediglich das Proxy-Wörterbuch ändern und den Benutzernamen und das Passwort für jede Proxy-URL angeben:
proxies = {
'http': 'http://username:[email protected]:8080',
'https': 'http://username:[email protected]:8081',
}
Ersetzen username
Und password
mit Arbeitszeugnissen und schon kann es losgehen. Der Rest des Codes zum Senden von Anfragen bleibt unverändert wie in den vorherigen Codebeispielen.
Schritt 6. Festlegen eines Proxys über Umgebungsvariablen
Sie können Proxys auch verwenden, ohne Proxy-spezifischen Code zu Python hinzuzufügen. Dies ist durch das Setzen entsprechender Umgebungsvariablen möglich. Anfragen ehrt die HTTP_PROXY
Und HTTPS_PROXY
Umgebungsvariablen. Wenn diese festgelegt sind, verwenden Anfragen ihren entsprechenden Wert als entsprechende Proxy-URL.
Sie können diese Umgebungsvariablen in einem Unix-ähnlichen System festlegen, indem Sie das Terminal öffnen und diesen Code eingeben:
export HTTP_PROXY='http://47.245.97.176:9000'
export HTTPS_PROXY='http://47.245.97.176:9000'
Jetzt können Sie jeden Proxy-spezifischen Code aus Ihrem Python-Programm entfernen und es verwendet automatisch den über diese Umgebungsvariablen festgelegten Proxy-Endpunkt!
Probieren Sie es aus, indem Sie diesen Code ausführen und sicherstellen, dass die Ausgabe mit dem über die Umgebungsvariablen festgelegten Proxy-Endpunkt übereinstimmt:
import requests
response = requests.get('https://httpbin.org/ip', proxies=proxies)
print(response.text)
# Output: {
# "origin": "47.245.97.176"
# }
Schritt 7. Proxys bei jeder Anfrage rotieren
Wie in der Einleitung erwähnt, können auch Proxys blockiert werden. Daher ist es wichtig, Proxys zu rotieren und zu versuchen, nicht einen einzelnen Proxy für mehrere Anfragen zu verwenden. Schauen wir uns an, wie Sie Proxys in Python mithilfe von Anforderungen rotieren können.
Laden von Proxys aus einer Proxy-Liste
Speichern Sie zunächst die Proxys aus der Free Proxy List in einem proxy_list.txt
Datei in der proxy_rotator
Verzeichnis. So wird die Datei aussehen:
196.20.125.157:8083
47.245.97.176:9000
54.39.132.131:80
183.91.3.22:11022
154.236.179.226:1981
41.65.46.178:1981
89.175.26.210:80
61.216.156.222:60808
115.144.99.220:11116
...
167.99.184.232:3128
Öffnen Sie nun die app.py
Datei und schreiben Sie den folgenden Code, um diese Proxys in eine Liste zu laden:
def load_proxy_list():
with open("proxy_list.txt", "r") as f:
proxy_list = f.read().strip().split()
return proxy_list
Überprüfen Sie, ob der Proxy funktioniert
Da Sie nun über eine Liste mit Proxys verfügen, ist es wichtig, zu testen, ob alle Proxys in der Liste funktionieren, und diejenigen zu entfernen, die nicht funktionieren. Sie können dies testen, indem Sie über den Proxy eine Anfrage an httpbin senden und sicherstellen, dass die Antwort die Proxy-IP enthält. Wenn die Anfrage aus irgendeinem Grund fehlschlägt, können Sie den Proxy verwerfen.
Sie können den Verwerfungsprozess detaillierter gestalten, indem Sie sicherstellen, dass die Anfrage aufgrund eines Problems mit dem Proxy und nicht aufgrund eines nicht damit zusammenhängenden Netzwerkproblems fehlgeschlagen ist. Lassen Sie uns zunächst die Dinge einfach halten und einen Proxy verwerfen, wenn ein Fehler (Ausnahme) auftritt. Hier ist ein Code, der dies tut:
def check_proxy(proxy_string):
proxies = {
'http': f'http://{proxy_string}',
'https': f'http://{proxy_string}',
}
try:
response = requests.get('https://httpbin.org/ip', proxies=proxies, timeout=30)
if response.json()('origin') == proxy_string.split(":")(0):
# Proxy works
return True
# Proxy doesn't work
return False
except Exception:
return False
Der Code ist ziemlich einfach, Sie übergeben eine Proxy-Zeichenfolge (z. B. 0.0.0.0:8080) an check_proxy
als Argument, und dann sendet check_proxy eine Anfrage an httpbin.org/ip
über den übergebenen Proxy. Wenn die Antwort die Proxy-IP enthält, wird „True“ zurückgegeben. Ist dies nicht der Fall (oder schlägt die Anforderung fehl), wird „False“ zurückgegeben. Im Code ist außerdem für jede Anfrage ein Timeout definiert. Wenn die Antwort nicht innerhalb des definierten Timeouts empfangen wird, wird eine Ausnahme ausgelöst. Dadurch wird sichergestellt, dass Sie nicht mit langsamen Proxys enden.
Rotieren Sie den Proxy bei jeder Anfrage
Sie können nun die Funktionen in den beiden vorherigen Codeauflistungen koppeln und sie verwenden, um den Proxy bei jeder Anfrage zu rotieren. Hier ist eine mögliche Möglichkeit, dies zu tun:
from random import choice
def get_working_proxy():
random_proxy = choice(proxy_list)
while not is_proxy_working(random_proxy):
proxy_list.remove(random_proxy)
random_proxy = choice(proxy_list)
return random_proxy
def load_url(url):
proxy = get_working_proxy()
proxies = {
'http': f'http://{proxy}',
'https': f'http://{proxy}',
}
response = requests.get(url, proxies=proxies)
# parse the response
# ...
return response.status_code
urls_to_scrape = (
"https://news.ycombinator.com/item?id=36580417",
"https://news.ycombinator.com/item?id=36575784",
"https://news.ycombinator.com/item?id=36577536",
# ...
)
proxy_list = load_proxy_list()
for url in urls_to_scrape:
print(load_url(url))
Lassen Sie uns diesen Code ein wenig analysieren. Es enthält eine get_working_proxy()
Funktion, die einen zufälligen Proxy aus der Proxy-Liste auswählt, überprüft, ob er funktioniert, und ihn dann zurückgibt. Wenn der Proxy nicht wie erwartet funktioniert, entfernt die Funktion diesen Proxy aus der Proxy-Liste. Dann gibt es noch das load_url()
Funktion. Es erhält einen funktionierenden Proxy, indem es den aufruft get_working_proxy()
Funktion und verwendet den zurückgegebenen Proxy, um die Anfrage an die Ziel-URL weiterzuleiten. Schließlich gibt es noch Code zum Starten des Scraping-Vorgangs. Dabei ist es wichtig zu beachten, dass für jede Anfrage ein zufälliger Proxy verwendet wird, was dazu beiträgt, die Scraping-Last auf mehrere Proxys zu verteilen.
So verbessern Sie den Proxy-Rotator
Es gibt so viele Dinge, die Sie tun können, um den naiven Proxy-Rotator, den Sie bisher erstellt haben, zu verbessern. Das allererste, was Sie tun können, ist, den Ausnahmebehandlungscode zu überarbeiten und sicherzustellen, dass der Proxy nur dann verworfen wird, wenn der Proxy fehlerhaft ist. Eine weitere Möglichkeit besteht darin, verworfene Proxys nach einer Weile erneut zu überprüfen. Im Allgemeinen wechseln kostenlose Proxys viel zu oft zwischen funktionierendem und nicht funktionierendem Zustand. Sie können auch eine Logik hinzufügen, um die Proxys direkt von der Website „Free Proxy List“ zu laden, anstatt sie zuerst manuell in einer TXT-Datei zu speichern.
Abschluss
Sie haben also gelernt, wie Sie Proxys mit Anfragen in Python verwenden, sie beschaffen, überprüfen und rotieren. Jetzt fragen Sie sich bestimmt, welche Methode Sie am besten mit Proxys verwenden können. Sie können einen traditionelleren Weg wählen, aber Sie sollten bereit sein, den Code häufiger zu optimieren und ständig ein Auge auf die Aktualisierung der Proxys zu haben. Es kann irgendwann zu zeitaufwändig werden und Ihren Datenerfassungsfluss unterbrechen. Am besten verwenden Sie ein Tool, das die Proxy-Rotation für Sie durchführt, damit Sie die benötigten Daten schnell und in großem Umfang erhalten.
Probieren Sie ScraperAPI aus und erhalten Sie 5.000 kostenlose Credits, wenn Sie sich anmelden!