18

このサイトを 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 のどの部分に配置すればよいですか? それらをどこに挿入する必要がありますか? page.open内、または page.evaluate 内またはその上部?

4

1 に答える 1

22

実際、オンになってい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を使用することをお勧めします。

于 2013-08-20T00:18:50.290 に答える