web-dev-qa-db-fra.com

Récupère le contenu (texte) d'une URL après l'exécution de Javascript avec PHP

Est-il possible d’obtenir le contenu d’une URL avec PHP (en utilisant une sorte de fonction telle que file_get_contents ou header) mais seulement après l’exécution de code JavaScript?

Exemple:

mysite.com a un script qui fonctionne avec loadUrlAfterJavascriptExec('http://exampletogetcontent.com/') et affiche/reproduit le contenu. imaginez que certains jQuery fonctionnent sur http://exampletogetcontent.com/ qui modifie DOM, et loadUrlAfterJavascriptExec obtiendra le code HTML résultant

Pouvons-nous faire cela?

Soyons clairs: ce que je veux, c’est d’obtenir le contenu d’une page par l’intermédiaire d’une URL, mais seulement après l’exécution de JavaScript sur la page cible (celle PHP obtient son contenu).

Je sais que PHP s'exécute avant que la page ne soit envoyée au client, et JS seulement après cela, mais je pensais qu'il existait peut-être une solution de contournement experte.

9
Victor Ferreira

Update 2 Ajoute plus de détails sur l'utilisation de phantomjs depuis PHP.

Mise à jour 1 (après clarification que javascript sur target page doit être exécuté en premier)

Méthode 1: Utilisez phantomjs (exécutera javascript);

1. Téléchargez phantomjs et placez l’exécutable dans un chemin accessible par votre binaire PHP.

2. Placez les 2 fichiers suivants dans le même répertoire:

get-website.php

<?php

    $phantom_script= dirname(__FILE__). '/get-website.js'; 


    $response =  exec ('phantomjs ' . $phantom_script);

    echo  htmlspecialchars($response);
    ?>

get-website.js

var webPage = require('webpage');
var page = webPage.create();

page.open('http://google.com/', function(status) {
 console.log(page.content);
  phantom.exit();
});

3. Accédez à get-website.php et le contenu du site cible, http://google.com sera renvoyé après l'exécution du code javascript intégré. Vous pouvez également appeler cela à partir d'une ligne de commande en utilisant php /path/to/get-website.php.

Méthode 2: Utiliser Ajax avec PHP (aucun phantomjs, donc ne lance pas javascript);

/get-website.php

<?php

    $html=file_get_contents('http://google.com');
    echo $html;
    ?>

test.html

<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>on demo</title>
<style>
p {
color: red;
}
span {
color: blue;
}
</style>
<script src="https://code.jquery.com/jquery-1.10.2.js"></script>
</head>
<body>
<button id='click_me'>Click me</button>
<span style="display:none;"></span>
<script>

$( "#click_me" ).click(function () {
    $.get("/get-website.php", function(data) {
        var json = {
            html: JSON.stringify(data),
            delay: 1
        };
        alert(json.html);
        });
});
</script>
</body>
</html>
14
AndrewD

J'ai trouvé une page fantastique à ce sujet. Il s'agit d'un didacticiel complet sur la façon de traiter le DOM d'une page dans PHP, entièrement créé à l'aide de javascript.

https://www.jacobward.co.uk/using-php-to-scrape-javascript-jquery-json-websites/ "Le développement de PhantomJS est suspendu jusqu'à nouvel ordre", de sorte que cette option n'est pas pas un bon.

0
Adamantus

Tous les PHP s'exécutent avant que les informations ne soient envoyées au client. Tout le JavaScript s'exécute après que les informations soient envoyées au client.

Pour faire quelque chose avec PHP après le chargement de la page, celle-ci devra soit:

  1. recharger, sauvegarder les informations générées par JavaScript dans un cookie ou en tant que données POST (pas idéales) OU
  2. faites un appel Ajax à un autre fichier PHP pour obtenir les données. (beaucoup mieux)

Comme les données semblent être dans un fichier différent de votre PHP de toute façon, c'est une très bonne solution. Puisque vous l'avez étiqueté jQuery, je suppose que vous l'utilisez. 

jQuery a un ensemble de pages sur la façon dont il implémente Ajax

Mais le moyen le plus simple d’utiliser jQuery pour cela est .post

ex:

$.post( "http://example.com/myDataFile.txt", function( data ) {
    //do more JavaScript stuff with the data you just retrieved
});

$.post(), comme son nom l'indique, peut envoyer des données avec la demande de fichier de données. Par conséquent, si cette demande consiste, par exemple, dans un fichier PHP, le fichier PHP peut l'utiliser. Les données.

ex:

$.post( "http://example.com/myDataFile.txt",
    { foo: "bar"; yabba: "dabba" },
    function( data ) {
       //do more JavaScript stuff with the data you just retrieved
});

les données doivent être au format JSON dans des paires clé/valeur.

0
The E