phantomjs page.evaluate从http://www.google.com/search?q=site:%获取“resultStats”在本地服务器但不在生产服务器中工作

时间:2014-01-31 21:32:17

标签: screen-scraping phantomjs

使用 phantomjs page.evaluate从http://www.google.com/search/?q=site:%s中提取“resultStats”(div id)在我的本地服务器上运行,但不在生产服务器上运行。

注意:我正在使用最新的phantomjs 1.9.7,但我遇到了与之前版本1.9.6相同的问题

注意:Phantomjs page.render(在Google主页上以及任何其他域名)正在两台服务器上运行并创建精美的屏幕截图。

在我的生产服务器(Debian stable 7.3 @ linode.com)上面的顶级域名的PHP代码为“$ url”返回:

  

TypeError:'null'不是对象(评估'document.getElementById('resultStats')。textContent')phantomjs://webpage.evaluate():2 phantomjs://webpage.evaluate():3 phantomjs ://webpage.evaluate():3 null

在我的本地服务器上(debian测试)下面的PHP代码返回相同的“$ url”:

  

大约43个结果

这种情况发生在我用作参数的任何域名/网址上 - 我已经测试了几十个。

在我的远程生产服务器而不是我的本地服务器中可能会出现什么情况?

gsiteindex.js

var page = require('webpage').create(), site;
var site = phantom.args[0]; 
page.open("https://www.google.com/search?q=site:" + site, function (status) {     
  var result = page.evaluate(function () {
    return document.getElementById('resultStats').textContent;
  }); 
  console.info(result);
  phantom.exit();
});

.PHP

$phantomjs = "phantomjs";
$script = "gsiteindex.js";
$site = $url;   
$command = "$phantomjs $script $site";
$googlestring = shell_exec($command);
echo $googlestring;
die();

2 个答案:

答案 0 :(得分:0)

好吧,nrabinowitz是对的。我在自己的服务器上使用代理进行了更多的测试,大部分超时,有些返回了上面的错误,并且有几个返回了正确的结果(我认为它们是正确的,基于代理的IP地址的位置 - 因为数字是一个与使用我的ISP公共IP地址(加利福尼亚州,美国)略有不同。)

所以这只是谷歌阻止来自某些IP地址的某些类型的请求。

再次感谢您的评论。

答案 1 :(得分:0)

例如带有用户代理的Inleude标头

  

header = {'user-asgent':'Mozilla / 5.0(Windows NT 10.0; Win64; x64;   rv:68.0)Gecko / 20100101 Firefox / 68.0'}

使用用户代理,您将获得没有resultStats的google gefault样式页面,也出现了此问题,并且添加了标头也有帮助

默认的Google搜索页如下所示 enter image description here