当我尝试用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"}
而且我获得了405“不允许”的回应.
我在Phantomjs API Reference中阅读,为了模仿一些其他浏览器的请求,我应该更改我的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里面,还是在其顶部?
解决方法
其实是在page.settings.在开放前做
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,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.