Javascript 从其他站点获取HTML内容

Javascript 从其他站点获取HTML内容,javascript,jquery,html,ajax,Javascript,Jquery,Html,Ajax,我想动态检索其他网站的html内容,我有该公司的许可 请不要将我指向JSONP,因为我无法编辑站点A,只有站点B,因为跨域安全问题,您将无法在客户端执行此操作,除非您满足于iframe 有了PHP,您可以使用几种“刮取”内容的方法。您使用的方法取决于您是否需要在请求中使用cookie(即,数据在登录后) 无论哪种方式,要在客户端启动,您将向自己的服务器发出一个标准AJAX请求: $.ajax({ type: "POST", url: "localProxy.php", data: {

我想动态检索其他网站的html内容,我有该公司的许可


请不要将我指向JSONP,因为我无法编辑站点A,只有站点B,因为跨域安全问题,您将无法在客户端执行此操作,除非您满足于
iframe

有了PHP,您可以使用几种“刮取”内容的方法。您使用的方法取决于您是否需要在请求中使用cookie(即,数据在登录后)

无论哪种方式,要在客户端启动,您将向自己的服务器发出一个标准AJAX请求:

$.ajax({
  type: "POST",
  url: "localProxy.php",
  data: {url: "maybe_send_your_url_here.php?product_id=1"}
}).done(function( html ) {
   // do something with your HTML!
});
如果您需要设置cookies(如果远程站点需要登录,您需要它们),您将使用cURL。使用post数据登录和接受Cookie的完整机制稍微超出了此答案的范围,但您的请求看起来是这样的:

$ch = curl_init(); 
curl_setopt ($ch, CURLOPT_URL, 'http://thirdpartydomain.internet/login_url.php'); 
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6"); 
curl_setopt ($ch, CURLOPT_TIMEOUT, 60); 
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 0); 
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt ($ch, CURLOPT_COOKIEJAR, 'cookie.jar'); 
curl_setopt ($ch, CURLOPT_POSTFIELDS, 'email='.$username.'&password='.$password); 
curl_setopt ($ch, CURLOPT_POST, 1); 
$result = curl_exec ($ch); 
curl_close($ch);
此时,您可以检查
$result
变量并确保登录工作正常。如果是这样,那么您将使用cURL发出另一个请求来获取页面内容。第二个请求不会包含所有的post垃圾,您将使用您试图获取的URL。你会得到一个很大的字符串,里面满是HTML

如果您只需要该页面内容的一部分,可以使用下面的方法将字符串加载到DomDocument中,请使用
loadHTML
方法而不是
loadHTMLFile
(请参见下文)

说到DomDocument,如果您不需要cookies,那么您可以直接使用DomDocument获取页面,跳过cURL:

$doc = new DOMDocument('1.0', 'UTF-8');
// load the string into the DOM (this is your page's HTML), see below for more info
$doc->loadHTMLFile ('http://third_party_url_here.php?query=string');

// since we are working with HTML fragments here, remove <!DOCTYPE 
$doc->removeChild($doc->firstChild);            

// remove <html></html> and any junk
$body = $doc->getElementsByTagName('body'); 
$doc->replaceChild($body->item(0), $doc->firstChild);

// now, you can get any portion of the html (target a div, for example) using familiar DOM methods

// echo the HTML (or desired portion thereof)
die($doc->saveHTML());
$doc=新的DOMDocument('1.0','UTF-8');
//将字符串加载到DOM中(这是页面的HTML),请参见下面的详细信息
$doc->loadHTMLFile($doc)http://third_party_url_here.php?query=string');
//因为我们在这里处理HTML片段,所以删除removeChild($doc->firstChild);
//清除所有垃圾
$body=$doc->getElementsByTagName('body');
$doc->replaceChild($body->item(0),$doc->firstChild);
//现在,您可以使用熟悉的DOM方法获取html的任何部分(例如,以div为目标)
//回显HTML(或其所需部分)
模具($doc->saveHTML());
文档

  • MDN上的HTML
    iframe
  • jQuery.ajax()
    -
  • PHP的
    cURL
    -
  • Curl::set_opt
    (有关使用cookies的信息)——
  • PHP的
    DomDocument
    -
  • DomDocument::loadHTMLFile
    -
  • DomDocument::loadHTML
    -

定义公司的
权限
。这意味着什么都没有,除非他们发送
Access Control Allow Origin
header您使用服务器端语言吗?您可以使用服务器端语言获取页面,然后将其显示在页面上。这是一家运输公司,他们没有API,因此他们允许我们使用index.php?trackingnumber=xxxxx查询。您可以访问任何服务器端语言吗?如果是,哪一个?不幸的是,您将需要使用服务器端解决方案,因为跨域安全性将阻碍从远程域检索数据的任何努力。JSONP也不合适,因为返回的数据将是HTML,而不是javascript。您在这里的唯一路线是服务器端或iFrame,后者可能不够。@StefanH我确实使用服务器端语言php,我如何使用它?非常感谢您解释得非常清楚的答案:),向上投票!关于我正在使用的DOMDocument部分,我认为它不起作用,这是我更喜欢的方法。该页面仅在标题“Object moved”(我试图放置echo$doc->saveHTML();无效)上显示,这表明第三方网站正在返回该内容以响应您的请求。尝试在调用
loadHTMLFile
之前添加
die($url)
,以准确调试正在使用的url,然后将该url直接复制粘贴到浏览器中,并验证您确实获得了预期的内容。Chris,这是正在打印的URL:问题出在试图删除
html
body
标记的代码中。我已经更新了代码。。。如果你打算使用网站的一大块内容(比如你抓取一个特定的div,然后只使用那个HTML),那么你根本不需要担心这个部分。如果你打算全部使用它,你需要拨入试图提取身体内容的代码。请记住,
DomDocument
的工作原理非常类似于javascript的DOM操作,因此如果您使用javascript进行操作,您可以在那里进行操作。嘿,克里斯,非常感谢您的快速反馈。不幸的是,我认为现在的问题是另一个:
警告:DOMDocument::saveHTML()[DOMDocument.saveHTML]:由于conv错误,输出转换失败,第13行的/home/iloja/public_html/ajaxload/urbanosapi.php中的字节0x88 0xE4 0x61 0x09