Phantomjsで このサイト をスクラップしようとすると、デフォルトで、Phantomjsは次のヘッダーをサーバーに送信します。
"name":"User-Agent",
"value":"Mozilla/5.0 (Unknown; Linux i686) AppleWebKit/534.34 (KHTML, like Gecko) PhantomJS/1.9.1 Safari/534.34"}
そして、私はstatus 405 "Not Allowed"
応答を受け取ります。
Phantomjs APIリファレンスで、他のブラウザからのリクエストを模倣するには、User-Agentの値を変更する必要があることを読みました。ウィキペディアで、Ubuntuの下にあるFirefoxのふりをするために使用する必要がある値を見つけました-):
'name': 'User-Agent',
'value': 'Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:16.0) Gecko/20120815 Firefox/16.0'
Phantomjsのどの部分にこのプロパティを配置する必要がありますか?それらをどこに挿入すればよいですか-insidepage.open、またはinsidepage.evaluate、またはその上部にありますか?
実際には、page.settings
にあります。 open
の前に実行してください。
リンクしたそのページに対してそれを使用する例を次に示します。
var page = require('webpage').create();
page.settings.userAgent = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.71 Safari/537.36';
page.open('http://www.oddsportal.com/baseball/usa/mlb/results/page/', function() {
window.setTimeout(function() {
var output = page.evaluate(function() {
return document.getElementById('tournamentTable')
.getElementsByClassName('deactivate')[0]
.getElementsByTagName('a')[0]
.textContent;
});
console.log(output);
}, 1000);
});
この例では、テーブルの最初の行の一致名をスクレイプします。 (これは、この正確な瞬間に「San Francisco Giants - Boston Red Sox
」です)
コメントについては、実際にはphantomjsでjqueryを使用できます。この例を確認してください。
var page = require('webpage').create();
page.settings.userAgent = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.71 Safari/537.36';
page.open('http://www.oddsportal.com/baseball/usa/mlb/results/page/', function() {
window.setTimeout(function() {
page.includeJs("http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js", function() {
var output = page.evaluate(function () {
return jQuery('#tournamentTable .deactivate:first a:first').text();
});
console.log(output);
});
}, 1000);
});
ちなみに、待機する場合は、この例で使用したwindow.setTimeout
の代わりに、 waitfor.js を使用することをお勧めします。