
Utilisation des requêtes asynchrones HTTPX pour jouer avec les IP proxy
Récemment, dans le groupe des crawlers, beaucoup de petits partenaires se sont plaints que l'utilisation de requêtes pour collecter des données était toujours bloquée par l'IP. Aujourd'hui, nous changeons une nouvelle arme - la bibliothèque HTTPX, cette fonction de requête asynchrone est très bonne, avec l'IP proxy, c'est tout simplement comme un tigre avec des ailes. Nous utiliserons notre propre service proxy ipipgo pour démontrer, main dans la main, comment éviter le mécanisme anti-escalade.
Opération de base HTTPX Triple Strike
Commençons par installer une bibliothèque :pip install httpx. L'utilisation de base est similaire à celle des requêtes, mais avec un support plus asynchrone. Regardez ce code :
import httpx
Requête GET normale
avec httpx.Client() comme client :
response = client.get('https://example.com')
print(response.status_code)
Ajout de proxies à la pose (focus ici !)
proxies = "http://用户名:密码@gateway.ipipgo.com:9021"
response = httpx.get("https://ip.ipipgo.com", proxies=proxies)
print(f "IP actuelle : {response.json()['ip']}")
Notez que l'adresse du proxy dans lepasserelle.ipipgo.comIl s'agit de l'entrée de notre service, le port est différent pour les différents paquets. L'avantage d'utiliser votre propre service est que le pool d'IP est suffisamment grand pour changer automatiquement sans avoir à s'en soucier.
La bonne façon d'ouvrir une requête asynchrone
Les requêtes synchrones peuvent vous tuer rapidement lorsque vous devez capturer en masse. Optez pour l'asynchronisme ! Regardez cette opération de dieu :
import asyncio
import httpx
async def fetch(url).
async avec httpx.AsyncClient(
proxies="http://user:pass@gateway.ipipgo.com:9021"
) as client : resp = await client.get(url)
resp = await client.get(url)
return resp.text
100 requêtes en même temps sans décalage
urls = ["https://example.com/page/{}".format(i) for i in range(100)]
results = asyncio.run(asyncio.gather([fetch(url) for url in urls]))
Les ipipgo sont utilisés iciPaquets d'agences à long termequi est particulièrement adapté à ce scénario de demande à haute fréquence. N'oubliez pas d'utiliser un client asynchrone, car le client normal se traîne les pieds.
Guide pratique sur la propriété par procuration pour éviter les pièges
Quelques pièges souvent rencontrés dans le développement réel :
| phénomène problématique | prescription |
|---|---|
| Délai de connexion | Commutation des différents nœuds de la salle des serveurs d'ipipgo |
| Retourner l'erreur 407 | Vérifier si le mot de passe du compte contient des caractères spéciaux |
| temps de réponse lent | Activation du multiplexage de liens pour HTTPX |
Il est recommandé d'ajouter un mécanisme de réessai dans le code à l'aide de la fonction ipipgoCommutation automatique de l'IPLa fonctionnalité est beaucoup plus simple. Leur API prend en charge le changement automatique d'IP en fonction du nombre d'échecs, ce qui est particulièrement utile pour les collectes à grande échelle.
QA Time : Résumé des questions à haute fréquence
Q : Que dois-je faire si l'agent ne fonctionne pas lorsque je l'utilise ?
R : Il est recommandé d'utiliser l'offre d'IP résidentielle dynamique d'ipipgo, qui change automatiquement d'IP pour chaque demande et ne donne tout simplement pas à l'autre partie la possibilité de se bloquer.
Q : Les requêtes asynchrones restent soudainement bloquées et n'avancent pas ?
A:Check if the timeout parameter is not set, HTTPX default infinite wait. Ajoutez le paramètre timeout=30, il sera stable.
Q : Que se passe-t-il si j'ai besoin d'un proxy très anonyme ?
R : Choisir directement l'ipipgo'sServices d'agence au niveau de l'entrepriseL'en-tête de la requête n'expose pas du tout les caractéristiques du proxy et a été testé par l'inspection stricte d'un certain Orient.
Programme de configuration ultime
Enfin, voici mon modèle de configuration préféré :
client = httpx.AsyncClient(
proxies={
"http://" : "http://user:pass@gateway.ipipgo.com:9021",
"https://" : "http://user:pass@gateway.ipipgo.com:9021"
},
timeout=30.0,
limits=httpx.Limits(max_connections=100),
headers={"User-Agent" : "Mozilla/5.0 (Windows NT 10.0 ; Win64 ; x64)"}
)
Avec cette configuration, il n'y a pas de pression pour faire des millions de requêtes avec les proxies d'ipipgo. Leur pool d'IP est mis à jour assez fréquemment pour que vous ne rencontriez pas de bombardement CAPTCHA. Enfin, pour rappel, la collecte de données se fait pour respecter les règles du site, l'utilisation du proxy n'est pas dans un but de sabotage ha.

