Javascript Phantomjs:某些页面无法打开
我目前正在编写一个web应用程序,其中涉及一些web抓取。为了帮助这一点,我正在使用phantomjs的帮助。但是,某些(但不是所有)网页返回状态=“失败” 以下是代码(注意:这实际上是使用此处找到的节点幻影库在nodejs中编写的:。虽然语法可能不同,但该库实际上直接与幻影JS一起工作,因此它不应该做任何不同的事情:Javascript Phantomjs:某些页面无法打开,javascript,node.js,phantomjs,Javascript,Node.js,Phantomjs,我目前正在编写一个web应用程序,其中涉及一些web抓取。为了帮助这一点,我正在使用phantomjs的帮助。但是,某些(但不是所有)网页返回状态=“失败” 以下是代码(注意:这实际上是使用此处找到的节点幻影库在nodejs中编写的:。虽然语法可能不同,但该库实际上直接与幻影JS一起工作,因此它不应该做任何不同的事情: phantom.create(function (err,ph) { ph.createPage(function (err,page) { page.o
phantom.create(function (err,ph) {
ph.createPage(function (err,page) {
page.onResourceError = function(errorData) {
console.log('Unable to load resource (URL:' + errorData.url + ')');
console.log('Error code: ' + errorData.errorCode + '. Description: ' + errorData.errorString);
};
page.onLoadFinished = function(status) {
console.log('Status: ' + status);
if(status==='success') {
page.includeJs('http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js', function () {
if(fetch_results) {
//THIS IS WHERE YOU WILL DO RESULTS SHIT
console.log("results page stuff entered");
page.render('phantomjs-test2.png');
ph.exit();
} else {
page.evaluate(function () {
//page evaluate stuff
}, function(err, result) {
console.log("entering here");
page.render('phantomjs-test.png');
if(!err) fetch_results = true;
});
}
});
} else {
console.log(
"Error opening url \"" + page.reason_url
+ "\": " + page.reason
);
console.log("Connection failed.");
ph.exit();
}
}
//page.open("https://www.google.com",function (err,status) {});
page.open("https://www.pavoterservices.state.pa.us/Pages/PollingPlaceInfo.aspx",function (err,status) {});
});
}, {parameters:{'ignore-ssl-errors':'yes'}});
因此,对于page.open with google.com,页面加载成功。但是,如果列出了其他url,则返回以下错误:
Unable to load resource (URL:https://www.pavoterservices.state.pa.us/Pages/PollingPlaceInfo.aspx); Error code: 2. Description: connection closed; Error opening url "undefined": undefined
对于谷歌为什么会加载而不加载所列url的任何帮助,我们将不胜感激!(注意:我在上的回答完全相同)
尝试使用--ssl protocol=any调用phantomjs
我也有同样的问题,一周前有一个外部网站在运行
所以我搜索了一下,发现了中描述的一个相关问题。它帮助我研究了phantomjs的嵌入式Qt:它默认在SSLv3中强制新连接,这对于旧站点来说太新了,或者对于新站点来说太旧了(但在Qt4.8.4发布时是一个相当合理的默认值)
使用“any”,您告诉phantomjs尝试所有协议,这将帮助您通过测试。它将尝试比SSLv3更安全的协议,但也会尝试比SSLv3更不安全的协议(SSLv3处于中等范围)。因此,如果“any”起作用,您应该尝试强制使用比SSLv3更安全的值,而不是让“any”.在我的例子中,指定--ssl protocol=tlsv1起作用
我猜最近的SSL问题(goto fail、heartbleed、poodle等)让很多网站升级了服务器,现在拒绝了SSLv3连接。
但是,如果您的服务器使用的是比SSLv3更旧的协议,请保留“any”(以及所有相关的安全风险…)。这将起作用
var phantom = require('phantom');
phantom.create(function(ph) {
ph.createPage(function(page) {
page.open('https://www.facebook.com/login.php',
function(status) {
console.log('Opened site? %s', status);
page.render("page.png");
if (status !== 'success')
{
console.log('FAIL to load the address');
}
else
{
console.log('Success in fetching the page');
another_funny(page, ph);
ph.exit();
}
});
});
}, {parameters:{'ssl-protocol':'any'}} );
function another_funny(page, ph) {
console.log("like page");
}
可能是用户代理头?作为参考,有人专门试图阻止phantom.js客户端这可能是“正确”的答案。现在建议在大多数服务器上阻止SSLv3,并且设置protocol=any标志完美地解决了我的问题。谢谢!这救了我的命。谢谢!