Phantomjs 无法通过 aspx 从 HTML 网站获取刷新内容

Phantomjs unable to get refreshed content from HTML website by aspx

我想获取网站上显示的值的实时更新 网站:http://www.aastocks.com/en/stocks/market/bmpfutures.aspx 目标 html 元素 id:font26 bold cls ff-arial

我一直在使用 phantomjs 代码如下

var page = require('webpage').create();
page.open('http://www.aastocks.com/en/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()
})

截图在这里:

问题是当代码第一次运行时,它能够获取值,但是之后,该值被缓存并且无法更新。

甚至尝试过

var needle = require('needle');
const cheerio = require('cheerio')
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()
    console.log(value)
  }

});

不幸的是,目标页面上所需的值不会实时更新,所以我们必须将 interval 从 page.open 回调移到主范围,并根据需要经常刷新页面:

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。

P.S.

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

更新节点迁移

你几乎做对了!细微差别在于组成选择器的方式。由于所有这些 类 都属于一个元素,因此您需要像这样放下它们:

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)