1

我编写了一个脚本,用于在发布新的Nexus 工厂映像时将更新推送到 Pushbullet 频道。该页面上的前 11 台设备中的每台都有一个单独的频道,我正在使用一个相当复杂的脚本来监视更新。完整的设置在这里(特别是这个脚本),但我将简要总结下面的脚本。我的问题是:这显然不是正确的做法,因为它很容易出现多点故障。有什么更好的方法来做到这一点?我宁愿坚持使用 Python,但如果它们更简单/更好,我愿意接受其他语言。

(这个问题是由于我今晚更新了我的 apache 2.4 配置,它显然触发了由 观看的本地文件的输出的轻微变化urlwatch,因此所有 11 个频道都收到了错误的更新推送给他们。)

基本脚本功能(不包括一些非必要部分):

  • 创建与其完整型号名称关联的每个设备代号的字典
  • 使用请求获取现有的 Nexus 工厂图像页面
  • 从源代码制作bs4对象
  • 对于字典(循环)中的 11 个设备中的每一个,执行以下操作:
    • 在设备的公共 Web 目录中打开/创建页面
    • 将源代码写入该页面,使用 bs4 过滤:str(soup.select("h2#" + dev + " ~ table")[0])
    • 在页面上调urlwatch用以检查更新,将输出保存到临时文件
    • 如果临时文件大小> 0,则页面已更改,因此将更新推送到适当的频道
    • 删除网页和临时文件

我在输入这个问题时的一个想法:可能的解决方案是将每个当前版本字符串(例如:)保存5.1.0 (LMY47I)为腌制变量,然后如果urlwatch检测到差异,它将新版本字符串与腌制的字符串进行比较,并且只推送如果他们不同?我也会加入正则表达式匹配,以确保新格式与旧格式匹配并且刚刚更新了数据,但这至少可以作为一个很好的临时措施来防​​止未来的误报吗?

4

1 回答 1

0

抓取本质上是脆弱的,但如果它们不更改源格式,在这种情况下应该非常简单。您应该将网页解析为数据结构。使用 bs4 就可以了。最终结果应该是一个 python 字典:

{
 'mantaray': {
     '4.2.2 (JDQ39)': {'link': 'https://...'},
     '4.3 (JWR66Y)': {'link': 'https://...'},
 },
 ...
}

用 . 保存这个结构json.dumps。现在,每次解析页面时,您都可以生成类似的数据结构并将其与磁盘上的数据结构进行比较(每次完成后更新保存的数据结构)。

然后剩下的唯一部分是比较数据结构。您可以迭代所有模型并检查您在当前版本页面中的每个版本是否存在于先前版本中。如果没有,您有一个新版本。

您还可以使用https://www.kimonolabs.com/生成一个易于使用的 API,而不是自己进行解析。

于 2015-05-12T17:05:31.267 回答