更新:請參閱下面的答案編輯
我真的不認爲
PhantomJS無法處理頁面
這可能是我們做得不夠好的模仿真正的瀏覽器
快速搜索「的Instagram登錄phantomjs」發現這個整潔的解決方案,工作:https://github.com/awener/instagram-login-phantomjs/blob/master/phan.js
它採用模擬「實際」按鍵和點擊PhantomJS機制。
這是腳本的一個副本,以防萬一。
var page = require('webpage').create();
var username = "myusername";
var password = "password";
page.viewportSize = { width: 1024 , height: 600 };
page.settings.userAgent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36';
page.open('https:/instagram.com/accounts/login/', function() {
var ig = page.evaluate(function() {
function getCoords(box) {
return {
x: box.left,
y: box.top
};
}
function getPosition(type, name) {
// find fields to fill
var input = document.getElementsByTagName(type);
for(var i = 0; i < input.length; i++) {
if(name && input[i].name == name) return getCoords(input[i].getBoundingClientRect());
else if(!name && input[i].className) return getCoords(input[i].getBoundingClientRect()); // this is for login button
}
}
return {
user: getPosition('input', 'username'),
pass: getPosition('input', 'password'),
login: getPosition('button')
};
});
// fill in data and press login
page.sendEvent('click',ig.user.x, ig.user.y);
page.sendEvent('keypress', username);
page.sendEvent('click',ig.pass.x, ig.pass.y);
page.sendEvent('keypress', password);
page.sendEvent('click', ig.login.x, ig.login.y);
// wait for response
setTimeout(function() {
page.render('/path/to/screenshot.png');
phantom.exit();
}, 5000);
});
編輯就如何在Linux
運行腳本,這並沒有在Debian/Ubuntu的工作的原因解釋是SSL證書問題。
當您使用--debug = true CLI選項運行PhantomJS時,有一個詳細的模式告訴PhantomJS正在做什麼。使用我已經找到了問題的原因:
[DEBUG] Network - SSL Error: "The issuer certificate of a locally looked up certificate could not be found"
[DEBUG] Network - SSL Error: "The root CA certificate is not trusted for this purpose"
[DEBUG] Network - Resource request error: QNetworkReply::NetworkError(SslHandshakeFailedError) ("SSL handshake failed") URL: "https://instagramstatic-a.akamaihd.net/h1/scripts/polyfills/es5-sham.min.js/fc3c22cf2d67.js"
...
爲了避免這種類型的問題,你只需要與其他CLI參數運行Phantomjs告訴它忽略SSL錯誤:
/pth/to/phantomjs --ignore-ssl-errors=true /path/to/script.js
有你正確設置標題和憑據?最重要的是 - 所有這些查詢選擇器在網頁的上下文中? – marmeladze
你所做的是正確的,這個問題超出了所提供代碼的範圍。 – superhero
您是否找到解決問題的方法?我一直面臨同樣的問題,但找不到解決方案。 –