
Eu realmente amo ópera e balé, mas não muito - dê muito dinheiro por ingressos. A exibição diária do site do teatro com um toque em cada botão era terrivelmente cansativa, e os bilhetes que apareciam subitamente de 170 rublos para super trens eram de partir o coração.
Para automatizar esse negócio, apareceu um script que é executado em um pôster e coleta informações sobre os ingressos mais baratos para o mês selecionado. Os pedidos da série "publicam uma lista de todas as óperas em março, na fase antiga e nova, de até 1000 rublos". Um amigo deixou cair "você não está fazendo um bot do Telegram?" Isso não estava no plano, mas por que não. O bot nasceu, embora estivesse rodando em um laptop doméstico.
O Telegram foi bloqueado. A idéia de enviar o bot para o servidor em funcionamento desapareceu e o interesse em trazer a funcionalidade à mente desapareceu. Por baixo do corte, falo sobre o destino de um detetive de passagens baratas desde o início e o que aconteceu com ele após um ano de uso.
1. A origem da ideia e afirmação do problema
Na produção inicial, toda a história tinha uma tarefa - criar uma lista de performances, filtradas por preço, para economizar tempo na visualização manual de cada apresentação do pôster individualmente. O único teatro cujo cartaz era de interesse era e continua sendo o Mariinsky. A experiência pessoal mostrou rapidamente que a "galeria" do orçamento abre em dias aleatórios para performances aleatórias e compensa com rapidez suficiente (se a equipe estiver de pé). Para não perder nada, é necessário um coletor automático.
Tipo de pôster com botões que você tinha para navegar manualmente Eu queria ter um conjunto limitado de apresentações de interesse para executar o script. O principal critério, como já mencionado, foi o preço do bilhete.
A API do site e o sistema de tickets não estão disponíveis ao público; portanto, foi tomada uma decisão (sem mais delongas) de analisar as páginas HTML, retirando as tags necessárias. Abra o principal, pressione F12 e estude a estrutura. Parecia adequado, então as coisas chegaram rapidamente à 1ª implementação.
É claro que essa abordagem não é dimensionada para outros sites com pôsteres e desmoronará se eles decidirem mudar a estrutura atual. Se os leitores tiverem idéias de como torná-los mais estáveis sem uma API, escreva nos comentários.
2. A primeira implementação. Funcionalidade mínima
Eu vim com uma implementação com experiência em Python apenas para resolver tarefas relacionadas ao aprendizado de máquina. E não havia (e não havia) nenhum entendimento profundo de html e arquitetura da web. Portanto, tudo foi feito de acordo com o princípio "onde eu vou, eu sei, mas agora vamos descobrir como ir"
Para os primeiros rascunhos, foram necessárias 4 horas noturnas e uma introdução aos pedidos e módulos Beautiful Soup 4 (não sem a ajuda de um bom
artigo , graças ao autor). Para finalizar o esboço - outro dia de folga. Não tenho certeza absoluta de que os módulos são os mais ideais em seu segmento, mas eles fecharam suas necessidades atuais. Aqui está o que aconteceu na primeira etapa.
Quais informações e onde retirar podem ser entendidas pela estrutura do site. Primeiro, coletamos os endereços dos envios que estão no cartaz do mês selecionado.
A estrutura da página de pôster no navegador, tudo é convenientemente destacado Na página html, precisamos ler os URLs limpos, depois percorrê-los e ver o preço. É assim que a lista de links é montada.
import requests import numpy as np from bs4 import BeautifulSoup def get_text(url):
Depois de estudar a estrutura da página com a compra de ingressos, além do limite de preço, decidi dar ao usuário a oportunidade de escolher também:
- tipo de performance (1 ópera, 2 balés, 3 concertos, 4 aulas)
- local (palco 1 antigo, 2 novo palco, 3 salas de concertos, 4 salas de câmara)
As informações são inseridas no console em um formato numérico; vários números podem ser selecionados. Essa variabilidade é ditada pela diferença nos preços da ópera e do balé (a ópera é mais barata) e pelo desejo de examinar suas listas separadamente.
O resultado são
4 perguntas e 4 filtros de dados - mês, limite de preço, tipo, localização.
Em seguida, examinamos todos os links recebidos. Criamos get_text e procuramos o preço mais baixo, além de extrair as informações relacionadas. Como você precisa procurar em cada URL e convertê-lo em texto, o tempo de execução do programa não é instantâneo. Seria bom otimizar, mas não pensei em como.
Eu não vou dar o código em si, vai demorar um pouco, mas tudo é verdade lá de forma adequada e "intuitiva" com a Beautiful Soup 4.
Se o preço for menor que o declarado pelo usuário e o tipo de local corresponder ao conjunto, uma mensagem sobre o desempenho será exibida no console. Havia outra opção para salvar tudo isso em .xls, mas não criou raiz. É mais conveniente procurar no console e seguir imediatamente os links do que entrar em um arquivo.

Foram publicadas cerca de 150 linhas de código. Nesta versão, com as funções mínimas descritas, o script é mais animado que todos os vivos e é executado regularmente por um período de alguns dias. Todas as outras modificações não foram dopadas (o furador acabou) e, portanto, são inativas ou não são mais vantajosas em funções.
3. Extensão da funcionalidade
Na segunda etapa, decidi acompanhar as alterações de preços, armazenando links para apresentações de interesse em um arquivo separado (mais precisamente, a URL para elas). Antes de tudo, isso é relevante para os ballets - eles raramente são muito baratos e não se enquadram na questão do orçamento geral. Mas de 5 mil a 2x a queda é significativa, principalmente se o desempenho for de elenco estelar, e eu quis acompanhá-lo.
Para fazer isso, você deve primeiro adicionar os URLs para rastreamento e, em seguida, agitá-los periodicamente e comparar o novo preço com o antigo.
def add_new_URL(user_id,perf_url):
A atualização de preço foi lançada no início do script principal, não foi realizada separadamente. Talvez não seja tão elegante quanto gostaríamos, mas resolve seu problema. Portanto, a segunda funcionalidade adicional foi monitorar o declínio nos preços de desempenhos de interesse.
Então o bot do Telegram nasceu, não tão fácil, rápido, alegre, mas ainda nasceu. Para não reunir tudo, a história sobre ele (bem como sobre idéias não realizadas e uma tentativa de fazer isso com o site do Teatro Bolshoi) estará na segunda parte do artigo.
RESULTADO: a ideia foi um sucesso, os usuários estão satisfeitos. Demorou alguns fins de semana para descobrir como interagir com as páginas html. Felizmente, o Python é uma linguagem quase-para-tudo e módulos prontos ajudam a pregar sem pensar na física do martelo.
Espero que o caso seja útil para os habráquios e, talvez, funcione como um pendel mágico para finalmente criar uma lista de desejos na minha cabeça por um longo tempo.
UPD: Continuando a História - Parte 2