Притворитесь 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, или вверху?


person khex    schedule 19.08.2013    source источник


Ответы (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.

person chris-l    schedule 20.08.2013
comment
большое спасибо, трудно играть с getElementsByClassName после jQuery › sizzle - person khex; 20.08.2013
comment
@khaljava О, но вы можете использовать jquery под phantomjs, я просто не делал этого, чтобы упростить задачу. Проверьте обновленный ответ. - person chris-l; 20.08.2013
comment
на некоторых веб-сайтах есть способ обнаружить PhantomJS, даже если вы устанавливаете заголовки, они возвращают ошибку или пустой экран. Если я открою их в Chrome, все в порядке. Интересно, есть ли способ справиться с этим - person Toolkit; 27.03.2017
comment
@Toolkit скажи мне один из этих сайтов. Они могут использовать отпечаток браузера, оценивая объект navigator javascript и другие. Я предлагаю вам использовать Selenium + Headless Chrome (используя флаг --headless в chromeOptions) - person m3nda; 25.01.2020