Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
YIXUNFE opened this issue Oct 13, 2015 · 0 comments

Comments

@YIXUNFE
Copy link
Owner

YIXUNFE commented Oct 13, 2015

使用 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()

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


Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant