Holen Sie sich HTML-Inhalte von einer anderen Site

Lesezeit: 5 Minuten

Holen Sie sich HTML Inhalte von einer anderen Site
Souza

Ich möchte die HTML-Inhalte von einer anderen Website dynamisch abrufen, ich habe die Erlaubnis des Unternehmens.

Bitte verweisen Sie mich nicht auf JSONP, da ich Site A nicht bearbeiten kann, nur Site B

  • definieren permission of the company. Das bedeutet nichts, es sei denn, sie senden Access-Control-Allow-Origin Header

    – Esailija

    11. Juli ’12 um 18:19

  • Verwenden Sie eine serverseitige Sprache? Sie können die Seite in Ihrer serverseitigen Sprache abrufen und diese dann auf Ihrer Seite anzeigen.

    – Stefan H

    11. Juli ’12 um 18:20

  • Es ist eine Reederei, sie hat keine API, daher haben sie uns erlaubt, die Abfrage index.php?trackingnumber=xxxxx zu verwenden.

    – Souza

    11. Juli ’12 um 18:20

  • Haben Sie Zugriff auf eine serverseitige Sprache? Wenn ja, welcher? Leider müssen Sie eine serverseitige Lösung verwenden, da die domänenübergreifende Sicherheit alle Bemühungen zum Abrufen von Daten von einer Remotedomäne vereitelt. JSONP ist auch nicht geeignet, da die Rückgabedaten HTML und nicht Javascript sind. Ihr einziger Weg hier ist serverseitig oder iframes, und letzteres ist wahrscheinlich nicht ausreichend.

    – Chris Baker

    11. Juli ’12 um 18:23

  • @StefanH Ich verwende die serverseitige Sprache, PHP, wie würde ich es tun?

    – Souza

    11. Juli ’12 um 18:36

Holen Sie sich HTML Inhalte von einer anderen Site
Chris Baker

Aufgrund von domänenübergreifenden Sicherheitsproblemen können Sie dies nicht clientseitig tun, es sei denn, Sie sind mit einem zufrieden iframe.

Mit PHP können Sie verschiedene Methoden zum “Scraping” des Inhalts verwenden. Welche Vorgehensweise Sie verwenden, hängt davon ab, ob Sie in Ihren Anfragen Cookies verwenden müssen (dh die Daten befinden sich hinter einem Login).

So oder so, um die Dinge auf der Client-Seite zu beginnen, senden Sie eine Standard-AJAX-Anfrage an Ihr eigener Server:

$.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!
});

Wenn Sie Cookies setzen müssen (wenn die Remote-Site eine Anmeldung erfordert, benötigen Sie diese), verwenden Sie cURL. Der vollständige Mechanismus des Anmeldens mit Post-Daten und des Akzeptierens von Cookies würde den Rahmen dieser Antwort etwas sprengen, aber Ihre Anfragen würden in etwa so aussehen:

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

An diesem Punkt können Sie die $result variabel und stellen Sie sicher, dass die Anmeldung funktioniert hat. Wenn ja, würden Sie cURL verwenden, um auszugeben Ein weiterer Aufforderung zum Abrufen des Seiteninhalts. Die zweite Anfrage enthält nicht den gesamten Post-Junk und Sie verwenden die URL, die Sie abrufen möchten. Sie würden mit einem großen String voller HTML enden.

Wenn Sie nur einen Teil des Inhalts dieser Seite benötigen, können Sie die folgende Methode verwenden, um die Zeichenfolge in ein DomDocument zu laden loadHTML Methode statt loadHTMLFile (siehe unten)

Apropos DomDocument, wenn Sie nicht Cookies benötigen, können Sie DomDocument direkt verwenden, um die Seite abzurufen, und cURL überspringen:

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

Dokumentation

  • Vielen Dank für die sehr gut erklärte Antwort :), hochgestimmt! Über den DOMDocument-Teil, den ich verwende, denke ich, dass er nicht funktioniert und dies der Ansatz ist, den ich bevorzuge. Die Seite sagt nur auf dem Titel “Objekt verschoben” (ich habe versucht echo $doc->saveHTML() zu setzen; hat nicht funktioniert) iloja.pt/ajaxload/urbanosapi.php

    – Souza

    11. Juli ’12 um 19:29

  • Dies zeigt an, dass die Website des Drittanbieters dies als Reaktion auf Ihre Anfrage zurückgibt. Versuchen Sie hinzuzufügen die($url) kurz vor deinem loadHTMLFile Rufen Sie auf, um genau zu debuggen, welche URL verwendet wird, kopieren Sie diese URL und fügen Sie sie direkt in den Browser ein und überprüfen Sie, ob Sie tatsächlich den erwarteten Inhalt erhalten.

    – Chris Baker

    11. Juli ’12 um 19:35

  • Chris, dies ist die URL, die ausgedruckt wird: expresso.urbanos.com/public/?ns=9000014294991

    – Souza

    11. Juli ’12 um 19:39

  • Das Problem liegt im Code, der versucht, die html und body Stichworte. Ich habe den Code aktualisiert … wenn Sie einen Teil der Site verwenden (z. B. ein bestimmtes div nehmen und einfach diesen HTML-Code verwenden), müssen Sie sich um diesen Teil überhaupt keine Sorgen machen. Wenn Sie alles verwenden möchten, müssen Sie den Code eingeben, der versucht, den Inhalt des Hauptteils zu extrahieren. Denk dran, DomDocument funktioniert sehr ähnlich wie die DOM-Manipulation von Javascript, also wenn Sie es in Javascript tun, können Sie es dort tun.

    – Chris Baker

    11. Juli ’12 um 19:49


  • Hey Chris, vielen Dank für das schnelle Feedback. Leider denke ich, dass das Problem jetzt ein anderes ist: 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

    – Souza

    11. Juli ’12 um 19:53


.

213240cookie-checkHolen Sie sich HTML-Inhalte von einer anderen Site

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy