2009-03-25 13 views
61

Ich arbeite am Bildschirm Scraping, und möchte den Quellcode einer bestimmten Seite abrufen.Kann Javascript die Quelle irgendeiner Webseite lesen?

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

+7

@mikenvck Warum hast du überhaupt PHP erwähnt, als es um JavaScript ging? Die Antworten unten zeigen, wie man das mit JavaScript macht. – corgrath

+0

Hier ist ähnliche Seite können Sie Ihre Antwort erhalten, wie es mein Problem der Quelle der HTML-Seite zu lösen http://stackoverflow.com/questions/1367587/javascript-page-source-code –

+1

Keine einzige Antwort war native Javascript , alle von ihnen waren jQuery basiert. – ILikeTacos

Antwort

5

Als Sicherheitsmaßnahme kann Javascript Dateien aus verschiedenen Domänen nicht lesen. Obwohl es eine seltsame Problemumgehung dafür geben könnte, würde ich eine andere Sprache für diese Aufgabe in Erwägung ziehen.

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.

7

Sie könnten einfach XmlHttp (AJAX) verwenden, um die erforderliche URL zu treffen, und die HTML-Antwort von der URL wird in der responseText-Eigenschaft verfügbar sein. Wenn es sich nicht um die gleiche Domain handelt, erhalten Ihre Nutzer eine Browserwarnung mit der Aussage "Diese Seite versucht, auf eine andere Domain zuzugreifen. Möchten Sie dies zulassen?"

+0

Leider erhalten Sie keine Benachrichtigung, es wird nur die Anfrage blockieren – Alex

3

jquery Mit

<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> 
+7

Sie können nicht eine Seite außerhalb Ihrer Domain auf diese Weise anfordern, müssen Sie es über Proxy, z. $ .get ('http://mydomain.com/?url=www.google.com') – karim79

28

Javascript verwendet werden können, so lange, wie Sie greifen, was Seite Sie nach über einen Proxy auf Ihrer Domain:

<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> 
+2

Warum ist ein domänenbasierter Proxy erforderlich? –

+1

wegen der gleichen Ursprungs-Richtlinie – Ferdi265

+0

das ist wirklich interessant. Vermutlich gibt es einen Code, der auf dem Server installiert werden muss, um das zu ermöglichen? –

105

einfache Art und Weise zu starten, versuchen jQuery

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

Mehr auf jQuery Docs

Eine weitere Möglichkeit, Screen Scraping in einer viel strukturierteren Art und Weise zu tun, ist die Verwendung YQL or Yahoo Query Language. Es wird die Scraped-Daten als JSON oder XML strukturiert zurückgeben.
z.B.
Lassen Sie uns schaben stackoverflow.com

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

geben Ihnen einen JSON-Array (ich diese Option gewählt haben) 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 tun können und wo Klauseln, die Sie schließlich die abgekratzten Daten strukturiert und nur die Daten was Sie brauchen (viel weniger Bandbreite über den Draht letztlich)
e.g

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

werden Sie

"results": { 
    "a": [ 
    { 
    "href": "https://stackoverflow.com/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": "https://stackoverflow.com/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 ?" 
    }, 
….. 

Jetzt nur die Fragen zu bekommen bekommen wir eine

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

Hinweis der Titel tun 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 … " 
    }, 
    { 
…… 

Nachdem Sie Ihre Abfrage schreiben erzeugt es eine URL für Sie

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.

So sind letztlich am Ende Sie so etwas wie dieses

var titleList = $.getJSON(theAboveUrl); 

und spielen Sie mit ihm zu tun.

Schöne, oder?

+4

Brilliant, vor allem, um auf die Lösung des armen Mannes bei yahoo hinzuweisen, die die Notwendigkeit für einen Proxy zum Abrufen der Daten beseitigt. Vielen Dank!! Ich habe mir die Freiheit genommen, den letzten Demo-Link zu query.yahooapis.com zu reparieren: Es fehlte ein% -Zeichen in der URL-Kodierung. Cool, dass das noch funktioniert !! – GitaarLAB

+0

Jede Idee, wie Bild und Meta-Beschreibung von http://www.amazon.in/Xiaomi-Redmi-4A-Grey-16GB/dp/B01FM7K078?_encoding=UTF8&psc=1&refRID=87MVWA5E1E8PEBZE8XZN&ref_=nav_custrec_signin&ref_=pd_rhf_gw_p_img_1 schaben? –

+4

wird nicht mehr unterstützt! –

0

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

0

Sie können FileReader API verwenden, um eine Datei zu erhalten, und 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") 
    } 
    } 
} 
0

können Sie umgehen die Same-Origin-Politik entweder durch eine Browser-Erweiterung erstellen oder sogar die Datei als .hta in Windows (HTML Application) speichern.

-1

Trotz vieler gegenteiliger Bemerkungen glaube ich, dass es möglich ist, die gleichen Ursprungsanforderungen mit einfachem JavaScript zu lösen.

Ich behaupte nicht, dass das folgende Original ist, weil ich glaube, dass ich vor einiger Zeit etwas ähnliches sah.

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 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> 
+0

Das funktioniert nicht in Safari auf einem Mac, wenn ich es versuche. – Quentin

+0

Ich verwende Safari 5.0.6 mit Webkit-Patches, um es auf das Äquivalent zu neueren Versionen zu aktualisieren. Welche Version von Safari hast du benutzt und was ist passiert? –

+0

8.0.3. Es ist nichts passiert außer ein paar Fehler (die ich nicht auswendig gelernt habe) erschienen in der Konsole. – Quentin

3

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

In Ihrem Javascript, werden Sie im Grunde eine GET-Anfrage wie diese machen nur:

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

Nebenbei bemerkt: ich diese Frage gefunden, während, was die Erforschung fühlte ich mich wie die gleiche Frage war, damit andere meine Lösung hilfreich finden.

AKTUALISIERUNG: Ich habe eine neue erstellt, die sie mir erlaubt haben, für weniger als 48 Stunden zu verwenden, bevor sie sagten, dass ich für den Dienst bezahlen musste. Es scheint, dass sie Ihr Projekt jetzt ziemlich schnell herunterfahren, wenn Sie nicht zahlen. Ich habe meinen eigenen ähnlichen Dienst mit NodeJS und einer Bibliothek namens NightmareJS gemacht. Sie können ihr Tutorial here sehen und ein eigenes Web Scraping Tool erstellen. Es ist relativ einfach. Ich habe nicht versucht, es als eine API einzurichten, an die ich Anfragen richten könnte.

Verwandte Themen