Web scraping 假装Firefox而不是Phantom.js

Web scraping 假装Firefox而不是Phantom.js,web-scraping,phantomjs,user-agent,http-status-code-405,Web Scraping,Phantomjs,User Agent,Http Status Code 405,当我尝试使用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“不允许”响应 我在《PhantomJSAPI参考》中读到,为了模拟来自其他浏览器的请求,我应该更改我的用户代

当我尝试使用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“不允许”
响应

我在《PhantomJSAPI参考》中读到,为了模拟来自其他浏览器的请求,我应该更改我的用户代理值。在维基百科上,我在Ubuntu下找到了伪装成Firefox的值:

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

我应该把这些属性放在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() {
        var output = page.evaluate(function() {
            return document.getElementById('tournamentTable')
           .getElementsByClassName('deactivate')[0]
           .getElementsByTagName('a')[0]
           .textContent;
        });
        console.log(output);
    }, 1000);
});
本例将删除表第一行中的匹配名称。(此时此刻正是“旧金山巨人队-波士顿红袜队”


关于你的评论,实际上你可以在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);
});

顺便说一句,为了等待,我建议您不要使用我在本例中使用的
窗口.setTimeout

非常感谢,在jQuery>sizzle@khaljava哦,但是你可以在phantomjs下使用jquery,我这样做不是为了保持简单。检查更新后的答案。有些网站有办法检测PhantomJ,即使你设置了标题,它们也会返回错误或空白屏幕。如果我用Chrome打开它们,一切都很好。我想知道有没有办法处理这个问题it@Toolkit告诉我其中一个网站。他们可以使用浏览器指纹,评估javascript的对象
navigator
等。我建议您使用Selenium+Headless Chrome(在chromeOptions中使用标志
--Headless