Kann Javascript die Quelle einer Webseite lesen?

76

Ich arbeite am Scraping von Bildschirmen und möchte den Quellcode einer bestimmten Seite abrufen.

Wie kann dies mit Javascript erreicht werden? Bitte hilf mir.

praveenjayapal
quelle
Hier ist eine ähnliche Seite, auf die Sie möglicherweise Ihre Antwort erhalten, da sie mein Problem löst, die Quelle der HTML-Seite zu finden. Stackoverflow.com/questions/1367587/javascript-page-source-code
Asim Sajjad
7
@mikenvck Warum hast du PHP überhaupt erwähnt, als es um JavaScript ging? Die folgenden Antworten zeigen, wie dies mit JavaScript gemacht wird.
Corgrath
Um die Quelle eines Links zu erhalten, müssen Sie möglicherweise $.ajaxexterne Links verwenden. Hier ist die Lösung - stackoverflow.com/a/18447625/2657601
otaxige_aol
1
Keine einzige Antwort war natives Javascript, alle waren jquery-basiert.
ILikeTacos
1
jQuery ist natives JavaScript. Es ist nur JavaScript, das Sie von jquery.com anstelle von stackoverflow.com kopieren können.
Quentin

Antworten:

111

Probieren Sie einfach jQuery aus

$("#links").load("/Main_Page #jq-p-Getting-Started li");

Mehr unter jQuery Docs

Eine andere Möglichkeit, das Scraping von Bildschirmen viel strukturierter durchzuführen, ist die Verwendung von YQL oder Yahoo Query Language. Es werden die als JSON oder XML strukturierten Scraped-Daten zurückgegeben.
zB
Lassen Sie uns stackoverflow.com kratzen

select * from html where url="http://stackoverflow.com"

