0

我需要抓取一个网络板,它使用 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();

如果我尝试使用完整的主机名访问 url,那么我只会收到消息:“Permission Error”:

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 url,这也是一样的:http: //host.name.com/bbs/comment_db/load.php ?'id=work_gallery&..'

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

抓取这些数据的任何想法?

提前致谢。

——辛

4

4 回答 4

1

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

于 2009-02-07T09:41:35.033 回答
1

As mentioned by darin, the XMLHttpRequest Object (which is the essence of Ajax requests) has security restrictions on calling cross-site HTTP requests, I believe its called the "Same Origin Policy for JavaScript".

While there is a working group within the W3C who have proposed new Access Control for Cross-Site Requests recommendation the restriction still remains in effect for most mainstream browsers.

I found some information on the Mozilla Developer Network that may provide a better explanation.

In your case, it appears that you are using the Prototype JavaScript framework, where Ajax.Request still uses the XMLHttpRequest object for its Ajax requests.

于 2009-02-08T09:44:51.173 回答
0
method:'post'

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

不过,我确实想知道您尝试做的是否合法:通常不鼓励搜索其他网站的评论数据库。

于 2009-02-07T07:59:58.983 回答
0

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

于 2010-10-04T00:54:48.793 回答