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.
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)
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
.
/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>
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.
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:
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.