复制javascript以使用PHP向远程服务器发出请求/参数

时间:2011-04-22 17:11:00

标签: php javascript xmlhttprequest

我正在构建一个从各个站点获取html源代码的应用程序。 使用xpath或简单的html dom,我可以很容易地解析这个html并将它变成数据库等。

不幸的是,这种方法不适用于某个特定网站。 这是因为网站使用JavaScript加载其内容,因此其大部分内容在html源中不可见。

一遍又一遍地搜索,并在Stackoverflow上读取覆盖主题的大量线程。我仍然不确定如何解决这个问题。

以下是此网站用于显示其内容的代码的重要部分。

<script type="text/javascript" src="/jquery-1.3.2.min.js"></script>
<script>
    var example = {

        getServiceCall:function(url) {

     {
        var srtPos=url.indexOf('Filter');
        var endPos=url.indexOf('/',srtPos);
        var filter = $.getUrlVar("Filter");

        var filterInServiceUrl=url.slice(srtPos,endPos).split(":");

        url = (filter) 
            ? url.slice(0,srtPos) + filter + url.slice(endPos,url.length)
            : url.slice(0,srtPos) + filterInServiceUrl[1] + url.slice(endPos,url.length);
     }

      document.writeln('<scri'+'pt src="'+url+'" type="text/javascript"> </sc' + 'ript>');
    },

};

$.extend({
  getUrlVars: function(){
    var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
  },
  getUrlVar: function(name){

  }
});

</script>
<div id="content">
<script language="javascript" type="text/javascript">
function doPerItem(html){ $("#content").html(html.toString()); }
example.getServiceCall('http://www.example.com/?callback=doPerItem');
</script>
</div>

在Google Chrome中使用Inspect Element我可以看到有一个文件包含我想要的html源代码。

如何使用php为远程服务器发出相同的请求/参数,然后将响应保存到文件中?

然后,我将使用xpath或简单的html dom解析它,就像其他网站一样。

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我不知道任何解释JavaScript的基于PHP的远程访问工具(包括cURL)。 Selenium(通常用于测试)可能会这样做,但Selenium-RC根本不适用于PHP,并且在IDE中存在错误。

你实际上不能使用Ajax,因为它也不能解析JavaScript(也许你可以用eval()以某种方式解决它有安全问题),而JSONP只有在远程服务器故意提供API时才能工作获取数据(您可以编写自己的代理,然后将数据作为JSONP提供,但是您仍然有解决JavaScript的问题)。

您可以为您的网站做什么(虽然它有真正的安全风险):

  1. 使用file_get_contents()在PHP中编写一个简单获取远程站点内容的文件,然后输出它(即创建代理)。
  2. 通过JavaScript动态插入隐藏的iframe以加载代理页面,然后等待iframe的加载事件。
  3. 从父级获取隐藏iframe的结果HTML,并将结果发送回服务器。
  4. 不幸的是,您无法避免步骤1,因为除非来自与您相同的域,否则您无法收听iframe。

    请注意,如果您访问的网站以某种方式制作他们的JavaScript,他们可以访问您的包含HTML,并执行诸如获取用户的Cookie以窃取密码,查找您的域或页面上显示的内容等操作等等。

    可能有更好的解决方案,但我不知道。