Question

J'ai besoin d'automatiser un processus impliquant un site Web utilisant un formulaire de connexion.Je dois capturer certaines données dans les pages suivant la page de connexion.

Je sais comment screen-scraper les pages normales, mais pas celles situées derrière un site sécurisé.

  1. Cela peut-il être fait avec la classe .NET WebClient ?
    • Comment puis-je me connecter automatiquement ?
    • Comment puis-je rester connecté aux autres pages ?
Était-ce utile?

La solution

Une solution consisterait à automatiser un navigateur - vous avez mentionné WebClient, donc je suppose que vous faites peut-être référence à WebClient dans .NET.

Deux points principaux :

  • Il n'y a rien de spécial à propos de https lié à WebClient - ça marche
  • Les cookies sont généralement utilisés pour l'authentification : vous devrez les capturer et les rejouer.

Voici les étapes que je suivrais :

  1. OBTENEZ le formulaire de connexion, capturez le cookie dans la réponse.
  2. À l’aide de XPath et de HtmlAgilityPack, recherchez les noms et valeurs des champs « input type=hidden ».
  3. POST pour connecter l'action du formulaire avec le nom d'utilisateur, le mot de passe et les valeurs de champ masquées dans le corps de la demande.Incluez le cookie dans les en-têtes de requête.Encore une fois, capturez le cookie dans la réponse.
  4. OBTENEZ les pages souhaitées, encore une fois, avec le cookie dans les en-têtes de requête.

A l'étape 2, je mentionne une méthode quelque peu compliquée pour automatiser la connexion.Habituellement, vous pouvez publier avec votre nom d'utilisateur et votre mot de passe directement sur l'action du formulaire de connexion connue sans obtenir le formulaire initial ni relayer les champs cachés.Certains sites ont une validation de formulaire (différente de la validation de champ) sur leurs formulaires, ce qui empêche cette méthode de fonctionner.

HtmlAgilitéPack est une bibliothèque .NET qui vous permet de transformer du code HTML mal formé en XmlDocument afin que vous puissiez XPath dessus.Plutôt utile.

Enfin, vous pouvez vous retrouver dans une situation où le formulaire s'appuie sur un script client pour modifier les valeurs du formulaire avant de le soumettre.Vous devrez peut-être simuler ce comportement.

Utiliser un outil pour visualiser le trafic http pour ce type de travail est extrêmement utile - je recommande ieHttpEn-têtes, Violoneux, ou Pyromane (onglet filet).

Autres conseils

Vous pouvez facilement simuler la saisie de l'utilisateur.Vous pouvez soumettre un formulaire sur la page Web de votre programme en envoyant une demande post\get à un site Web.
Le formulaire de connexion typique ressemble à :

<form name="loginForm" method="post" Action="target_page.html">
   <input type="Text" name="Username">
   <input type="Password" name="Password">
</form>

Vous pouvez envoyer une demande de publication sur le site Web en fournissant des valeurs pour les champs Nom d'utilisateur et Mot de passe.Ce qui se passe après l'envoi de votre demande dépend en grande partie du site Web, vous serez généralement redirigé vers une page.Vos informations d’autorisation seront stockées dans les sessions\cookie.Ainsi, si vous supprimez le client, vous pouvez maintenir une session Web et comprendre les cookies, vous pourrez accéder aux pages protégées.

Votre question ne précise pas quel langage/framework vous allez utiliser.Par exemple, il existe un framework pour le scraping d'écran (y compris la fonctionnalité de connexion) écrit en perl - WWW::Mécaniser

Notez que vous pouvez rencontrer des problèmes si le site auquel vous essayez de vous connecter utilise des scripts Java ou une sorte de CAPTCHA.

Pouvez-vous clarifier s'il vous plait?La classe WebClient dont vous parlez est-elle celle de HTTPUnit/Java ?

Si tel est le cas, votre session devrait être enregistrée automatiquement.

Votre question ne montre pas clairement à quelle classe (ou langage) WebClient vous faites référence.

Si vous disposez d'un environnement d'exécution Java, vous pouvez utiliser la classe Apache HttpClient ;voici un exemple que j'ai écrit en utilisant Groovy qui accède à la délicieuse API via SSL :

   def client = new HttpClient()

   def credentials = new UsernamePasswordCredentials( "username", "password" )
   def authScope = new AuthScope("api.del.icio.us", 443, AuthScope.ANY_REALM)
   client.getState().setCredentials( authScope, credentials )

   def url = "https://api.del.icio.us/v1/posts/get"

   def method = new PostMethod( url )
   method.addParameter( "tag", tag )
   client.executeMethod( method )
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top