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)
我想获取网站上显示的值的实时更新 网站: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)