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 Reference中读到,为了模仿来自其他浏览器的请求,我应该更改我的 User-Agent 值。在 Wikipedia 上,我找到了在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 回答