Comment utiliser les proxies résidentiels ProxyScrape pour le suivi des positions SEO
Créez un petit outil de suivi de positions en Python qui récupère les SERP via le pool résidentiel rotatif de ProxyScrape, avec réessais, limitation de débit, notes de ciblage géographique et journalisation de l'IP de sortie pour chaque requête.
Aperçu
Les moteurs de recherche renvoient des résultats différents selon l'IP qui interroge. Le suivi des positions SEO a donc besoin de requêtes qui ressemblent à celles d'utilisateurs ordinaires depuis la bonne localisation, ce que fournit un pool résidentiel rotatif. Le pool résidentiel de ProxyScrape (plus de 97 millions d'IP) attribue une nouvelle IP de sortie par requête ou maintient une session persistante, et ses proxies datacenter sont une option moins chère pour les points de terminaison à fort volume qui ne bloquent pas les plages d'hébergement.
Ce tutoriel construit un outil minimal de suivi de positions en Python qui lit les SERP via ProxyScrape. Ne scrapez que les pages auxquelles vous êtes autorisé à accéder, et respectez les conditions d'utilisation et les directives robots du site cible.
Étapes
-
Récupérez les identifiants et les ports. Dans le tableau de bord ProxyScrape, notez l'hôte de la passerelle résidentielle, ses ports HTTP et SOCKS5, ainsi que votre nom d'utilisateur/mot de passe. Les points de terminaison rotatifs attribuent généralement une nouvelle IP par requête ; si une option de session persistante existe dans votre offre, le tableau de bord en indique la syntaxe.
-
Installez les dépendances.
python -m venv .venv && source .venv/bin/activate
pip install requests beautifulsoup4
# add PySocks only if you intend to use the SOCKS5 port:
pip install "requests[socks]"
- Stockez les identifiants dans des variables d'environnement pour qu'ils n'arrivent jamais dans votre contrôle de code source :
export PS_HOST="your-host"
export PS_PORT="your-http-port"
export PS_USER="your-username"
export PS_PASS="your-password"
- Construisez un dictionnaire de proxy. Pour le port HTTP :
import os
proxy_url = f"http://{os.environ['PS_USER']}:{os.environ['PS_PASS']}@{os.environ['PS_HOST']}:{os.environ['PS_PORT']}"
proxies = {"http": proxy_url, "https": proxy_url}
Pour le port SOCKS5, utilisez le schéma socks5h:// afin que le DNS soit résolu au niveau du proxy :
proxy_url = f"socks5h://{os.environ['PS_USER']}:{os.environ['PS_PASS']}@{os.environ['PS_HOST']}:{os.environ['PS_SOCKS_PORT']}"
-
Ajoutez le ciblage géographique si votre offre le prend en charge. Certaines offres résidentielles vous permettent de fixer un pays ou une ville en ajoutant un code au nom d'utilisateur. La syntaxe exacte diffère selon l'offre, donc utilisez le format indiqué dans votre tableau de bord ProxyScrape plutôt que de deviner.
-
Récupérez une SERP avec des réessais. Faites tourner l'IP, attendez entre les requêtes et appliquez un backoff en cas d'échec :
import random, time, requests
HEADERS = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0 Safari/537.36",
"Accept-Language": "en-US,en;q=0.9",
}
def fetch_serp(keyword, num=20, attempts=3):
for attempt in range(attempts):
try:
r = requests.get(
"https://www.google.com/search",
params={"q": keyword, "num": num, "hl": "en"},
headers=HEADERS, proxies=proxies, timeout=20,
)
if r.status_code == 200:
return r.text
except requests.RequestException:
pass
time.sleep(2 ** attempt + random.random())
return None
-
Limitez le débit et alternez délibérément. Gardez une concurrence faible (2 à 5 workers), ajoutez un délai aléatoire de 2 à 10 secondes entre les requêtes, et utilisez une nouvelle requête pour chaque mot-clé afin que chaque SERP provienne d'une IP différente. Les réponses HTTP 429 ou 503 signifient que vous allez trop vite — ralentissez au lieu de réessayer immédiatement.
-
Analysez et stockez le résultat.
from bs4 import BeautifulSoup
html = fetch_serp("proxy comparison")
soup = BeautifulSoup(html, "html.parser")
for i, a in enumerate(soup.select("a[href^=http]"), start=1):
print(i, a.get_text(" ", strip=True)[:80], a["href"])
Le balisage des résultats change avec le temps, donc vérifiez vos sélecteurs par rapport au DOM en direct avant de vous y fier. Écrivez les lignes de chaque exécution (mot-clé, position, URL, horodatage, IP de sortie) dans un fichier CSV ou une base de données.
- Journalisez l'IP de sortie pour chaque requête afin de pouvoir distinguer un véritable changement de classement d'un changement de localisation :
curl -x "http://USER:PASS@HOST:PORT" https://ipinfo.io/json