3

会社の許可を得て、別の Web サイトから html コンテンツを動的に取得したいと考えています。

サイト A は編集できず、サイト B しか編集できないため、JSONP を指定しないでください。

4

1 に答える 1

6

クロスドメインセキュリティの問題があるため、に満足していない限り、このクライアント側で実行することはできません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を設定する必要がある場合(リモートサイトにログインが必要な場合は、'emが必要です)、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を使用して、ページコンテンツを取得するための別のリクエストを発行します。2番目のリクエストにはすべての投稿ジャンクが含まれるわけではなく、フェッチしようとしているURLを使用します。HTMLでいっぱいの大きな文字列になってしまいます。

そのページのコンテンツの一部のみが必要な場合は、以下のメソッドを使用して文字列をDomDocumentにロードし、loadHTML代わりにこのメソッドを使用できますloadHTMLFile(以下を参照)。

DomDocumentと言えば、 Cookieが必要ない場合は、cURLをスキップして、DomDocumentを直接使用してページを取得できます。

$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());

ドキュメンテーション

于 2012-07-11T19:09:32.807 に答える