Phantom.js无法通过ASPX从HTML网站获取刷新的内容

时间:2019-05-31 14:57:53

标签: javascript phantomjs

我想实时更新网站上显示的值 网站:http://www.aastocks.com/tc/stocks/market/bmpfutures.aspx 目标html元素ID:font26粗体cls ff-arial

我一直在使用phantomjs代码,如下所示

var page = require('webpage').create();
page.open('http://www.aastocks.com/tc/stocks/market/bmpfutures.aspx', function(status) {
  var last_value = -1

  setInterval(function() {
    var value = page.evaluate(function() {
      return document.getElementsByClassName('font26 bold cls ff-arial')[0].innerText
    })

    if (value != last_value) {
      console.log("Value as been updated to " + value)
      last_value = value
    }
  }, 1000)
//  phantom.exit()
})

问题在于,当代码首次运行时,它能够获取该值,但是此后,该值将被缓存并且无法更新。

1 个答案:

答案 0 :(得分:3)

不幸的是,目标页面上所需的值不会实时更新,因此我们将不得不将page.open回调中的时间间隔移至主作用域,并仅在必要时刷新页面:< / p>

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

var last_value = -1;

setInterval(function() {

    page.open('http://www.aastocks.com/en/stocks/market/bmpfutures.aspx', function(status) {

        var value = page.evaluate(function() {
          return document.getElementsByClassName('font26 bold cls ff-arial')[0].innerText
        })

        if (value != last_value) {
            console.log("Value as been updated to " + value)
            last_value = value;
        }
    });

}, 3000)

显然,最好不要太频繁地访问目标站点,还应该添加有效的用户代理,设置切合实际的分辨率并轮换IP。

PS

仅查看了页面的源代码,结果发现您甚至不需要PhantomJS,因为<div class="font26 bold cls ff-arial">26,696</div>就在HTML中。您可以使用任何脚本化的服务器端语言来获取它。

节点迁移更新

您几乎正确地做到了!细微差别构成了选择器。由于所有这些类都属于一个元素,因此需要像这样将它们放下:

const needle = require('needle');
const cheerio = require('cheerio')

setInterval(function(){
    needle.get('http://www.aastocks.com/en/stocks/market/bmpfutures.aspx', 
    function(error, response) {
      if (!error && response.statusCode == 200){
        const $ = cheerio.load(response.body)
        var value = $('.font26.bold.cls.ff-arial').html().trim()
        console.log(value)
      }
    })
}, 1000)