假装Firefox而不是Phantom.js

时间:2013-08-19 22:27:42

标签: web-scraping phantomjs user-agent http-status-code-405

当我尝试使用Phantomjs废弃this site时,默认情况下,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 内,或在其顶部?

1 个答案:

答案 0 :(得分:21)

实际上,是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