it-swarm.com.de

PhantomJS konnte die HTTPS-Site nicht öffnen

Ich verwende den folgenden Code basierend auf dem Beispiel loadspeed.js, um eine https: // site zu öffnen, für die ebenfalls die HTTP-Serverauthentifizierung erforderlich ist.

var page = require('webpage').create(), system = require('system'), t, address;

page.settings.userName = 'myusername';
page.settings.password = 'mypassword';

if (system.args.length === 1) {
    console.log('Usage: scrape.js <some URL>');
    phantom.exit();
} else {
    t = Date.now();
    address = system.args[1];
    page.open(address, function (status) {
        if (status !== 'success') {
            console.log('FAIL to load the address');
        } else {
            t = Date.now() - t;
            console.log('Page title is ' + page.evaluate(function () {
                return document.title;
            }));
            console.log('Loading time ' + t + ' msec');
        }
        phantom.exit();
    });
}  

Die Seite kann nicht ständig geladen werden. Was könnte hier falsch sein? Sind gesicherte Sites anders zu behandeln? Auf die Site kann jedoch erfolgreich vom Browser aus zugegriffen werden.

Ich fange gerade erst mit Phantom an und finde es zu gut, um mit dem Spielen aufzuhören, auch wenn ich mit dieser Ausgabe nicht weiter komme.

102
Sreerag

Ich habe die Antworten von Fred und Cameron Tinker ausprobiert, aber nur --ssl-protocol = any scheint mir zu helfen:

phantomjs --ssl-protocol=any test.js

Ich denke, es sollte sicherer sein, --ssl-protocol=any zu verwenden, da Sie immer noch Verschlüsselung verwenden, aber --ignore-ssl-errors=true ignoriert (duh) alle SSL-Fehler, einschließlich bösartiger Fehler.

151
JLarky

Das Problem ist höchstwahrscheinlich auf SSL-Zertifikatfehler zurückzuführen. Wenn Sie phantomjs mit der Option --ignore-ssl-errors = yes starten, sollten Sie die Seite so laden, wie dies ohne SSL-Fehler der Fall wäre:

phantomjs --ignore-ssl-errors=yes [phantomOptions] script.js [scriptOptions]

Ich habe gesehen, dass einige Websites Probleme mit der fehlerhaften Implementierung ihrer SSL-Zertifikate haben oder abgelaufen sind usw. Eine vollständige Liste der Befehlszeilenoptionen für Phantomjs finden Sie hier: http://phantomjs.org/api/command- line.html . Ich hoffe das hilft.

121
Cameron Tinker

Beachten Sie, dass PhantomJS ab 2014-10-16 standardmäßig SSLv3 zum Öffnen von HTTPS-Verbindungen verwendet. Aufgrund der kürzlich bekanntgegebenen POODLE-Schwachstelle deaktivieren viele Server die SSLv3-Unterstützung.

Um dies zu umgehen, sollten Sie PhantomJS ausführen können mit:

phantomjs --ssl-protocol=tlsv1

Hoffentlich wird PhantomJS bald aktualisiert, um TLSv1 anstelle von SSLv3 als Standard festzulegen.

71
Micah

erlebte das gleiche Problem ...
-- ignore-ssl-errors = yes war nicht genug, um das Problem zu beheben musste zwei weitere Dinge tun:
1) Benutzeragenten wechseln
2) versuchte alle ssl-Protokolle, der einzige, der funktionierte, war tlsv1 für die betreffende Seite
Hoffe das hilft...

24
Fred

Ich habe das gleiche Problem erlebt (casperjs 1.1.0-beta3/phantomjs 1.9.7). Mit --ignore-ssl-errors = yes und --ssl-protocol = tlsv1 wurde das Problem gelöst. Mit nur einer der Optionen konnte ich es nicht lösen.

15
Jojje

Ich erhielt 

Fehler beim Erstellen des SSL-Kontexts "von PhantomJS (läuft unter CentOS 6.6)

Das Bauen von der Quelle hat es für mich behoben. Vergessen Sie nicht, die Phantomjs zu verwenden, die Sie erstellt haben. (anstelle von/usr/local/bin/phantomjs, falls vorhanden)

Sudo yum -y install gcc gcc-c++ make flex bison gperf Ruby openssl-devel freetype-devel fontconfig-devel libicu-devel sqlite-devel libpng-devel libjpeg-devel
git clone git://github.com/ariya/phantomjs.git
cd phantomjs
git checkout 2.0
./build.sh
cd bin/
./phantomjs <your JS file>
1

Wenn jemand Phantomjs mit Sahi verwendet, muss die Option --ignore-ssl-errors in Ihre browser_types.xml-Datei aufgenommen werden. Es hat für mich funktioniert.

<browserType>
    <name>phantomjs</name>
    <displayName>PhantomJS</displayName>
    <icon>safari.png</icon>
    <path>/usr/local/Cellar/phantomjs/1.9.2/bin/phantomjs</path>
    <options>--ignore-ssl-errors=yes --debug=yes --proxy=localhost:9999 /usr/local/Cellar/phantomjs/phantom-sahi.js</options>
    <processName>"PhantomJS"</processName>
    <capacity>100</capacity>
    <force>true</force>
</browserType>
0
ctasca

Ich bekam gestern SSL Handshake Failed. Ich habe viele Kombinationen von PhantomJS-Optionen ausprobiert (--ignore-ssl-errors=yes usw.), aber keine davon hat funktioniert.

Ein Upgrade auf phantomJS 2.1.1 wurde behoben. 

Ich habe die Installationsanweisungen für phantomJS unter https://Gist.github.com/julionc/7476620 verwendet und die Version von phantomJS auf 2.1.1 geändert.

0
VikR

Was ist mit Shebang?

Wenn Sie Shebang zum Ausführen von phantomjs-Skripts verwenden, verwenden Sie die folgende Shebang-Zeile

#!/usr/bin/phantomjs --ignore-ssl-errors=yes

var system = require('system');
var webpage = require('webpage');

// ... rest of your script

Verwenden Sie eine der obigen Antworten. Ich persönlich mag --ignore-ssl-errors=yes, da es irrelevant ist, das selbst signierte Zertifikat meiner Loopback-Webserver zu überprüfen.

0
Jossef Harush

Führen Sie auf dem Computer, auf dem Sie versuchen, Phantomjs auszuführen, um eine Verbindung zu einem Remote-Server herzustellen, "OpenSL-Chiffren" aus. Kopieren Sie die aufgeführten Chiffren und fügen Sie sie in die Befehlszeilenoption --ssl-ciphers = "" ein. Dies teilt dem verbindenden Webserver mit, welche Chiffren zur Kommunikation mit Ihrem Client zur Verfügung stehen. Wenn Sie nicht die auf Ihrem eigenen Rechner verfügbaren festlegen, kann jede beliebige Chiffrierung verwendet werden, die Ihr Rechner nicht versteht, dass die Standard-Browser, die für die Standardeinstellung verwendet werden, nicht funktionieren.

0
Bobby Edge

Keine der anderen Antworten hat mir geholfen. Es kann sein, dass die spezifischen Sites, mit denen ich arbeitete, mit ihren HTTP-Headern zu wählerisch waren. Das hat funktioniert:

var page = webpage.create();
page.customHeaders = {
    "Connection": "keep-alive"
};

Ich fand heraus, dass PhantomJS "Keep Alive" (großgeschrieben) verwendete und die Verbindung nicht am Leben erhalten wurde. :)

0
JstnPwll