假装使用Firefox而不是Phantom.js

19

当我使用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"}

我得到了状态码405 "不允许"的响应。

我在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个回答

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);
});

顺便说一下,在等待方面,建议您使用waitfor.js代替我在这些示例中使用的window.setTimeout


非常感谢,使用jQuery > sizzle后,使用getElementsByClassName很困难。 - khex
2
@khaljava哦,但是你可以在phantomjs下使用jquery,我只是为了保持简单而没有这样做。请查看更新后的答案。 - chris-l
2
有些网站即使你设置了头部信息,也可以检测到PhantomJS,它们会返回错误或空白屏幕。如果我在Chrome中打开它们,一切都正常。我想知道是否有办法解决这个问题。 - Toolkit
@Toolkit 告诉我其中一个这样的网站。它们可能使用浏览器指纹,评估JavaScript的对象navigator和其他内容。我建议您使用Selenium + Headless Chrome(使用标志--headless,在chromeOptions中)。 - m3nda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接