我目前正在编写一个涉及网络抓取的网络应用程序。为了解决这个问题,我正在使用phantomjs的帮助。但是,某些(但不是全部)网页返回status =“fail”。
这是代码(注意:这实际上是使用在此处找到的node-phantom库在nodejs中编写的:https://github.com/alexscheelmeyer/node-phantom。虽然语法可能不同,但实际上库实际上与phantomjs一起工作所以它不应该做任何不同的事情:
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'}});
因此,对于google.com的page.open,页面会成功加载。但是,如果列出了其他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
任何关于谷歌为什么会加载而不是列出的网址的帮助将不胜感激!
答案 0 :(得分:15)
(注意:我在Issue trying to use PhantomJS to process a web page)
的答案完全相同尝试使用--ssl-protocol = any
调用phantomjs我有一个完全相同的问题,一个星期前有一个外部网站。
所以我搜索了一下,发现了Qt QNetworkReply connection closed中描述的相关问题。它帮助我调查了phantomjs的嵌入式Qt:它默认强制在SSLv3中建立新的连接,这对于旧站点来说太新了,或者对于新站点来说太旧了(但是在Qt 4.8.4时是非常合理的默认值)释放)。
使用“any”,你告诉phantomjs尝试所有协议,这应该可以帮助你通过测试。它将尝试比SSLv3更安全的协议,但SSLv3的安全性也低于SSLv3(SSLv3处于中间范围)。因此,如果“any”有效,那么您应该尝试强制使用比SSLv3更安全的值而不是“any”。在我的例子中,指定--ssl-protocol = tlsv1工作。
猜猜最近SSL的问题(goto fail,heartbleed,poodle等)使得很多网站升级了他们的服务器,现在拒绝SSLv3连接。 但是,如果您的服务器使用比SSLv3更旧的协议,请保留“any”(以及所有相关的安全风险......)。
答案 1 :(得分:1)
这样可行。
result = accumarray([x(:) y(:)], 1, [70 70], @(x) 1, 0, true); %// force 1, sparse matrix