【问题标题】:Properly watch websites for updates正确观看网站以获取更新
【发布时间】:2015-05-12 07:19:00
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: python beautifulsoup python-requests pushbullet


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-25
      • 1970-01-01
      • 1970-01-01
      • 2011-06-09
      • 2013-09-30
      • 1970-01-01
      • 1970-01-01
      • 2019-02-12
      相关资源
      最近更新 更多