web-dev-qa-db-ja.com

Phantom.jsの代わりにFirefoxのふりをする

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、またはその上部にありますか?

18
khex

実際には、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 を使用することをお勧めします。

21
chris-l