我需要抓取一个网页,它使用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
答案 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就不必去外部域了。