web-dev-qa-db-fra.com

Comment éviter d'être détecté comme bot sur Puppeteer et Phantomjs?

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();
    }
});
6

Choses qui peuvent aider en général:

  • Les en-têtes doivent être similaires aux navigateurs courants, notamment:
  • Si vous faites plusieurs demandes, mettez un timeout aléatoire entre eux
  • Si vous ouvrez des liens trouvés dans une page, définissez l'en-tête Referer en conséquence
  • Les images doivent être activées
  • Javascript doit être activé
    • Vérifiez que " navigator.plugins " et " navigator.language " sont défini dans le contexte de page javascript du client
  • Utiliser des procurations
2
Grubshka

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)".

2
Grant Miller

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.

Définir correctement le cookie

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);

Essayez de modifier les comportements

Désactivez le mode sans tête et voyez le comportement du site Web.

await puppeteer.launch({headless: false})

Essayez les procurations

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.

1
Md. Abu Taher