gibt Ihnen ein JSON-Array (ich habe diese Option gewählt) wie dieses

 "results": {
   "body": {
    "noscript": [
     {
      "div": {
       "id": "noscript-padding"
      }
     },
     {
      "div": {
       "id": "noscript-warning",
       "p": "Stack Overflow works best with JavaScript enabled"
      }
     }
    ],
    "div": [
     {
      "id": "notify-container"
     },
     {
      "div": [
       {
        "id": "header",
        "div": [
         {
          "id": "hlogo",
          "a": {
           "href": "/",
           "img": {
            "alt": "logo homepage",
            "height": "70",
            "src": "http://i.stackoverflow.com/Content/Img/stackoverflow-logo-250.png",
            "width": "250"
           }
……..

Das Schöne daran ist, dass Sie Projektionen und Where- Klauseln erstellen können, die Ihnen letztendlich die strukturierten Daten strukturieren und nur die Daten liefern, die Sie benötigen (letztendlich viel weniger Bandbreite über das Kabel),
z

select * from html where url="http://stackoverflow.com" and
      xpath='//div/h3/a'

Werde dich holen

 "results": {
   "a": [
    {
     "href": "/questions/414690/iphone-simulator-port-for-windows-closed",
     "title": "Duplicate: Is any Windows simulator available to test iPhone application? as a hobbyist who cannot afford a mac, i set up a toolchain kit locally on cygwin to compile objecti … ",
     "content": "iphone\n                simulator port for windows [closed]"
    },
    {
     "href": "/questions/680867/how-to-redirect-the-web-page-in-flex-application",
     "title": "I have a button control ....i need another web page to be redirected while clicking that button .... how to do that ? Thanks ",
     "content": "How\n                to redirect the web page in flex application ?"
    },
…..

Um nur die Fragen zu beantworten, machen wir a

select title from html where url="http://stackoverflow.com" and
      xpath='//div/h3/a'

Beachten Sie den Titel in Projektionen

 "results": {
   "a": [
    {
     "title": "I don't want the function to be entered simultaneously by multiple threads, neither do I want it to be entered again when it has not returned yet. Is there any approach to achieve … "
    },
    {
     "title": "I'm certain I'm doing something really obviously stupid, but I've been trying to figure it out for a few hours now and nothing is jumping out at me. I'm using a ModelForm so I can … "
    },
    {
     "title": "when i am going through my project in IE only its showing errors A runtime error has occurred Do you wish to debug? Line 768 Error:Expected')' Is this is regarding any script er … "
    },
    {
     "title": "I have a java batch file consisting of 4 execution steps written for analyzing any Java application. In one of the steps, I'm adding few libs in classpath that are needed for my co … "
    },
    {
……

Sobald Sie Ihre Anfrage geschrieben haben, wird eine URL für Sie generiert

http://query.yahooapis.com/v1/public/yql?q=select%20title%20from%20html%20where%20url%3D%22http%3A%2F%2Fstackoverflow.com%22%20and%0A%20% 20% 20% 20% 20% 20xpath% 3D '% 2F% 2Fdiv% 2Fh3% 2Fa'% 0A% 20% 20% 20% 20 & format = json & callback = cbfunc

in unserem Fall.

Letztendlich machst du so etwas

var titleList = $.getJSON(theAboveUrl);

und damit spielen.

Schön , nicht wahr?

Cherian
quelle
4
Genial, vor allem, um auf die Lösung des armen Mannes bei Yahoo hinzuweisen, bei der kein Proxy zum Abrufen der Daten erforderlich ist. Vielen Dank!! Ich habe mir erlaubt, den letzten Demo-Link zu query.yahooapis.com zu reparieren: In der URL-Codierung fehlte ein% -Zeichen. Cool, dass das noch funktioniert !!
GitaarLAB
Irgendeine Idee, wie man ein Bild und eine Meta-Beschreibung von amazon.in/Xiaomi-Redmi-4A-Grey-16GB/dp/… kratzt ?
query.yahooapis ist seit Januar 2019 im Ruhestand. Sieht wirklich ordentlich aus, schade, dass wir es jetzt nicht verwenden können. Siehe Tweet hier: twitter.com/ydn/status/1079785891558653952?ref_src=twsrc%5Etfw
mindoverflow
32

Javascript kann verwendet werden, solange Sie die gewünschte Seite über einen Proxy in Ihrer Domain abrufen:

<html>
<head>
<script src="/js/jquery-1.3.2.js"></script>
</head>
<body>
<script>
$.get("www.mydomain.com/?url=www.google.com", function(response) { 
    alert(response) 
});
</script>
</body>
karim79
quelle
4
Warum ist ein domänenbasierter Proxy erforderlich?
Ravindranath Akila
3
wegen der gleichen Herkunftsrichtlinie
Ferdi265
das ist wirklich interessant Vermutlich muss auf dem Server Code installiert werden, um dies zu ermöglichen?
S Meaden
@ejbytes: Eigentlich denke ich, dass node.js einige Module hat. Ich gehe davon aus, dass OP Web-Scrape will.
S Meaden
Sie erhalten die Meldung 'from origin' null 'wurde von der CORS-Richtlinie blockiert: In der angeforderten Ressource ist kein Header' Access-Control-Allow-Origin 'vorhanden.' wenn Sie nicht auf der gleichen Domain sind
Gerrit B
7

Sie können einfach XmlHttp(AJAX) verwenden, um die erforderliche URL zu ermitteln, und die HTML-Antwort von der URL ist in der responseTextEigenschaft verfügbar . Wenn es sich nicht um dieselbe Domain handelt, erhalten Ihre Benutzer eine Browser-Benachrichtigung mit der Meldung "Diese Seite versucht, auf eine andere Domain zuzugreifen. Möchten Sie dies zulassen?"

Cerebrus
quelle
3
Leider erhalten Sie keine Benachrichtigung, sondern blockieren nur die Anfrage
Alex
5

Aus Sicherheitsgründen kann Javascript keine Dateien aus verschiedenen Domänen lesen. Obwohl es möglicherweise eine seltsame Problemumgehung gibt, würde ich für diese Aufgabe eine andere Sprache in Betracht ziehen.

nickf
quelle
3

Verwenden von jquery

<html>
<head>
<script src="http://jqueryjs.googlecode.com/files/jquery-1.3.2.js" ></script>
</head>
<body>
<script>
$.get("www.google.com", function(response) { alert(response) });
</script>
</body>
Sergej Andrejev
quelle
8
Sie können auf diese Weise keine Seite außerhalb Ihrer Domain anfordern. Sie müssen dies über einen Proxy tun, z. B. $ .get (' mydomain.com/?url=www.google.com' )
karim79
2

Wenn Sie unbedingt Javascript verwenden müssen, können Sie die Seitenquelle mit einer Ajax-Anfrage laden.

Beachten Sie, dass Sie mit Javascript nur Seiten abrufen können, die sich unter derselben Domäne wie die anfordernde Seite befinden.

kkyy
quelle
2

Ich habe ImportIO verwendet . Sie können den HTML-Code von jeder Website anfordern, wenn Sie ein Konto bei ihnen einrichten (was kostenlos ist). Mit ihnen können Sie bis zu 50.000 Anfragen pro Jahr stellen. Ich habe ihnen keine Zeit genommen, um eine Alternative zu finden, aber ich bin mir sicher, dass es einige gibt.

In Ihrem Javascript stellen Sie im Grunde nur eine GET-Anfrage wie folgt:

var request = new XMLHttpRequest();

request.onreadystatechange = function() {
  jsontext = request.responseText;

  alert(jsontext);
}

request.open("GET", "https://extraction.import.io/query/extractor/THE_PUBLIC_LINK_THEY_GIVE_YOU?_apikey=YOUR_KEY&url=YOUR_URL", true);

request.send();

Nebenbemerkung: Ich fand diese Frage, als ich nachforschte, wie ich mich fühlte, dieselbe Frage, sodass andere meine Lösung möglicherweise hilfreich finden.

UPDATE: Ich habe eine neue erstellt, die ich nur für weniger als 48 Stunden verwenden durfte, bevor sie sagten, ich müsse für den Service bezahlen. Es scheint, dass sie Ihr Projekt jetzt ziemlich schnell schließen, wenn Sie nicht bezahlen. Ich habe meinen eigenen ähnlichen Dienst mit NodeJS und einer Bibliothek namens NightmareJS gemacht. Sie können ihr Tutorial hier sehen und Ihr eigenes Web-Scraping-Tool erstellen. Es ist relativ einfach. Ich habe nicht versucht, es als API einzurichten, an die ich Anfragen stellen kann, oder so.

David Hudman
quelle
2

Sie können fetch verwenden :

const URL = 'https://www.sap.com/belgique/index.html';
fetch(URL)
.then(res => res.text())
.then(text => {
    console.log(text);
})
.catch(err => console.log(err));

Sarah
quelle
1

jquery ist nicht die Art, Dinge zu tun. Tun Sie in purre Javascript

var r = new XMLHttpRequest();
    r.open('GET', 'yahoo.comm', false);
    r.send(null); 
if (r.status == 200) { alert(r.responseText); }
Alejandro
quelle
0

Sie können eine XmlHttpRequest generieren und die Seite anfordern und dann getResponseText () verwenden, um den Inhalt abzurufen.

Vatsal Juneja
quelle
0

Sie können die FileReader-API verwenden , um eine Datei abzurufen. Wenn Sie eine Datei auswählen, geben Sie die URL Ihrer Webseite in das Auswahlfeld ein. Verwenden Sie diesen Code:

function readFile() {
    var f = document.getElementById("yourfileinput").files[0]; 
    if (f) {
      var r = new FileReader();
      r.onload = function(e) { 
        alert(r.result);
      }
      r.readAsText(f);
    } else { 
      alert("file could not be found")
    }
  }
}
Awesomeness01
quelle
0

Sie können die Richtlinie mit demselben Ursprung umgehen, indem Sie entweder eine Browsererweiterung erstellen oder die Datei sogar als .hta in Windows (HTML-Anwendung) speichern.

Jonathan Gray
quelle
0

Trotz vieler gegenteiliger Kommentare glaube ich, dass es möglich ist, die gleiche Ursprungsanforderung mit einfachem JavaScript zu überwinden.

Ich behaupte nicht, dass das Folgende original ist, weil ich glaube, dass ich vor einiger Zeit anderswo etwas Ähnliches gesehen habe.

Ich habe dies nur mit Safari auf einem Mac getestet.

Die folgende Demonstration ruft die Seite im Basis-Tag ab und verschiebt ihr innerHTML in ein neues Fenster. Mein Skript fügt HTML-Tags hinzu, aber mit den meisten modernen Browsern könnte dies durch die Verwendung von OuterHTML vermieden werden.

<html>
<head>
<base href='http://apod.nasa.gov/apod/'>
<title>test</title>
<style>
body { margin: 0 }
textarea { outline: none; padding: 2em; width: 100%; height: 100% }
</style>
</head>
<body onload="w=window.open('#'); x=document.getElementById('t'); a='<html>\n'; b='\n</html>'; setTimeout('x.innerHTML=a+w.document.documentElement.innerHTML+b; w.close()',2000)">
<textarea id=t></textarea>
</body>
</html>
Neville Hillyer
quelle
Ich verwende Safari 5.0.6 mit Webkit-Patches, um es auf das Äquivalent neuerer Versionen zu aktualisieren. Welche Version von Safari haben Sie verwendet und was ist passiert?
Neville Hillyer
8.0.3. Es passierte nichts anderes als einige Fehler (die ich nicht auswendig gelernt habe) in der Konsole.
Quentin
Welche Safari verwenden Sie und was genau waren die Fehler?
Neville Hillyer
Immer noch 8.0.3 und wenn Sie wirklich wollen, dass ich den Testfall reproduziere:TypeError: undefined is not an object (evaluating 'w.document')
Quentin
Die wahrscheinlichste Erklärung für das, was Sie geschafft haben, ist, dass Sie eine Sicherheitslücke gefunden haben, die dank einer Kombination Ihres positiv alten Browsers und der inoffiziellen Patches dazu besteht. Das ist in den meisten Fällen nicht von praktischem Nutzen.
Quentin
0
<script>
    $.getJSON('http://www.whateverorigin.org/get?url=' + encodeURIComponent('hhttps://example.com/') + '&callback=?', function (data) {
        alert(data.contents);
    });

</script>

Schließen Sie jQuery ein und verwenden Sie diesen Code, um HTML von anderen Websites abzurufen. Ersetzen Sie example.com durch Ihre Website .

Bei dieser Methode ruft ein externer Server das HTML der Site ab und sendet es an Sie. :) :)

Steev James
quelle
0
javascript:alert("Inspect Element On");
javascript:document.body.contentEditable = 'true';
document.designMode='on'; 
void 0;
javascript:alert(document.documentElement.innerHTML); 

Markieren Sie dies und ziehen Sie es in Ihre Lesezeichenleiste. Klicken Sie darauf, wenn Sie den Quellcode der aktuellen Site bearbeiten und anzeigen möchten.

Roger Keene
quelle