正确观看网站的更新

时间:2015-05-12 07:19:01

标签: python beautifulsoup python-requests pushbullet

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

(这个问题是因为我今晚更新了我的apache 2.4配置,它显然触发了mvn -Drat.skip=true package 观看的本地文件输出的轻微变化,因此所有11个频道得到了一个错误的更新推送给他们。)

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

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

我在输入此问题时的想法:可能的解决方案是将每个当前版本字符串(例如:str(soup.select("h2#" + dev + " ~ table")[0]))保存为pickle变量,然后{{strong> 1}}检测到它会将新版本字符串与腌制字符串进行比较的差异,只有在它们不同的情况下才会推送?我也会抛出正则表达式匹配,以确保新格式与旧格式匹配并且只是更新了数据,但这至少可以成为一个很好的临时措施,以防止将来出现误报吗?

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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