Réponse rapide
Comment utiliser Python Requests avec un proxy statique ?
Pour utiliser Python Requests avec un proxy statique, construisez l'URL du proxy à partir de l'hôte, du port, du nom d'utilisateur et du mot de passe de votre IP. Passez-la pour les clés http et https de proxies=, définissez un timeout et vérifiez l'IP de sortie sur api.ipify.org. SteadyProxy les IP statiques coûtent 2,24 $US pour 30 jours en octobre 2026, sans KYC et avec paiement en crypto.
Quels sont les points clés ?
| Installation | python -m pip install requests (SOCKS5 : requests[socks]) |
|---|---|
| URL du proxy HTTP | http://USERNAME:PASSWORD@host:port, for both the http and https keys |
| URL du proxy SOCKS5 | socks5h://USERNAME:PASSWORD@host:port (port SOCKS5 par défaut 7778) |
| Caractères spéciaux | Encodez le nom d'utilisateur et le mot de passe au format URL avec urllib.parse.quote |
| Proxies d'environnement | session.trust_env = False ignore HTTP_PROXY défini ailleurs |
| Timeouts | (10, 30) : 10 s pour se connecter, 30 s pour lire, dans nos exemples |
| Testé | Python 3.14 et Requests 2.34, 19 octobre 2026, via un proxy de test protégé par mot de passe |
Comment envoyer une requête via un seul proxy statique ?
Chaque IP statique dispose de son propre hôte, port, nom d'utilisateur et mot de passe dans votre dashboard. Placez-les dans des variables d'environnement, pas dans le code. Le script ci-dessous construit l'URL du proxy, envoie une requête à api.ipify.org et s'arrête si l'IP de sortie n'est pas celle attendue. Il lit ensuite le nom du réseau depuis ipinfo.io. Avec un mauvais mot de passe, Requests lève une ProxyError mentionnant 407 Proxy Authentication Required, comme l'a montré notre test.
"""Python Requests through one static proxy, with a check of the exit IP.
Install: python -m pip install requests
"""
import os
from urllib.parse import quote
import requests
HOST = os.environ.get("PROXY_HOST", "gw.steadyproxy.com")
PORT = os.environ.get("PROXY_PORT", "7777")
USER = quote(os.environ.get("PROXY_USER", "USERNAME"), safe="")
PASSWORD = quote(os.environ.get("PROXY_PASS", "PASSWORD"), safe="")
EXPECTED_IP = os.environ.get("EXPECTED_IP") # the static IP listed in your dashboard
# The proxy URL starts with http:// even for https:// sites (Requests opens a CONNECT tunnel)
PROXY = "http://" + USER + ":" + PASSWORD + "@" + HOST + ":" + PORT
PROXIES = {"http": PROXY, "https": PROXY}
with requests.Session() as session:
session.trust_env = False # ignore HTTP_PROXY / HTTPS_PROXY set elsewhere on the machine
response = session.get("https://api.ipify.org?format=json", proxies=PROXIES, timeout=(10, 30))
response.raise_for_status()
exit_ip = response.json()["ip"]
print("Exit IP:", exit_ip)
if EXPECTED_IP and exit_ip != EXPECTED_IP:
raise SystemExit("Exit IP differs from the static IP you expected")
page = session.get("https://ipinfo.io/json", proxies=PROXIES, timeout=(10, 30))
page.raise_for_status()
print("Network:", page.json().get("org"), "-", page.json().get("country"))
Pourquoi l'URL du proxy est-elle en http:// pour les sites https:// ?
La clé du dictionnaire proxies est le schéma du site cible ; la valeur est l'adresse du proxy. Pour un site https://, Requests demande au proxy HTTP d'ouvrir un tunnel CONNECT, puis fait passer TLS par ce tunnel jusqu'au site. Le proxy ne voit jamais la page déchiffrée. Les deux clés pointent donc vers la même URL de proxy http://. Gardez la vérification des certificats activée : ne mettez jamais verify=False pour faire disparaître une erreur de proxy.
Comment donner à chaque compte sa propre IP statique ?
Associez chaque compte ou tâche à une IP et créez une Session par association. Une Session conserve les cookies et réutilise les connexions, et avec trust_env = False son paramètre proxies n'est pas remplacé par les variables d'environnement. L'exemple ci-dessous lit une ligne par IP, dans l'ordre hôte, port, nom d'utilisateur, mot de passe, que vous pouvez copier depuis les quatre valeurs de votre dashboard.
"""One static IP per account or per job with Python Requests.
Each line holds the four values shown for one IP in your dashboard:
host:port:username:password
"""
import os
from urllib.parse import quote
import requests
STATIC_IPS = {
"store-uk": os.environ.get("PROXY_STORE_UK", "gw.steadyproxy.com:7777:USERNAME:PASSWORD"),
"store-de": os.environ.get("PROXY_STORE_DE", "gw.steadyproxy.com:7777:USERNAME:PASSWORD"),
}
def session_for(name):
host, port, user, password = STATIC_IPS[name].split(":", 3)
proxy = "http://" + quote(user, safe="") + ":" + quote(password, safe="") + "@" + host + ":" + port
session = requests.Session()
session.trust_env = False
session.proxies = {"http": proxy, "https": proxy}
return session
for account in STATIC_IPS:
with session_for(account) as s:
ip = s.get("https://api.ipify.org", timeout=(10, 30)).text
print(account, "->", ip)
Comment utiliser SOCKS5 au lieu de HTTP ?
Installez requests[socks] et remplacez http:// par socks5h:// et le port HTTP par le port SOCKS5. Le h fait résoudre les noms d'hôtes par le proxy, ainsi les réponses DNS correspondent au pays de l'IP. Le reste du code reste identique. Un exemple complet et testé se trouve dans le guide du proxy statique SOCKS5. Les deux ports d'une même IP statique mènent à la même IP de sortie.
Que signifient les erreurs courantes ?
Chaque erreur pointe vers une couche.
- ProxyError avec 407 : nom d'utilisateur ou mot de passe incorrect, ou cette machine n'est pas dans votre allowlist.
- ConnectTimeout : hôte ou port incorrect, ou un pare-feu de votre côté bloque le trafic sortant vers le port du proxy.
- ReadTimeout : la cible ou le chemin est lent ; réessayez plus tard et conservez le timeout de lecture.
- SSLError : un problème de certificat sur la cible ou sur votre machine ; ne désactivez pas la vérification.
- 403 ou 429 renvoyé par la cible : le site a refusé ou limité la requête ; ralentissez.
Si une IP échoue à toutes les requêtes pendant une heure, contactez le support. Notre règle de remplacement : Si une IP ne fonctionne pas, écrivez au support : nous la réparons ou la remplaçons par une autre IP dans le même pays selon le stock disponible.
Quelles autres questions se posent sur Python et les proxies statiques ?
Pourquoi définir à la fois les clés http et https ?
Requests choisit le proxy selon le schéma de l'URL cible. Sans la clé https, les requêtes vers les sites https:// sortiraient directement, depuis votre propre IP. Définir les deux clés avec la même URL de proxy fait passer chaque requête par l'IP statique. La vérification sur api.ipify.org dans le script détecte immédiatement une clé manquante.
Pourquoi encoder le nom d'utilisateur et le mot de passe au format URL ?
Des caractères comme @, : et / ont une signification dans une URL. Un mot de passe contenant un @ serait sinon lu comme la fin de la partie identifiant. urllib.parse.quote avec safe='' les encode, et Requests les décode avant d'envoyer l'identifiant au proxy. Cela fonctionne pour les URL HTTP et socks5h://.
Pourquoi définir trust_env à False ?
Requests lit HTTP_PROXY, HTTPS_PROXY et NO_PROXY dans l'environnement par défaut, et la documentation avertit que les proxies d'environnement peuvent remplacer le paramètre proxies d'une Session. Un réglage VPN ou d'entreprise pourrait alors router certaines requêtes ailleurs. trust_env = False fait en sorte que le code n'utilise que le proxy que vous passez.
Puis-je utiliser le même code avec httpx ou aiohttp ?
Oui, le principe est le même : une URL de proxy construite à partir de l'hôte, du port, du nom d'utilisateur et du mot de passe, plus un timeout et une vérification de l'IP de sortie. Les noms de paramètres diffèrent selon la bibliothèque et la version, suivez donc la documentation proxy de cette bibliothèque. Gardez un client par IP statique, comme avec les Sessions dans Requests.
Comment garder les identifiants hors de mon dépôt ?
Lisez-les depuis des variables d'environnement ou un gestionnaire de secrets, comme dans les exemples, et ne committez jamais un fichier .env avec de vraies valeurs. N'affichez pas l'URL du proxy dans les logs, car elle contient le mot de passe. Avec la méthode de l'allowlist d'IP, les scripts sur des machines autorisées n'ont pas besoin de mot de passe proxy du tout.
Combien de requêtes une IP statique peut-elle gérer en Python ?
Le proxy facture par IP et par 30 jours, pas au GB. Facturé à l'IP et pour 30 jours, pas au GB ; usage raisonnable applicable. La vraie limite est le site cible, qui peut limiter une IP. Gardez une concurrence modérée par IP, ajoutez des délais et respectez les conditions de chaque site. Pour plus de volume sur une tâche, répartissez le travail sur plusieurs IP ; voir combien d'IP statiques me faut-il ?.
Quelles sources ce guide utilise-t-il ? (3)
- Utilisation avancée de Requests : proxies, SOCKS, timeouts — Requests (2026-10-19)
- urllib.parse: quote — Python Software Foundation (2026-10-19)
- API ipify — ipify (2026-10-19)