YIXUNFE / blog

文章区
151 stars 25 forks source link

使用 PhantomJS 实现自动化页面体检报告(二) —— 定时检查页面 #22

Open YIXUNFE opened 8 years ago

YIXUNFE commented 8 years ago

使用 PhantomJS 实现自动化页面体检报告(二) —— 定时检查页面

回到上一篇的出发点,出门在外,如何能够保证我们的页面能够正常呢?是不是应该带个电脑,是不是上网检查一下?

PhantomJS 来为你解决难题。利用 PhantomJS,我们可以定时检查页面状态并记录在日志中。

如果你不了解 PhantomJS,推荐你先阅读这篇文章

文章中仅仅使用 PhantomJS 进行定时检查,但在实际环境中,推荐集成 CI 工具执行定时任务。


构建一个定时任务

我们以检查易迅商详页为例:

场景:有 3 个特殊商品,需要我们每 6 小时检查一次商品价格,并记录在日志中。

分析一下场景,我们需要实现的功能点有:

针对这 3 个功能点,我们编写几段代码:

定义基础变量

var products = [2239332, 2205232, 2215852], //商品ID
  time = 6 * 60 * 60 * 1000, //时间间隔
  result = '', //检查结果
  checkedNumber = 0 //已检查索引

定义定时函数

function runTask () {
  setTimeout(function () {
    loop(products)
    runTask()
  }, time)
}

定时函数用来完成每次的大任务,即 loop(products),并设定下次的执行时间。

定义商品检查函数

function loop (array) {
  var i = 0, l = array.length
  result = '\r\ncheck data: ' + new Date().toISOString() + '\r\n'
  checkPrice(products[checkedNumber])
}

每一次开始遍历商品前,先设置一个检查时间至 result 变量中,然后执行 checkPrice 方法以获取对应商品的价格。

定义获取商品价格函数

function checkPrice (productId) {
  console.log('loading: http://item.yixun.com/item-' + productId + '.html')
  page.open('http://item.yixun.com/item-' + productId + '.html', function (status) { //打开商详页
    if (status !== 'success') {
      console.log('Unable to access network')
    } else {
      var price = page.evaluate(function() {
        return /****获取的价格****/
      })
      checkedNumber++ //增加索引号
      result += 'product id: ' + productId + ' price: ' + price + '\r\n' //记录商品价格
      if (checkedNumber >= products.length) { //遍历完一次后输出日志并重置索引
        result += 'end data: ' + new Date().toISOString() + '\r\n'
        console.log(result)
        checkedNumber = 0 
      } else { //继续获取下一个商品价格
        checkPrice(products[checkedNumber])
      }
    }
  })
}

让 PhantomJS 根据商品 ID 打开对应的商品详情页后,进入页面(page.evaluate)并获取页面中的商品价格,然后记录于 result 变量中。当遍历完商品后,输出所记录的日志。


运行结果

结果

日志已经被记录了,我们可以清晰的看到对应的时间点上,商品的价格。现在日志存在命令行中,更进一步,我们可以将日志写入文件,或者通过邮件发送至你的邮箱,这里不再过多赘述(其实是我懒=v=)。


Thanks




示例的完整代码

var page = require('webpage').create()

page.settings.userAgent = 'PhantomJS robot' //修改标签页的 UA,方便统计

//待检查商品
var products = [2239332, 2205232, 2215852],
  time = 6 * 60 * 60 * 1000,
  result = '',
  checkedNumber = 0

function runTask () {
  setTimeout(function () {
    loop(products)
    runTask()
  }, time)
}

function loop (array) {
  var i = 0, l = array.length
  result = '\r\ncheck data: ' + new Date().toISOString() + '\r\n'
  checkPrice(products[checkedNumber])
}

function checkPrice (productId) {console.log('loading: http://item.yixun.com/item-' + productId + '.html')
  page.open('http://item.yixun.com/item-' + productId + '.html', function (status) {
    if (status !== 'success') {
      console.log('Unable to access network')
    } else {
      var price = page.evaluate(function() {
        return /****获取的价格****/
      })
      checkedNumber++
      result += 'product id: ' + productId + ' price: ' + price + '\r\n'
      if (checkedNumber >= products.length) {
        result += 'end data: ' + new Date().toISOString() + '\r\n'
        console.log(result)
        checkedNumber = 0
      } else {
        setTimeout(function () {
          checkPrice(products[checkedNumber])
        }, 3000)
      }
    }
  })
}

runTask()

为避免不必要的麻烦,已将获取商品价格的代码用注释替代。