Socks5Proxy

Configuration du proxy dans Python requests, connexion des proxies SOCKS5 et HTTP

Ce guide explique étape par étape comment connecter les proxies HTTP et SOCKS5 de Socks5Proxy avec la bibliothèque Python requests, l'authentification par identifiant/mot de passe, et le code pour faire tourner et réessayer une liste.

De quoi avez-vous besoin ?

Vous avez besoin de Python 3.8 ou supérieur et de la bibliothèque requests. Pour utiliser SOCKS5, vous devez également installer le bundle de support SOCKS. L'installation de requests[socks] installera également PySocks, ce qui vous permettra d'utiliser les adresses socks5 et socks5h.

Les informations proxy sont disponibles dans l'onglet 'Mes proxies' du dashboard. Dans cet exemple : IP 198.51.100.23, port HTTP 8000, port SOCKS5 1080, identifiant spx_user, mot de passe spx_pass. Remplacez par vos valeurs réelles.

pip install "requests[socks]"

Comment se connecter à un proxy HTTP ?

requests envoie les requêtes via le proxy si vous ajoutez l'adresse au dictionnaire proxies. Il est important d'ajouter la même adresse de proxy HTTP aux clés http et https. Si la clé https est absente, les requêtes HTTPS ne passeront pas par le proxy.

Les requêtes vers les sites HTTPS passent par le proxy via le tunnel CONNECT, transmettant le contenu chiffré de bout en bout. Le code ci-dessous montre un exemple de requête vers une adresse de vérification d'IP pour confirmer que l'IP du proxy apparaît dans la réponse.

import requests

proxy = "http://spx_user:spx_pass@198.51.100.23:8000"
proxies = {"http": proxy, "https": proxy}

r = requests.get("https://api.ipify.org?format=json", proxies=proxies, timeout=20)
print(r.status_code, r.json())  # the "ip" field should show the proxy IP

Comment se connecter à un proxy SOCKS5 ?

Préférez le préfixe socks5h : le proxy résoudra les noms de domaine (DNS), masquant vos requêtes. Avec socks5, la résolution se fait côté client avant d'envoyer l'IP au proxy.

Utilisez le port SOCKS5. Une adresse SOCKS5 dans un port HTTP échouera - vérifiez bien les ports ligne par ligne.

import requests

proxy = "socks5h://spx_user:spx_pass@198.51.100.23:1080"
proxies = {"http": proxy, "https": proxy}

r = requests.get("https://api.ipify.org?format=json", proxies=proxies, timeout=20)
print(r.json())

Comment alterner entre plusieurs proxies pour les requêtes ?

Pour collecter de nombreuses pages, la méthode de base consiste à recevoir une liste et à utiliser le proxy suivant pour chaque requête. Le code ci-dessous récupère une liste SOCKS5 via l'API et utilise les proxies en séquence, en renvoyant les requêtes échouées jusqu'à 3 fois avec un autre proxy. Il inclut également une pause pour éviter de surcharger le même domaine.

Plutôt que d'abandonner immédiatement un proxy en échec, mettez-le en pause avant de le réutiliser. Les erreurs temporaires sont souvent dues à l'état du site cible.

import itertools
import time
import requests

API = "https://socks5proxy.io/api/v1"
KEY = "YOUR_API_KEY"

lines = requests.get(
    API + "/proxies/download",
    params={"format": "user:pass@ip:port", "protocol": "socks5"},
    headers={"Authorization": "Bearer " + KEY},
    timeout=30,
).text.split()
pool = itertools.cycle(lines)

def fetch(url, tries=3):
    for _ in range(tries):
        p = "socks5h://" + next(pool)
        try:
            r = requests.get(url, proxies={"http": p, "https": p}, timeout=20)
            if r.status_code == 200:
                return r.text
        except requests.RequestException:
            pass
        time.sleep(1)
    return None

for page in range(1, 6):
    html = fetch("https://example.com/list?page=" + str(page))
    print(page, "ok" if html else "failed")
    time.sleep(0.5)

Comment maintenir les sessions et cookies ?

Pour les flux nécessitant une continuité des cookies, comme la connexion ou la navigation entre les pages, utilisez un proxy fixe par session requests.Session. Ajoutez l'adresse à l'attribut proxies de l'objet session pour que toutes les requêtes de cette session utilisent la même IP. Une fois le flux terminé, fermez la session et créez une nouvelle session avec le proxy suivant.

En fixant aussi les en-têtes User-Agent et Accept-Language par session, l'affichage sur le site cible reste cohérent.

import requests

