
J'aime vraiment l'opéra et le ballet, mais pas vraiment - donne beaucoup d'argent pour les billets. La consultation quotidienne du site Web du théâtre avec un coup sur chaque bouton était terriblement fatigante, et les billets de 170 roubles apparaissant soudainement pour les super-trains étaient navrants.
Pour automatiser cette activité, un script est apparu qui s'exécute sur une affiche et recueille des informations sur les billets les moins chers pour le mois sélectionné. Les demandes de la série "publient une liste de tous les opéras en mars sur l'ancienne et la nouvelle scène jusqu'à 1000 roubles". Un ami a laissé tomber "vous ne faites pas un bot Telegram?" Ce n'était pas dans le plan, mais pourquoi pas. Le bot était né, bien qu'il tournait sur un ordinateur portable domestique.
Telegram a ensuite été bloqué. L'idée de pousser le bot sur le serveur qui fonctionne a fondu, et l'intérêt de penser à la fonctionnalité s'est évanoui. Sous la coupe, je parle du sort d'un détective de billets bon marché depuis le tout début et de ce qui lui est arrivé après un an d'utilisation.
1. L'origine de l'idée et l'énoncé du problème
Dans la production initiale, toute l'histoire avait une tâche - créer une liste de performances, filtrées par prix, afin de gagner du temps sur la visualisation manuelle de chaque performance de l'affiche individuellement. Le seul théâtre dont l'affiche était intéressante était et reste le Mariinsky. L'expérience personnelle a rapidement montré que la "galerie" de budget s'ouvre sur des jours aléatoires pour des performances aléatoires et porte ses fruits assez rapidement (si le personnel est debout). Pour ne rien manquer, un collecteur automatique est nécessaire.
Type d'affiche avec boutons que vous avez dû parcourir manuellement Je voulais obtenir un ensemble limité de performances intéressantes pour l'exécution du script. Le critère principal, comme déjà mentionné, était le prix du billet.
L'API du site et le système de tickets ne sont pas accessibles au public, il a donc été décidé (sans plus tarder) d'analyser les pages HTML, en retirant les balises nécessaires. Ouvrez le principal, appuyez sur F12 et étudiez la structure. Il semblait adéquat, donc les choses ont rapidement atteint la 1ère implémentation.
Il est clair que cette approche ne s'adapte pas à d'autres sites avec des affiches et s'effondrera s'ils décident de changer la structure actuelle. Si les lecteurs ont des idées sur la façon de les rendre plus stables sans API, écrivez dans les commentaires.
2. La première implémentation. Fonctionnalité minimale
J'ai trouvé une implémentation avec une expérience avec Python uniquement pour résoudre des tâches liées à l'apprentissage automatique. Et il n'y avait pas de compréhension approfondie de l'architecture HTML et Web (et cela n'apparaissait pas). Par conséquent, tout a été fait selon le principe «où je vais, je sais, mais maintenant nous allons trouver comment aller»
Pour les premières ébauches, il a fallu 4 heures de soirée et une introduction aux demandes et aux modules Beautiful Soup 4 (non sans l'aide d'un bon
article , merci à l'auteur). Pour terminer le croquis - un autre jour de congé. Je ne suis pas complètement sûr que les modules soient les plus optimaux dans leur segment, mais ils ont fermé leurs besoins actuels. Voici ce qui s'est passé lors de la première étape.
Quelles informations et où retirer peuvent être comprises par la structure du site. Tout d'abord, nous collectons les adresses des soumissions qui figurent sur l'affiche du mois sélectionné.
La structure de la page affiche dans le navigateur, tout est mis en évidence de manière pratique À partir de la page html, nous devons lire les URL pures, puis les parcourir et voir le prix. C'est ainsi que la liste des liens est assemblée.
import requests import numpy as np from bs4 import BeautifulSoup def get_text(url):
Après avoir étudié la structure de la page avec l'achat de billets, en plus du seuil de prix, j'ai décidé de donner à l'utilisateur la possibilité de choisir également:
- type de représentation (1 opéra, 2 ballets, 3 concerts, 4 conférences)
- lieu (1 scène ancienne, 2 nouvelles scènes, 3 salles de concert, salles 4 chambres)
Les informations sont saisies via la console au format numérique; plusieurs nombres peuvent être sélectionnés. Cette variabilité est dictée par la différence de prix pour l'opéra et le ballet (l'opéra est moins cher) et le désir de consulter leurs listes séparément.
Le résultat est
4 questions et 4 filtres de données - mois, seuil de prix, type, emplacement.
Ensuite, nous parcourons tous les liens reçus. Nous créons get_text et recherchons le prix le plus bas, et retirons également les informations associées. Étant donné que vous devez examiner chaque URL et la convertir en texte, l'exécution du programme n'est pas instantanée. Ce serait bien d'optimiser, mais je n'ai pas pensé à comment.
Je ne citerai pas le code lui-même, ce sera un peu long, mais tout est vrai de manière adéquate et «intuitive» avec Beautiful Soup 4.
Si le prix est inférieur à celui déclaré par l'utilisateur et que le type-place correspond à l'ensemble, un message sur les performances s'affiche dans la console. Il y avait une autre option pour enregistrer tout cela en .xls, mais cela n'a pas pris racine. Il est plus pratique de regarder dans la console et de suivre immédiatement les liens que de fouiller dans un fichier.

Environ 150 lignes de code sont sorties. Dans cette version, avec les fonctions minimales décrites, le script est plus vivant que tous les vivants et s'exécute régulièrement avec une période de quelques jours. Toutes les autres modifications n'étaient pas terminées (le poinçon s'est éteint) et sont donc inactives, ou plus avantageuses dans les fonctions.
3. Extension des fonctionnalités
À la deuxième étape, j'ai décidé de suivre les changements de prix, en stockant les liens vers les performances d'intérêt dans un fichier séparé (plus précisément, l'URL vers eux). Tout d'abord, cela est pertinent pour les ballets - ils sont très rarement très bon marché et ils ne tomberont pas dans la question du budget général. Mais de 5000 à 2x, la baisse est importante, surtout si la performance est avec un casting stellaire, et je voulais le suivre.
Pour ce faire, vous devez d'abord ajouter les URL pour le suivi, puis les «secouer» périodiquement et comparer le nouveau prix avec l'ancien.
def add_new_URL(user_id,perf_url):
La mise à jour des prix a été lancée au début du script principal, elle n'a pas été effectuée séparément. Peut-être pas aussi élégant que nous le souhaiterions, mais cela résout son problème. La deuxième fonctionnalité supplémentaire a donc été la surveillance de la baisse des prix des performances intéressantes.
Puis le bot Telegram est né, pas si facile, rapide, guilleret, mais toujours né. Afin de ne pas tout mettre ensemble, l'histoire de lui (ainsi que des idées non réalisées et une tentative de le faire avec le site Web du Théâtre du Bolchoï) sera dans la deuxième partie de l'article.
RÉSULTAT: l' idée a été un succès, les utilisateurs sont satisfaits. Il a fallu quelques week-ends pour comprendre comment interagir avec les pages html. Heureusement, Python est un langage presque pour tout et des modules prêts à l'emploi aident à enfoncer un clou sans penser à la physique du marteau.
J'espère que l'affaire sera utile aux Habrachiens et, peut-être, cela fonctionnera comme un Pendel magique pour enfin faire une liste de souhaits longtemps assise dans ma tête.
UPD: Poursuivre l'histoire - Partie 2