84 votes

Le Javascript peut-il lire la source de n'importe quelle page web ?

Je travaille sur le screen scraping, et je veux récupérer le code source d'une page particulière.

Comment réaliser cela avec javascript ? Veuillez m'aider.

1 votes

Voici une page similaire qui peut vous apporter une réponse car elle résout mon problème d'obtention de la source de la page HTML. stackoverflow.com/questions/1367587/javascript-page-source-code

7 votes

@mikenvck Pourquoi avez-vous mentionné PHP alors que la question portait sur JavaScript ? Les réponses ci-dessous montrent comment faire cela avec JavaScript.

1 votes

Pour obtenir la source d'un lien, vous devrez peut-être utiliser $.ajax pour les liens externes. voici la solution - stackoverflow.com/a/18447625/2657601

113voto

Cherian Points 8302

Une façon simple de commencer, essayez jQuery

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

Plus à Docs jQuery

Une autre façon de faire du screen scraping d'une manière beaucoup plus structurée est d'utiliser YQL ou Yahoo Query Language. Il renverra les données extraites structurées en JSON ou en xml.
par exemple
Examinons stackoverflow.com.

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

vous donnera un tableau JSON (j'ai choisi cette option) comme ceci

 "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"
           }
……..

L'avantage de ce système est que vous pouvez faire les projections et où qui, en fin de compte, vous permet d'obtenir des données scannées structurées et seulement les données ce dont vous avez besoin (beaucoup moins de bande passante sur le fil au final)
Par exemple

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

vous obtiendra

 "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 ?"
    },
…..

Maintenant, pour obtenir uniquement les questions, nous faisons un

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

Notez le titre dans les projections

 "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 … "
    },
    {
……

Une fois que vous avez écrit votre requête, il génère une url pour vous.

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

dans notre cas.

Au bout du compte, on finit par faire quelque chose comme ça

var titleList = $.getJSON(theAboveUrl);

et jouer avec.

Magnifique n'est-ce pas ?

5 votes

Brillant, surtout pour l'allusion à la solution du pauvre chez Yahoo qui élimine le besoin d'un proxy pour récupérer les données. Merci ! J'ai pris la liberté de corriger le dernier lien de démonstration vers query.yahooapis.com : il manquait un signe % dans l'encodage url. Cool que cela fonctionne encore !

0 votes

Une idée de la façon dont on peut récupérer l'image et la méta-description d'un site web ? amazon.in/Xiaomi-Redmi-4A-Grey-16GB/dp/ ?

3 votes

Query.yahooapis a été retiré à partir de janvier 2019. Ça a l'air vraiment chouette, dommage qu'on ne puisse plus l'utiliser maintenant. Voir le tweet ici : twitter.com/ydn/status/1079785891558653952?ref_src=twsrc%5Et‌​fw

33voto

karim79 Points 178055

Javascript peut être utilisé, à condition que vous récupériez la page souhaitée via un proxy sur votre domaine :

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

5 votes

Pourquoi un proxy basé sur un domaine est-il nécessaire ?

5 votes

En raison de la politique de la même origine

0 votes

C'est vraiment intéressant. Je suppose qu'il y a du code à installer sur le serveur pour que cela se produise ?

7voto

Cerebrus Points 18045

Vous pourriez simplement utiliser XmlHttp (AJAX) pour frapper l'URL requise et la réponse HTML de l'URL sera disponible dans l'application responseText propriété. S'il ne s'agit pas du même domaine, vos utilisateurs recevront une alerte du navigateur indiquant quelque chose comme "Cette page tente d'accéder à un domaine différent. Voulez-vous l'autoriser ?"

3 votes

Malheureusement, vous ne recevrez pas d'alerte, la demande sera simplement bloquée.

4voto

kkyy Points 5540

Si vous devez absolument utiliser le javascript, vous pouvez charger la source de la page avec une requête ajax.

Notez qu'avec le javascript, vous ne pouvez récupérer que les pages qui sont situées sous le même domaine que la page requérante.

3voto

Sergej Andrejev Points 4052

Utilisation de 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>

10 votes

Vous ne pouvez pas demander une page en dehors de votre domaine de cette manière, vous devez le faire via un proxy, par exemple $.get('). mondomaine.com/?url=www.google.com' )

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X