【问题标题】:Get HTML content from another site从另一个站点获取 HTML 内容
【发布时间】:2012-07-11 10:30:14
【问题描述】:

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

请不要将我指向 JSONP,因为我无法编辑站点 A,只能编辑站点 B

【问题讨论】:

  • 定义permission of the company。除非他们发送 Access-Control-Allow-Origin 标头,否则这意味着什么
  • 您使用服务器端语言吗?您可以使用服务器端语言获取页面,然后将其显示在您的页面上。
  • 这是一家航运公司,他们没有 API,所以他们允许我们使用 index.php?trackingnumber=xxxxx 查询。
  • 您可以访问任何服务器端语言吗?如果有,是哪一个?不幸的是,您将需要使用服务器端解决方案,因为跨域安全性将阻碍从远程域检索数据的任何努力。 JSONP 也不合适,因为返回数据将是 HTML,而不是 javascript。您在这里唯一的路线是服务器端或 iframe,后者可能不够用。
  • @StefanH 我确实使用服务器端语言 php,我将如何使用它?

标签: javascript jquery html ajax


【解决方案1】:

由于跨域安全问题,您将无法在客户端执行此操作,除非您对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!
});

如果您需要设置 cookie(如果远程站点需要登录,则需要它们),您将使用 cURL。使用发布数据登录和接受 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 发出 another 请求以获取页面内容。第二个请求不会包含所有帖子垃圾,您将使用您尝试获取的 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());

文档

【讨论】:

  • 非常感谢您提供了很好解释的答案:),投了赞成票!关于我正在使用的 DOMDocument 部分,我认为它不起作用,这是我更喜欢的方法。该页面仅在标题“对象已移动”上显示(我尝试输入 echo $doc->saveHTML(); 无效)iloja.pt/ajaxload/urbanosapi.php
  • 这表明第三方网站正在返回该信息以响应您的请求。尝试在您的 loadHTMLFile 调用之前添加 die($url) 以准确调试正在使用的 URL,然后将该 URL 直接复制粘贴到浏览器中并验证您确实获得了您期望的内容。
  • 克里斯,这是打印出来的 URL:expresso.urbanos.com/public/?ns=9000014294991
  • 问题出在试图删除htmlbody 标记的代码中。我已经更新了代码...如果您要使用网站的一部分(例如您抓取某个 div 并只使用该 HTML),那么您根本不需要担心那部分。如果你打算使用它,你需要拨入试图提取正文内容的代码。请记住,DomDocument 的工作方式非常类似于 javascript 的 DOM 操作,所以如果您使用 javascript 进行操作,您可以在那里进行操作。
  • 嗨,克里斯,非常感谢您提供的所有快速反馈。不幸的是,我认为现在的问题是另一个问题:Warning: DOMDocument::saveHTML() [domdocument.savehtml]: output conversion failed due to conv error, bytes 0x88 0xE4 0x61 0x09 in /home/iloja/public_html/ajaxload/urbanosapi.php on line 13
猜你喜欢
  • 1970-01-01
  • 2012-04-23
  • 2014-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-15
  • 1970-01-01
  • 2015-05-02
相关资源
最近更新 更多