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
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
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
iframe
auf MDN – https://developer.mozilla.org/en/HTML/Element/iframejQuery.ajax()
– http://api.jquery.com/jQuery.ajax/cURL
– http://php.net/manual/en/book.curl.phpCurl::set_opt
(Informationen über die Verwendung von Cookies) – http://www.php.net/manual/en/function.curl-setopt.phpDomDocument
– http://php.net/manual/en/class.domdocument.phpDomDocument::loadHTMLFile
– http://www.php.net/manual/en/domdocument.loadhtmlfile.phpDomDocument::loadHTML
– http://www.php.net/manual/en/domdocument.loadhtml.phpVielen 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
.
definieren
permission of the company
. Das bedeutet nichts, es sei denn, sie sendenAccess-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