Представьте Firefox вместо Phantom.js

Когда я пытаюсь отменить этот сайт с помощью 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".

Я прочитал в Справочник API Phantomjs, что для имитации запроса, поступающего из какого-либо другого браузера, я должен изменить значение User-Agent. В Википедии я нашел значение, которое я должен использовать для того, чтобы притворяться Firefox под Ubuntu:

'name': 'User-Agent',
'value': 'Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:16.0) Gecko/20120815 Firefox/16.0'

В какой части Phantomjs я должен поместить эти свойства? Где я должен вставлять их - внутри page.open или внутри page.evaluate или вверху?

Ответы

Ответ 1

На самом деле, на 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" )


О вашем комментарии, на самом деле вы можете использовать jquery под phantomjs! Проверьте этот пример:

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.