
Guide pratique pour vider la mémoire des navigateurs sans tête
Les amis engagés dans la collecte de données ont dû rencontrer cette situation : en utilisant Puppeteer ou Playwright pour explorer la page rendue en JS, la mémoire en cours d'exécution et en cours d'exécution va exploser. En particulier, la collecte de tâches qui doivent s'exécuter pendant une longue période, se déplaçant pour vous donner un avertissement de fuite de mémoire. Aujourd'hui, nous allons parler de la façon d'utiliser le proxy IP avec quelques opérations obscures pour minimiser l'empreinte mémoire du navigateur headless.
Les trois principaux responsables des sursauts de mémoire
Commençons par quelques tueurs de mémoire typiques :Le cache des pages consomme de la mémoireC'est comme la gourmandise, plus vous ouvrez d'onglets, plus elle vous tue ;Les éléments du DOM ne sont pas nettoyésC'est comme une pièce qui n'est pas nettoyée, plus les déchets s'accumulent ;L'interception des demandes ne fonctionne pas.C'est comme un robinet qui fuit et dont les ressources sont chargées en cachette. Avec ces trois types ensemble, une machine avec 8G de RAM peut fonctionner pendant deux heures.
| Type de problème | symptôme typique | indice de danger |
|---|---|---|
| cache de page | La mémoire n'est pas libérée après le changement d'onglet | ★★★★ |
| Résidu DOM | La capture répétée du même type de mémoire de page fait grimper en flèche le nombre de pages. | ★★★★★ |
| Chargement des ressources | Téléchargement d'images/vidéos en avant-première | ★★★★★ |
Autres utilisations des IP Proxy
L'accent est mis ici sur l'action de l'ipipgo.Rotation dynamique de l'IPFonction. Beaucoup de gens ne savent qu'utiliser l'IP proxy pour éviter le blocage, mais en fait, cela peut aussi nous aider à économiser de la mémoire. Par exemple, toutes les 50 pages collectées sur l'IP pour redémarrer l'instance du navigateur, afin d'éviter la reconnaissance des fonctionnalités, mais aussi pour forcer la libération de la mémoire. Testé avec cette méthode, 16 heures de collecte continue de fluctuations de mémoire peuvent être stables dans une fourchette de ± 200MB.
Exemple de configuration spécifique (environnement Node.js) :
const {ipipgo} = require('ipipgo-sdk');
let currentProxy = ipipgo.getRotatingProxy();
async function restartBrowser(){
await browser.close();
browser = await puppeteer.launch({
args: [currentProxy.newIp()]
});
// 每50次请求换IP重启
if(requestCount %50 ===0) restartBrowser();
}
Quatre axes d'optimisation de la mémoire
1. Les demandes doivent être interceptées sans ménagementLes pages de l'Internet ne sont pas des pages de l'Internet : utilisez page.setRequestInterception pour supprimer directement les images, les polices de caractères et autres ressources inutiles. N'oubliez pas de libérer le CSS et le JS, sinon la structure de la page risque de ne pas se charger complètement.
2. Nettoyage programméAprès le traitement de chaque page, page.removeAllListeners() est exécuté, et l'objet DOM devrait être mis à zéro.
3. Onglet Ne pas être gourmandIl est recommandé d'avoir jusqu'à 5 onglets ouverts sur une seule instance, et plus que cela pour ouvrir une nouvelle instance de navigateur. Le démarrage est plus lent, mais la mémoire est plus stable.
4. Le suivi de la mémoire est inégalablePour cela, il faut utiliser process.memoryUsage() pour effectuer une vérification temporelle et redémarrer automatiquement en cas de dépassement du seuil. Ceci est en conjonction avec la rotation du pool d'IP d'ipipgo, l'effet est remarquable.
Session pratique d'assurance qualité
Q:Que dois-je faire si la vitesse de collecte ralentit après l'utilisation d'une IP proxy ?
A : Choisir celui d'ipipgoAccès exclusif au haut débitnodes, n'utilisez pas les pools de proxy publics. La réponse de leur interface HTTP peut être contrôlée en moins de 200 ms, ce qui est plus rapide que certains proxys auto-construits.
Q : Comment puis-je résoudre le problème de la vérification humaine ?
R : Dans l'en-tête de la requête proxy, ajoutez les paramètres X-Forwarded-For, avec l'IP résidentielle d'ipipgo. N'oubliez pas que chaque User-Agent de la requête doit être généré de manière aléatoire, la trajectoire du mouvement de la souris avec la simulation de la courbe de Bézier est plus réaliste.
Q : Que se passe-t-il si je dois collecter un grand nombre de pages AJAX ?
R : Désactivez directement le saut de page et utilisez page.evaluateHandle pour obtenir un instantané du DOM. Exécutez page.deletePage() immédiatement après la fin de l'acquisition, afin d'éviter la fragmentation de la mémoire.
Le nec plus ultra en matière de sauvegarde de la mémoire
En fin de compte, l'optimisation de la mémoire estRanger dur + peut distribuer. N'hésitez pas à redémarrer, et ne prenez pas mal le fait que vous puissiez changer d'identité avec une IP proxy. Les fournisseurs de services comme ipipgo, qui peuvent fournir des millions de pools d'adresses IP, sont particulièrement adaptés aux scénarios qui nécessitent une collecte stable à long terme. Leur API prend en charge la facturation à la minute, et ils ne craignent pas d'être bloqués par des limitations d'IP lorsqu'ils augmentent temporairement leur volume.
Enfin, j'aimerais partager une configuration privée : exécuter le script de collecte dans docker avec une limite de mémoire de 1G, et avec le schéma d'optimisation ci-dessus, la courbe d'utilisation de la mémoire sur 24 heures est plus stable que celle d'un ECG. En cas de problème en cours d'exécution, l'API d'ipipgo peut automatiquement basculer entre les IP disponibles, ce qui est un excellent moyen de s'épargner des soucis.

