直接抓取Ajax.request网址...权限错误

时间:2009-02-07 07:10:46

标签: ajax url request hostname

我需要抓取一个网页,它使用ajax进行动态更新/隐藏/显示评论,而无需重新加载相应的帖子。 我被这个评论区域阻止了。

在Ajax.request中,使用不带主机名的路径指定url,如下所示:

new Ajax(**'/bbs/comment_db/load.php'**, {
    update       : $('comment_result'), 
    evalScripts  : true, 
    method       : 'post', 
    data         : 'id=work_gallery&no=i7dg&sno='+npage+'&spl='+splno+'&mno='+cmx+'&ksearch='+$('ksearch').value,
    onComplete   : function() {
        $('cmt_spinner').setStyle('display','none');  
        try { 
            $('cpn'+npage).setStyle('fontWeight','bold'); 
            $('cpf'+npage).setStyle('fontWeight','bold');
        } catch(err) {} 
    }
}).request();

如果我尝试使用完整的主机名访问该网址 我刚收到消息:“权限错误”:

new Ajax(**'http://host.name.com/bbs/comment_db/load.php'**, {
    update      : $('comment_result'), 
    evalScripts : true, 
    method      : 'post', 
    data        : 'id=work_gallery&no=i7dg&sno='+npage+'&spl='+splno+'&mno='+cmx+'&ksearch='+$('ksearch').value,
    onComplete  : function() {
        $('cmt_spinner').setStyle('display','none');  
        try { 
            $('cpn'+npage).setStyle('fontWeight','bold'); 
            $('cpf'+npage).setStyle('fontWeight','bold');
        } catch(err) {} 
    }
}).request();

会导致同样的错误。

即使我在网络浏览器中调用实际的php网址,这也是一样的: http://host.name.com/bbs/comment_db/load.php 'ID = work_gallery&安培; ..'?

我想php模块被限制为在同一主机中被url调用。

是否有抓取此数据的想法?

提前致谢。

- Shin

4 个答案:

答案 0 :(得分:1)

大多数浏览器都禁止跨站点XMLHttpRequest。如果要对不同的站点进行爬网,则需要在服务器端脚本中执行此操作。

答案 1 :(得分:1)

正如darin所提到的,XMLHttpRequest对象(这是Ajax请求的本质)对调用跨站点HTTP请求有安全限制,我相信它被称为“JavaScript的同源策略”。

虽然W3C中有一个工作组提出了新的Access Control for Cross-Site Requests recommendation,但限制仍然适用于大多数主流浏览器。

我在Mozilla Developer Network上找到了一些可能提供更好解释的信息。

在您的情况下,您似乎正在使用Prototype JavaScript框架,其中Ajax.Request仍然使用XMLHttpRequest对象来处理其Ajax请求。

答案 2 :(得分:0)

method:'post'

可能是您的问题:提供请求的主机可能会拒绝get个请求,这是您可以从浏览器地址栏中获取的所有请求。如果这是正在发生的事情,你需要找到或安装某种能够完成工作的脚本工具(perl将是我的选择,除非你运行Windows,否则你已经拥有了它。)

我不得不怀疑你尝试做的事情是否合法:通常不鼓励拖网其他网站的评论数据库。

答案 3 :(得分:0)

我会通过在本地运行PHP脚本来解决这个问题,该脚本将从外部页面进行爬网。这样jQuery就不必去外部域了。