Phantomjs не может получить обновленный контент с веб-сайта HTML aspx - PullRequest
2 голосов
/ 31 мая 2019

Я хотел бы получить обновление значения в реальном времени на веб-сайте Сайт: http://www.aastocks.com/en/stocks/market/bmpfutures.aspx Идентификатор целевого элемента HTML: font26, полужирный, 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()
})

со скриншотом здесь: enter image description here

Проблема в том, что при первом запуске кода он может получить значение, но после этого значение кэшируется и не может быть обновлено.

даже пробовал с

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)
  }

});

1 Ответ

3 голосов
/ 03 июня 2019

К сожалению, необходимое значение на целевой странице не будет обновляться в реальном времени, поэтому нам придется переместить интервал из обратного вызова 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-адреса.

приписка

Только что посмотрел на источник страницы и оказалось, что вам даже не нужен 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...