Phantomjs:某些页面无法打开

我目前正在编写一个涉及networking抓取的networking应用程序。 为了帮助,我正在使用phantomjs的帮助。 但是,某些(但不是全部)网页正在返回状态=“失败”。

这里是代码(注意:这实际上是使用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 

任何帮助,为什么谷歌将加载,但不列出的url将不胜感激!

(注意:我试图用PhantomJS来处理网页的问题也是一样的)

尝试使用–ssl-protocol = any调用phantomjs

我有一个相同的问题,一个星期前的外部网站工作。

于是我search了一下,发现Qt QNetworkReply连接closures了一个相关的问题。 它帮助我研究了phantomjs的embedded式Qt:它默认在SSLv3中强制build立新的连接,这对于旧的站点来说太新了,或者对于新的站点来说太旧了(但是在Qt 4.8.4时是一个相当合理的默认值发布)。

用“任何”,你告诉phantomjs尝试所有的协议,这应该有助于你通过testing。 它会尝试比SSLv3更安全的协议,但也比SSLv3更安全(SSLv3处于中等范围)。 所以,如果“any”有效,那么你应该尝试强制一个比SSLv3更安全的值,而不是让“any”。 在我的情况下,指定–ssl-protocol = tlsv1工作。

猜测最近SSL(goto fail,heartbleed,poodle等)的问题使得很多网站升级他们的服务器,现在拒绝SSLv3连接。 但是,如果您的服务器使用比SSLv3更老的协议,请保留“任何”(以及所有与此相关的安全风险…)。

这将工作。

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