有没有办法(在 Javascript 中)下载远程网站(即像 Curl 一样),将其读入字符串变量并进一步处理它?
4 回答
根据同源策略,您只能从同一个域下载文件。不过,您可以使用 XMLHTTPRequest 对象从同一域下载内容:
var xhReq = createXMLHttpRequest();
xhReq.open("GET", "page.html", true);
xhReq.onreadystatechange = onResponse;
xhReq.send(null);
...
function onResponse() {
if (xhReq.readyState != 4) { return; }
var serverResponse = xhReq.responseText;
...
}
有一些方法可以规避该政策,其中一些方法列在同一个维基百科页面中。但这充其量是一种黑客行为,最坏的情况是非法的。
当然- url 必须来自同一个域,除非 url 具有跨域策略或您创建服务器端代理脚本。
以下代码是通过代理 PHP 脚本对任何域进行 ajax 调用的示例:
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("POST","http://localhost/proxy.php?url=http://google.com", true);
xmlhttp.onreadystatechange = function() {
if (request.readyState == 4 && request.status == 200) {
// ensure we have a response...
if (xmlhttp.responseText) {
var html = xmlhttp.responseText;
// do your processing here...
}
}
};
xmlhttp.send();
然后,您将使您的 proxy.php 脚本通过 Curl(或您的服务器端语言具有的任何 url 库)连接到给定的 url,然后简单地回显来自您的域的内容......
<?php
// proxy.php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$_GET["url"]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
$result=curl_exec ($ch);
curl_close ($ch);
echo $result;
?>
希望一切都说得通。
您可以使用Yahoo Query Language查询网络上的任何页面。
例如,如果您想要Google主页的完整源代码,您可以使用:
select * from html where url="http://google.com" and xpath='/html' limit 1
您必须使用他们的 JSON 回调并重新序列化返回的对象,但您将能够获得页面的完整视图。
大多数情况下你不会被允许的。出于安全原因,Javascript 会阻止您这样做。但是,您可以使用 jQuery 从其他域请求 json 数据。这是 jquery docs 中的一个示例,该示例从 flickr 获取了一些猫图片...
$.getJSON("http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&tagmode=any&format=json&jsoncallback=?",
function(data){
$.each(data.items, function(i,item){
$("<img/>").attr("src", item.media.m).appendTo("#images");
if ( i == 4 ) return false;
});
});
您可以在jQuery Docs中找到此代码。如您所见,这会发出请求,取回数据并使用猫图片更新 DOM 中的一些图像标签......