s = requests.Session()
s.proxies = {
    "http": "http://spx_user:spx_pass@198.51.100.23:8000",
    "https": "http://spx_user:spx_pass@198.51.100.23:8000",
}
s.headers.update({"User-Agent": "Mozilla/5.0", "Accept-Language": "en-US,en;q=0.9"})

s.get("https://example.com/", timeout=20)          # cookies are stored in the session
r = s.get("https://example.com/account", timeout=20)  # same IP, same cookies
print(r.status_code)
s.close()

Comment utiliser l'autorisation IP pour se connecter ?

Si vous enregistrez l'IPv4 du serveur exécutant ce code dans le tableau de bord, vous pouvez utiliser l'adresse sans nom d'utilisateur ni mot de passe. Cela facilite le déploiement du même code sur plusieurs serveurs sans avoir à stocker les mots de passe dans le code ou les fichiers de configuration. Vous pouvez également choisir le format ip:port pour obtenir la liste.

import requests

proxy = "http://198.51.100.23:8000"  # no user or password, server IP is authorized in the dashboard
r = requests.get("https://api.ipify.org", proxies={"http": proxy, "https": proxy}, timeout=20)
print(r.text)

Comment envoyer plusieurs requêtes simultanément et rapidement ?

requests attend la fin d'une requête avant de passer à la suivante, donc pour récupérer rapidement de nombreuses pages, vous devez exécuter plusieurs tâches en parallèle. La méthode la plus simple est d'utiliser ThreadPoolExecutor de concurrent.futures. Gardez le nombre de tâches inférieur au nombre de proxies pour éviter de surcharger une seule IP.

Le code ci-dessous divise une liste d'adresses entre 20 workers, chaque tâche sélectionnant le proxy suivant dans la liste. itertools.cycle peut être utilisé par plusieurs threads sans problème, mais pour un ordre précis, utilisez un verrou.

import itertools
from concurrent.futures import ThreadPoolExecutor
import requests

lines = open("proxies.txt").read().split()  # user:pass@ip:port per line
pool = itertools.cycle(lines)

def get(url):
    p = "http://" + next(pool)
    try:
        return url, requests.get(url, proxies={"http": p, "https": p}, timeout=20).status_code
    except requests.RequestException as e:
        return url, type(e).__name__

urls = ["https://example.com/item/" + str(i) for i in range(200)]
with ThreadPoolExecutor(max_workers=20) as ex:
    for url, result in ex.map(get, urls):
        print(url, result)

Puis-je utiliser des bibliothèques asynchrones comme httpx ou aiohttp ?

Oui. httpx permet de spécifier l'adresse du proxy dans l'argument proxy lors de la création du client, et en installant httpx[socks], vous pouvez utiliser une adresse SOCKS5. Le client asynchrone AsyncClient prend également le même argument.

aiohttp : passez l'adresse HTTP proxy dans le paramètre proxy, et les identifiants via aiohttp.BasicAuth. Pour SOCKS5 (non supporté nativement), utilisez le connecteur du package aiohttp-socks.

Le mode asynchrone permet de traiter des milliers de requêtes avec peu de ressources, mais sans limite de concurrence, cela peut surcharger le site cible et les proxies. Utilisez asyncio.Semaphore pour limiter les requêtes simultanées.

import httpx

with httpx.Client(proxy="http://spx_user:spx_pass@198.51.100.23:8000", timeout=20) as client:
    print(client.get("https://api.ipify.org").text)

Comment résoudre les erreurs courantes ?

L'erreur "Missing dependencies for SOCKS support" signifie que requests[socks] n'est pas installé. Veuillez le réinstaller dans le même environnement virtuel.

407 Proxy Authentication Required signifie que votre nom d'utilisateur ou mot de passe est incorrect, ou que vous utilisez l'autorisation IP mais que l'IP de votre serveur n'est pas enregistrée. Si votre mot de passe contient des caractères spéciaux, vous devez les encoder avec urllib.parse.quote.

Les délais de connexion sont souvent dus à un port incorrect. Vérifiez que vous utilisez le port HTTP pour les adresses HTTP et le port SOCKS5 pour les adresses socks5h. Ajouter une valeur timeout empêche les requêtes sans réponse de bloquer tout le processus.

  • Erreur SOCKS : pip install "requests[socks]"
  • 407 : Vérifiez l'ID/mot de passe ou l'IP enregistrée
  • Délai dépassé : Distinction entre le port HTTP et le port SOCKS5
  • Ajouter un timeout à toutes les requêtes
Configuration du proxy dans Python requests, connexion SOCKS5 et HTTP | Socks5Proxy