Puppeteer et PhantomJS sont similaires. Le problème que je rencontre se produit pour les deux, et le code est également similaire.
Je voudrais récupérer des informations sur un site Web, qui nécessite une authentification pour afficher ces informations. Je ne peux même pas accéder à la page d'accueil car elle est détectée comme une "activité suspecte", comme le SS: https://i.imgur.com/p69OIjO.png
J'ai découvert que le problème ne se produit pas lorsque j'ai testé sur Postman en utilisant un en-tête nommé Cookie et la valeur de son cookie capturé sur le navigateur, mais ce cookie expire après un certain temps. Je suppose donc que Puppeteer/PhantomJS n'attrapent pas tous les deux des cookies, car ce site refuse l'accès au navigateur sans tête.
Que puis-je faire pour contourner cela?
// Simple Javascript example
var page = require('webpage').create();
var url = 'https://www.expertflyer.com';
page.open(url, function (status) {
if( status === "success") {
page.render("home.png");
phantom.exit();
}
});
Choses qui peuvent aider en général:
Le site Web que vous essayez de visiter utilise Distil Networks pour éviter le grattage du Web.
Les gens ont eu succès dans le passé contournant Distil Networks en remplaçant le $cdc_
variable trouvée dans Chromium call_function.js (qui est utilisée dans Puppeteer).
Par exemple:
function getPageCache(opt_doc, opt_w3c) {
var doc = opt_doc || document;
var w3c = opt_w3c || false;
// var key = '$cdc_asdjflasutopfhvcZLmcfl_'; <-- This is the line that is changed.
var key = '$something_different_';
if (w3c) {
if (!(key in doc))
doc[key] = new CacheWithUUID();
return doc[key];
} else {
if (!(key in doc))
doc[key] = new Cache();
return doc[key];
}
}
Remarque: Selon ce commentaire , si vous avez été mis sur liste noire avant d'apporter ce changement, vous êtes confronté à un autre ensemble de défis, vous devez donc "implémenter les empreintes digitales de faux canevas, désactiver le flash, modifier l'adresse IP et modifier l'ordre des en-têtes de demande (permuter la langue et accepter les en-têtes)".
Si vous pensez du point de vue des sites Web, vous faites en effet un travail suspect. Donc, chaque fois que vous voulez contourner quelque chose comme ça, assurez-vous de penser comment ils pensent.
Puppeteer et PhantomJS etc. utiliseront de vrais navigateurs et les cookies utilisés sont meilleurs que lors de l'utilisation via Postman ou autre. Vous avez juste besoin d'utiliser correctement les cookies.
Vous pouvez utiliser page.setCookie(...cookies)
pour définir les cookies. Les cookies sont sérialisés, donc si les cookies sont un tableau d'objets, vous pouvez simplement le faire,
const cookies = [{name: 'test', value: 'foo'}, {name: 'test2', value: 'foo'}]; // just as example, use real cookies here;
await page.setCookie(...cookies);
Désactivez le mode sans tête et voyez le comportement du site Web.
await puppeteer.launch({headless: false})
Certains sites Web surveillent en fonction de l'adresse IP, si plusieurs hits proviennent de la même IP, ils bloquent la demande. Il est préférable d'utiliser des proxys rotatifs sur ce cas.