
Que faire lorsqu'un crawler se heurte à un anti-crawler ? Essayez ceci.
Quel est le plus grand mal de tête pour tous ceux qui écrivent des crawlers ? Neuf sur dix diront que l'IP est bloquée, n'est-ce pas ? Cette fois, vous avez besoin d'un proxy IP pour vous aider. Ne parlons pas de faux aujourd'hui, main dans la main pour vous apprendre à utiliser Golang avec un proxy IP, en se concentrant sur la façon d'utiliser le bon !ipipgoLe service pour rester en vie.
Principes fondamentaux des agents de configuration
Le http.Client de Golang cache en fait un capitaine de transport - l'objet Transport. Pour s'affranchir des proxys, il faut faire quelque chose avec ce capitaine de transport. Rappelez-vous la formule de base :
transport := &http.Transport{
Proxy : http.ProxyURL(Proxy address),
}
client := &http.Client{Transport : transport}
L'astuce réside dans le fait que l'attribut Proxy reçoit une fonction qui, avant chaque requête, demande : "Quel est le chemin cette fois-ci ?" ProxyURL est une fonction prête à l'emploi qui s'occupe des proxys fixes. ProxyURL. Si vous utilisez un pool de proxy dynamiques, vous devrez écrire votre propre logique d'interrogation.
Code réel avec commentaires
Par exemple, supposons que nous commencions paripipgoJ'ai un proxy HTTP : 112.95.161.201:8008 avec un compte dont le mot de passe est exclusif aux utilisateurs vip. Le code doit être écrit comme ceci :
func main() {
// Assembler l'adresse du proxy
proxyUrl, _ := url.Parse("http://user:pass@112.95.161.201:8008")
// Créer des transports personnalisés
transport := &http.Transport{
Proxy : http.ProxyURL(proxyUrl),
TLSClientConfig : &tls.Config{InsecureSkipVerify : true}, // sauter la vérification du certificat
}
// Assembler le client final
client := &http.Client{
Transport : transport, }
Timeout : 15 time.
}
// Initiation d'une requête en direct
resp, err := client.Get("https://目标网站.com")
if err ! = nil {
log.Fatal("Request failed :", err)
}
defer resp.Body.Close()
// Traite les données de la réponse...
}
Il faut s'en méfier.TLSClientConfigCertains sites peuvent avoir des problèmes avec leurs certificats SSL, c'est pourquoi l'ajout de l'authentification permet d'éviter les échecs de la poignée de main. Cependant, il n'est pas recommandé de sauter l'authentification sur les sites web ordinaires, et ceci n'est qu'une démonstration de son utilisation.
Fonctionnement des pools de serveurs mandataires dynamiques
Les agents isolés sont facilement reconnaissables et doivent être remplacés par un groupe d'agents. L'appariementipipgoLes API qui peuvent être manipulées de la sorte :
var proxyPool = []string{
"http://user:pass@112.95.161.201:8008",
"http://user:pass@112.95.162.105:8012".
//... Autres proxies
}
func getRandomProxy() func(http.Request) (url.URL, error) {
rand.Seed(time.Now().UnixNano())
return func(_ http.Request) (url.URL, error) {
return url.Parse(proxyPool[rand.Intn(len(proxyPool))])
}
}
// Remplacer le paramètre Proxy lorsqu'il est utilisé
transport.Proxy = getRandomProxy()
Cela permet de sélectionner aléatoirement un proxy pour chaque demande, réduisant ainsi la probabilité d'être bloqué.ipipgoComme le pool d'agents de l'entreprise est fréquemment mis à jour, il est recommandé d'extraire la dernière liste d'agents de l'API toutes les 5 minutes.
Pièges courants AQ
Q : Que dois-je faire si l'agent ne fonctionne soudainement plus ?
R : Vérifiez d'abord la disponibilité du proxy, il est recommandé d'utiliser la fonctionipipgoL'interface de vérification de l'état de santé de l'agent est fournie avec une fonction de basculement. Leur agent est livré avec un basculement, ce qui est moins compliqué que de construire son propre agent.
Q : Pourquoi les demandes ralentissent-elles ?
R : Il se peut que vous soyez confronté à un proxy à forte latence. Suggestions : ① choisir un noeud proche de l'emplacement géographique ② fixer un délai raisonnable ③ utiliser le service de routage intelligent d'ipipgo
Q : Un site web HTTPS ne peut pas capturer de données ?
R : Vérifiez les paramètres du certificat et ajoutez un certificat racine si nécessaire. Si vous utilisez un certificat auto-signé, n'oubliez pas de configurer les paramètres TLS corrects dans le Transport.
Pourquoi ipipgo ?
| domination | instructions |
|---|---|
| Taux de survie élevé | Le système élimine automatiquement les agents non valides toutes les minutes |
| Suffisamment rapide. | Nœuds de salles de serveurs de l'épine dorsale nationale, latence moyenne <80ms |
| Flexibilité de l'authentification | Prise en charge du double mode liste blanche/autorisation IP |
Testé avec son service, le taux de survie des chenilles est passé de 37% à 89%, en particulier pour le fonctionnement à long terme du projet, il n'est plus nécessaire de se lever au milieu de la nuit pour changer l'agent.
Conseils avancés : commutation automatique
Placer un fusible sur la chenille et changer automatiquement le proxy lorsqu'il rencontre une défaillance continue :
type RetryClient struct {
client http.
Retries int
Nombre de tentatives du client int }
func (rc RetryClient) Get(url string) (http.Response, error) {
Get(url string) (http.Response, error) { for i := 0 ; i < rc.retries ; i++ {
resp, err := rc.client.Get(url)
if err == nil && resp.StatusCode == 200 {
return resp, nil
}
// Déclenchement d'un changement de proxy
rc.client.Transport.(http.Transport).Proxy = getRandomProxy()
}
return nil, fmt.Errorf("Nombre maximal de tentatives dépassé")
}
Ce mécanisme d'auto-guérison fonctionne en conjonction avecipipgoL'énorme réserve d'adresses IP de l'entreprise lui permet de fonctionner sans surveillance 24 heures sur 24, en principe.
Enfin, un mot de prudence, le choix des services de l'agent doivent regarder la stabilité à long terme. Auparavant, l'utilisation de quelques services bon marché, le début de l'ok, derrière une variété de papillons de nuit. Passer à l'agentipipgoAprès avoir épargné bien des maux de cœur, il existe une équipe professionnelle d'exploitation et de maintenance qui n'est pas la même, particulièrement adaptée au besoin de stabilité des projets commerciaux.

