
我真的很喜欢歌剧和芭蕾舞,但不是很喜欢-花很多钱买票。 每天都在剧院的网站上浏览,每个按钮处都戳着它,真是令人厌烦,突然出现的170卢布的超级火车票令人心碎。
为了使这项业务自动化,出现了一个脚本,该脚本在海报上运行,并收集有关所选月份最便宜机票的信息。 从系列的请求“发行在新的和新的阶段的在三月的所有歌剧的名单由1000卢布决定。” 一个朋友放弃了“你不是在做电报机器人吗?” 这不在计划中,但是为什么不呢? 该机器人诞生了,尽管它正在家用笔记本电脑上旋转。
然后电报被阻止了。 将Bot推入工作服务器的想法已经消散,而将功能引入脑海的兴趣已经消失。 在削减中,我从一开始就谈论廉价机票侦探的命运,以及他使用一年后发生了什么。
1.想法的起源和问题的陈述
在最初的制作中,整个故事只有一个任务-创建按价格过滤的表演列表,以节省手动查看海报的每个表演所需的时间。 唯一感兴趣的剧院是马林斯基剧院。 个人经验很快表明,预算“画廊”在随机的日子开放以进行随机表演,并且可以很快得到回报(如果工作人员站着)。 为了不丢失任何东西,需要一个自动收集器。
我想获得运行脚本所需的有限性能。 正如已经提到的,主要标准是机票价格。
该网站的API和票证系统未公开可用,因此决定(无需再费力气)解析HTML页面,以提取必要的标签。 打开主菜单,按F12键并研究结构。 看起来足够了,所以事情很快就达到了第一个实现。
显然,这种方法无法扩展到其他带有海报的站点,并且如果他们决定更改当前结构,将会崩溃。 如果读者对在没有API的情况下如何使其更稳定有想法,请在注释中写上。
2.第一次执行。 最低功能
我想出了一个具有Python经验的实现,仅用于解决与机器学习有关的任务。 而且对html和网络架构没有任何深入的了解(并且没有出现)。 因此,一切都按照“我知道我要去哪里,但现在我们将找到方法”的原则完成。
对于初稿,花了4个晚上的时间,并介绍了请求和Beautiful Soup 4个模块(感谢作者,这不是没有好的
文章的帮助)。 完成草图-改天休息。 我不能完全确定模块在它们的细分市场中是最佳的,但是它们已经满足了当前的需求。 这是第一阶段发生的事情。
网站的结构可以了解哪些信息以及从何处提取信息。 首先,我们收集所选月份的海报上提交的地址。
浏览器中张贴者页面的结构,所有内容都方便地突出显示 从html页面,我们需要阅读纯URL,然后浏览它们并查看价格标签。 这就是链接列表的组装方式。
import requests import numpy as np from bs4 import BeautifulSoup def get_text(url):
在研究了门票购买页面的结构之后,除了价格阈值之外,我决定让用户有机会选择:
- 表演类型(1部歌剧,2部芭蕾舞,3场音乐会,4场演讲)
- 场地(1个旧舞台,2个新舞台,3个音乐厅,4个音乐厅)
通过控制台以数字格式输入信息;可以选择多个数字。 这种可变性是由歌剧和芭蕾舞的价格差异(歌剧比较便宜)以及希望分别查看他们的节目单所决定的。
结果是
4个问题和4个数据过滤器 -月,价格阈值,类型,位置。
接下来,我们浏览所有收到的链接。 我们制作get_text并寻找价格较低的商品,并提取相关信息。 由于您必须查看每个URL并将其转换为文本,因此程序的运行时间不是即时的。 优化会很好,但是我没有想到如何做。
我不会引用代码本身,因为代码会很长,但是使用Beautiful Soup 4可以充分直观地实现所有功能。
如果价格低于用户声明的价格,并且打字位对应于该设置,则控制台上将显示有关性能的消息。 还有另一种方法可以将所有内容保存在.xls中,但是没有扎根。 在控制台中查看并立即跟随链接比戳入文件更方便。

大约发布了150行代码。 在此版本中,具有所描述的最小功能,该脚本比所有活动脚本更生动,并且定期运行几天。 所有其他修改都没有完成(锥子已经消失),因此处于非活动状态,或者在功能上不再具有优势。
3.功能扩展
在第二阶段,我决定跟踪价格变化,将感兴趣的性能的链接存储在单独的文件中(更确切地说,是指向它们的URL)。 首先,这与芭蕾舞有关-它们很少非常便宜,并且不会落入总预算问题。 但是从5000下降到2倍时,下降幅度非常大,尤其是当性能表现出色时,我想跟踪它。
为此,您必须首先添加要跟踪的URL,然后定期“摇晃”它们,并将新价格与旧价格进行比较。
def add_new_URL(user_id,perf_url):
价格更新是在主脚本的开头启动的,没有单独进行。 也许不像我们想要的那样优雅,但是它解决了它的问题。 因此,第二个附加功能是监视价格下降以获取感兴趣的性能。
然后,Telegram机器人诞生了,不是那么容易,快速,活泼,但仍然诞生了。 为了不把所有东西都放在一起,有关他的故事(以及未实现的想法以及在莫斯科大剧院网站上进行的尝试)将在本文的第二部分。
结果:这个想法成功了,用户感到满意。 花了两个周末才弄清楚如何与html页面进行交互。 幸运的是,Python是几乎所有语言的工具,并且现成的模块有助于钉钉子,而无需考虑锤子的物理原理。
我希望这个案子对哈勃拉希亚人有用,也许它将像一个神奇的潘德尔一样工作,最终使我的愿望清单长期呆在我的脑海。
UPD: 延续故事-第2部分