Supposons que nous ayons besoin d'obtenir des données d'un site Web dont la collecte manuelle est peu pratique, voire impossible, en raison de son volume. Dans ce cas, nous pouvons automatiser le processus à l'aide des outils décrits ci-dessous.
bibliothèque de requêtesBibliothèque Python pour envoyer des requêtes au serveur et traiter les réponses. La base du script d'analyse et notre arme principale. En utilisant cette bibliothèque, nous obtenons le contenu de la page dans formulaire HTML pour une analyse plus approfondie.
importer les demandes réponse = demandes . get ("https://ya.ru" ) # get-request print (response . text ) # sortie du contenu de la page payload = ( "key1" : "value1" , "key2" : "value2" ) réponse = requêtes . get ("http://httpbin.org/get" , params = payload ) # requête avec paramètres headers = ( "user-agent" : "my-app/0.0.1" ) réponse = requêtes . get (url, headers = headers) # requête avec des en-têtes HTML spécifiques
APIInterface de programmation d'applications - interface logicielle application fournie par le propriétaire de l'application Web à d'autres développeurs. L'absence d'une API capable de satisfaire nos besoins est la première chose dont nous devons nous assurer avant de nous précipiter pour analyser le code source de la page et écrire un analyseur pour celle-ci. De nombreux sites populaires disposent de leur propre API et d’une documentation expliquant comment l’utiliser. Nous pouvons utiliser l'API de cette manière - nous formons une requête http selon la documentation et recevons une réponse à l'aide de requêtes.
BS4Beautifulsoup4 est une bibliothèque pour analyser le HTML et documents XML. Vous permet d'accéder directement au contenu de n'importe quelle balise en html.
from bs4 import BeautifulSoup soup = BeautifulSoup (raw_html, "html.parser" ) print (soup . find ( "p" , class_ = "some-class" ) . text ) # afficher le contenu de la balise "p" avec la classe "une certaine classe"
Pilote Web SéléniumLes données du site peuvent être générées dynamiquement à l'aide de javascript. Dans ce cas, il ne sera pas possible d'analyser ces données à l'aide de requêtes+bs4. Le fait est que bs4 analyse le code source de la page sans exécuter js. Pour exécuter du code js et obtenir une page identique à celle que nous voyons dans le navigateur, vous pouvez utiliser le pilote Web Selenium - il s'agit d'un ensemble de pilotes pour différents navigateurs, fourni avec des bibliothèques pour travailler avec ces pilotes.
Que faire s'il y a une autorisation ?session = request.Session() data = ("login_username": "login", "login_password": "mot de passe") url = "http://site.com/login.php" réponse = session.post (url, data =données)
Que se passe-t-il si un site vous bannit pour un trop grand nombre de requêtes ?- Définir le délai entre les demandes :
réponse = request.get(url, timeout=(10, 0.01)) # délai d'expiration de connexion, délai de lecture (en secondes)
- Faites semblant d'être un navigateur utilisant le pilote Web Selenium ou en transmettant le contenu de l'en-tête de l'agent utilisateur lors d'une requête :
user_agent = ("Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:50.0) " "Gecko/20100101 Firefox/50.0") request = requêtes.get(url, headers=("User-Agent":user_agent))
- Utiliser un proxy :
L'objet décrit est très utile et outil puissant. Cet objet dispose de plusieurs méthodes, leur description est donnée ci-dessous :
Collections : Méthodes : Propriétés: Collection Response.CookiesLa collection Cookies définit les valeurs des cookies. Si les cookies spécifiés n'existent pas, il les crée. Si le cookie existe, il prend une nouvelle valeur et détruit l'ancienne.
Réponse.Cookies(cookie) [(clé) | . attributs ] = valeur
Paramètres :
- cookie - Nom du cookie
- key - Paramètre facultatif. S'il est spécifié, alors le cookie est un répertoire (imbriqué) et la clé est un ensemble de valeurs.
- attributs - Informations spécifiées sur les cookies eux-mêmes. Ce paramètre peut être l'un des suivants :
- value - Spécifie la valeur à attribuer à cette clé ou attribut.
Nom | Description |
Domaine | Enregistrement uniquement. Si spécifié, les cookies ne sont envoyés que sur demande de ce domaine. |
Expire | Enregistrement uniquement. La date à laquelle le cookie expire. Cette date doit être fixée pour que les cookies soient écrits auprès du client disque dur après la fin de la séance. Si cet attribut n'est pas défini, la date d'expiration du cookie est supposée date actuelle. Les cookies expireront immédiatement après la fin de la session. |
HasKey | Lecture seule. Indique si le cookie contient la clé donnée. |
Chemin | Enregistrement uniquement. Si cela est spécifié, les cookies ne sont envoyés que sur demande de ce chemin. Si le paramètre n'est pas défini, le chemin d'accès à l'application est utilisé. |
Sécurisé | Enregistrement uniquement. Indique si les cookies seront protégés ou non. |
Commentaire:
Si le cookie de clé est créé comme indiqué dans le script suivant,
alors l'en-tête suivant sera envoyé :
Set-Cookie:MYCOOKIE=TYPE1=sucre&TYPE2=cookies
Si vous attribuez une valeur à mycookie sans utiliser de clés, alors cette action détruira les clés type1 et type2. Par exemple:
Dans l'exemple précédent, les clés type1 et type2 seront détruites et leurs valeurs seront perdues. Mycookie contiendra désormais la valeur guimauve au chocolat.
Vous pouvez également vérifier l'existence d'une clé spécifique de la manière suivante :
Si TRUE est affiché, alors une telle clé existe ; si FALSE, elle n'existe pas.
Méthode Response.WriteRéponse.Écrire variable_or_value
Paramètres :
- variable_or_value - Données à afficher sur l'écran du navigateur via HTML. Ce paramètre peut être de n'importe quel type pris en charge par VisualBasic Scripting Edition. Autrement dit, les données peuvent être des types suivants : date, chaîne, caractère, valeurs numériques. Signification ce paramètre ne peut pas contenir de combinaisons %>. Au lieu de cela, vous pouvez utiliser la combinaison équivalente %\>. Le serveur Web convertira cette séquence en celle requise lors de l'exécution du script.
L'exemple suivant montre comment la méthode Response.write fonctionne pour envoyer un message au client.
Je vais juste te dire : Et ton nom
L'exemple suivant ajoute une balise HTML à une page Web. Puisque cette méthode ne peut pas contenir la combinaison %>, nous utilisons la séquence %\>. Donc un exemple de script :
Le résultat sera la ligne :
160 | Valeur décimale Objet Description | |
60 | < | Espace insécable |
62 | > | Moins que |
38 | & | Plus que |
162 | ¢ | Esperluette |
163 | £ | Cent |
165 | ¥ | Kg |
8364 | € | Iéna |
167 | § | Euro |
169 | Paragraphe | |
174 | ® | Droit d'auteur |
8482 | ™ | Marque déposée |
Conclusion L'injection de scripts intersites est l'une des méthodes les plus courantes pour attaquer l'ordinateur d'un utilisateur. Cependant, vous pouvez réduire considérablement la capacité d'un attaquant à infecter votre application Web. code malveillant
. Lors de la création de votre application, veillez à chiffrer toutes les valeurs de sortie des pages avant de les envoyer au navigateur de l'utilisateur final.
Générer une réponse des contrôleurs
Par exemple, pour envoyer une réponse HTML, vous devrez créer et composer les données HTML, puis les envoyer au client à l'aide de la méthode Response.Write(). De même, pour rediriger le navigateur de l'utilisateur vers une autre URL, vous devrez appeler la méthode Response.Redirect() et lui transmettre l'URL requise. Les deux approches sont illustrées dans le code ci-dessous, qui montre les extensions de la classe BasicController que nous avons créées dans un article précédent en implémentant l'interface IController :
Utilisation de System.Web.Mvc ; en utilisant System.Web.Routing ; espace de noms ControllersAndActions.Controllers ( classe publique BasicController : IController ( public void Execute(RequestContext requestContext) ( string contrôleur = (string)requestContext.RouteData.Values["controller"]; string action = (string)requestContext.RouteData.Values["action "]; if (action.ToLower() == "redirect") ( requestContext.HttpContext.Response.Redirect("/Derived/Index"); ) else ( requestContext.HttpContext.Response.Write(string.Format("Controller : (0), Méthode d'action : (1)", contrôleur, action)); ) ) ) )
La même approche peut être appliquée dans le cas de l’héritage d’un contrôleur de la classe Controller. La classe HttpResponseBase, qui est renvoyée lorsque la propriété requestContext.HttpContext.Response est lue dans la méthode Execute(), est accessible via la propriété Controller.Response, comme le montre l'exemple ci-dessous, qui étend la classe DerivedController, également créée précédemment par héritant de la classe Controller :
Utilisation du système ; en utilisant System.Web ; en utilisant System.Web.Mvc ; espace de noms ControllersAndActions.Controllers ( public class DerivedController: Controller ( public ActionResult Index() ( // ... ) public void ProduceOutput() ( if (Server.MachineName == "ProfessorWeb") Response.Redirect("/Basic/Index" ); else Response.Write("Contrôleur : dérivé, méthode d'action : ProduceOutput");
La méthode ProduceOutput() utilise la valeur de la propriété Server.MachineName pour décider quelle réponse envoyer au client. ("ProfessorWeb" est le nom de ma machine de développement.)
Bien que cette approche consistant à générer une réponse à l’utilisateur fonctionne, elle pose plusieurs problèmes :
Les classes de contrôleur doivent contenir des informations sur la structure HTML ou URL, ce qui rend les classes difficiles à lire et à maintenir.
Un contrôleur qui génère une réponse directement à la sortie est difficile à tester unitairement. Vous devrez créer des implémentations simulées Objet de réponse puis être capable de traiter la sortie provenant du contrôleur pour déterminer de quoi il s'agit. Cela peut signifier, par exemple, la nécessité d'analyser le balisage HTML dans mots-clés, ce qui est un processus long et fastidieux.
Traiter les moindres détails de chaque réponse de cette manière est complexe et sujet aux erreurs. Certains programmeurs apprécient le contrôle absolu fourni par la construction d'un contrôleur de bas niveau, mais cela se complique généralement très rapidement.
Heureusement, le framework MVC dispose d'un outil pratique qui résout tous ces problèmes : les résultats des actions. Les sections suivantes expliquent le concept de résultats d'action et montrent diverses manières son utilisation pour générer des réponses des contrôleurs.
Résultats des actionsLes résultats des actions dans le cadre MVC sont utilisés pour séparer les déclarations d'intention de l'exécution de l'intention (désolé pour la tautologie). Le concept semblera simple une fois que vous l'aurez compris, mais il faut un certain temps pour le comprendre en raison de certains aspects indirects.
Au lieu de traiter directement un objet Response, les méthodes d'action renvoient un objet de classe dérivé d'ActionResult qui décrit ce que devrait être la réponse du contrôleur, par exemple le rendu d'une vue ou la redirection vers une autre URL ou méthode d'action. Cependant (c’est là le caractère très indirect) la réponse n’est pas directement générée. Au lieu de cela, un objet ActionResult est créé, que le framework MVC traite pour produire le résultat après l'appel de la méthode d'action.
Un système de résultats d’action est un exemple du modèle de conception Command. Ce modèle représente des scénarios dans lesquels vous stockez et transmettez des objets qui décrivent les opérations en cours.
Lorsque le framework MVC reçoit un objet ActionResult d'une méthode d'action, il appelle Méthode ExecuteResult(), défini dans la classe de cet objet. L'implémentation des résultats de l'action opère ensuite sur l'objet Response, générant une sortie qui correspond à votre intention. Pour démontrer cela en action, créons un dossier Infrastructure et ajoutons-y nouveau fichier classe nommée CustomRedirectResult.cs avec une implémentation ActionResult personnalisée illustrée dans l'exemple ci-dessous :
Utilisation de System.Web.Mvc ; espace de noms ControllersAndActions.Infrastructure ( public class CustomRedirectResult: ActionResult ( public string Url ( get; set; ) public override void ExecuteResult(ControllerContext context) ( string fullUrl = UrlHelper.GenerateContentUrl(Url, context.HttpContext); context.HttpContext.Response.Redirect (URL complète);
Cette classe est basée sur le fonctionnement de la classe System.Web.Mvc.RedirectResult. Un des avantages source ouverte Le framework MVC vise à pouvoir explorer le fonctionnement interne de n'importe quoi. La classe CustomRedirectResult est beaucoup plus simple que son équivalent MVC, mais elle est suffisante pour les besoins de cet article.
Lors de l'instanciation de la classe RedirectResult, nous transmettons l'URL vers laquelle l'utilisateur doit être redirigé. La méthode ExecuteResult(), qui sera exécutée par le Framework MVC une fois la méthode d'action terminée, reçoit l'objet Response pour la requête via l'objet ControllerContext fourni par le Framework et appelle soit la méthode RedirectPermanent(), soit la méthode Redirect() (cela est exactement ce qui a été fait dans l'implémentation de bas niveau d'IController dans l'exemple précédent dans l'article).
L'utilisation de la classe CustomRedirectResult est illustrée dans l'exemple ci-dessous, qui montre les modifications apportées au contrôleur Derived :
// ... utilisant ControllersAndActions.Infrastructure ; espace de noms ControllersAndActions.Controllers ( public class DerivedController: Controller ( public ActionResult Index() ( // ... ) public ActionResult ProduceOutput() ( if (Server.MachineName == "MyMachineName") renvoie un nouveau CustomRedirectResult ( Url = "/Basic/ Index" ); else ( Response.Write("Contrôleur : dérivé, méthode d'action : ProduceOutput"); return null; ) ) ) )
Notez que nous avons été obligés de modifier le résultat de la méthode d'action pour renvoyer ActionResult. Nous renvoyons null si nous ne voulons pas que le framework MVC fasse quoi que ce soit lorsque notre méthode d'action est exécutée, ce que nous avons fait si l'instance CustomRedirectResult n'a pas été renvoyée.
Contrôleurs et actions de tests unitaires
De nombreuses parties du framework MVC sont conçues pour faciliter les tests unitaires, et cela est particulièrement vrai pour les actions et les contrôleurs. Plusieurs raisons expliquent ce soutien :
Vous pouvez tester des actions et des contrôleurs en dehors du serveur Web. Les objets contextuels sont accessibles via leurs classes de base (telles que HttpRequestBase), ce qui est facile à simuler.
Pour tester les résultats d'une méthode d'action, vous n'avez pas besoin d'analyser le balisage HTML. Pour vous assurer que vous obtenez les résultats attendus, vous pouvez inspecter l'objet ActionResult renvoyé.
L'émulation des demandes des clients n'est pas nécessaire. Le système de liaison de modèles du framework MVC vous permet d'écrire des méthodes d'action qui reçoivent des entrées dans leurs paramètres. Pour tester une méthode d'action, il vous suffit de l'appeler directement et de fournir les valeurs de paramètres appropriées.
Les prochains articles sur la génération de données à partir de contrôleurs vous montreront comment créer des tests unitaires pour différents types résultats des actions.
N'oubliez pas que les tests unitaires ne sont qu'une partie du tableau. Un comportement complexe dans une application se produit lorsque les méthodes d'action sont appelées séquentiellement. Les tests unitaires fonctionnent mieux lorsqu'ils sont combinés avec d'autres approches de test.
Maintenant que vous savez comment fonctionne le résultat spécial d'une action de redirection, vous pouvez passer à son équivalent proposé par le framework MVC, plus puissant et minutieusement testé par Microsoft. La modification requise pour le contrôleur dérivé est indiquée ci-dessous :
// ... public ActionResult ProduceOutput() ( return new RedirectResult("/Basic/Index"); ) // ...
A été supprimé de la méthode d'action opérateur conditionnel, ce qui signifie qu'après avoir lancé l'application et accédé à une URL telle que /Derived/ProduceOutput, le navigateur sera redirigé vers une URL telle que /Basic/Index. Pour simplifier le code de la méthode d'action, la classe Controller inclut des méthodes pratiques pour générer différents types Objets ActionResult. Ainsi, par exemple, nous pouvons obtenir le même effet que dans l'exemple ci-dessus en renvoyant le résultat de la méthode Redirect() :
// ... public ActionResult ProduceOutput() ( return Redirect("/Basic/Index"); ) // ...
Le système de résultats d'action n'a rien de particulièrement complexe, mais il permet en fin de compte de produire un code plus simple, plus propre et plus cohérent, facile à lire et à tester unitairement. Par exemple, dans le cas d'une redirection, vous pouvez simplement vérifier que la méthode d'action renvoie une instance RedirectResult dont la propriété Url contient la cible attendue.
Le framework MVC définit de nombreux types de résultats d'action intégrés, décrits dans le tableau ci-dessous :
Afficher le résultat | Rend le modèle de vue spécifié ou standard |
Voir() |
Résultat de vue partielle | Rend le modèle de vue partielle spécifié ou standard |
Vue partielle() |
RedirectionVersRouteResult | Émet une redirection HTTP 301 ou 302 vers la méthode d'action ou l'entrée spécifiée route, générant une URL selon la configuration du routage |
RedirectionVersAction() RedirectionVersActionPermanent() RedirectionVersRoute() RedirectionVersRoutePermanent() |
Résultat de redirection | Émet une redirection HTTP 301 ou 302 vers l'URL donnée |
Réorienter() RedirectionPermanent() |
ContenuRésultat | Renvoie les données texte non formatées au navigateur, en définissant en outre l'en-tête du type de contenu |
Contenu() |
FichierRésultat | Transfère les données binaires (telles qu'un fichier sur disque ou un tableau d'octets en mémoire) directement vers le navigateur |
Déposer() |
Résultat Json | Sérialise un objet .NET en JSON et l'envoie en réponse. Les réponses de ce type sont plus souvent générées lors de l'utilisation Outils Web API et AJAX |
Json() |
Résultat JavaScript | Envoie un fragment code source JavaScript qui doit être exécuté par le navigateur |
JavaScript() |
HttpRésultatNonAutorisé | Fixe le code d'état de la réponse HTTP à 401 (signifiant "non autorisé"), ce qui force le mécanisme d'authentification en vigueur (authentification par formulaires ou Authentification Windows) inviter le visiteur à se connecter |
Non |
HttpNotFoundResult | Renvoie le code d'erreur HTTP 404 - Pas trouvé(pas trouvé) |
HttpNotFound() |
HttpStatusCodeRésultat | Renvoie le code HTTP spécifié |
Non |
Résultat vide | Ne fait rien |
Non |
Tous ces types dérivent de la classe ActionResult et beaucoup d’entre eux disposent de méthodes d’assistance pratiques dans la classe Controller. Nous démontrerons l’utilisation de ces types de résultats dans des articles ultérieurs.