在 Javascript 与 PHP 一起运行后获取 URL 的内容(文本)

Get the content (text) of an URL after Javascript has run with PHP

提问人:Victor Ferreira 提问时间:2/14/2015 最后编辑:Don't PanicVictor Ferreira 更新时间:9/25/2020 访问量:39932

问:

是否可以使用 PHP 获取 URL 的内容(使用某种函数,如 or),但只有在执行某些 JavaScript 代码之后?file_get_contentsheader

例:

mysite.com 有一个脚本,可以执行并打印/回显内容。想象一下,一些jQuery运行在它改变DOM上,并将得到得到结果的HTMLloadUrlAfterJavascriptExec('http://exampletogetcontent.com/')http://exampletogetcontent.com/loadUrlAfterJavascriptExec

我们能做到吗?

需要明确的是,我想要的是通过 URL 获取页面的内容,但只有在 JavaScript 在目标页面上运行(PHP 正在获取其内容)之后。

我知道PHP在页面发送到客户端之前运行,而JS仅在之后运行,但我认为也许有一个专家的解决方法。

javascript php jquery curl http-headers

评论

1赞 Alex 2/14/2015
不:-)您希望浏览器获取页面并运行该页面的所有JS文件并在执行后获取该页面?但是你无法控制那个页面?那么答案是否定的,你不能
0赞 AndrewD 2/14/2015
请求的 URL 是否在同一个域上?
0赞 Victor Ferreira 2/14/2015
@Joelerr实际上是乔勒

答:

-1赞 The E 2/14/2015 #1

在将信息发送到客户端之前,所有 PHP 都会运行。 所有 JavaScript 在信息发送到客户端后运行。

要在页面加载后对 PHP 执行某些操作,页面需要

  1. 重新加载,将 JavaScript 生成的信息保存在 cookie 中或作为 POST 数据(不理想)或
  2. 对另一个 PHP 文件进行 Ajax 调用以获取数据。(好多了)

由于数据似乎与PHP位于不同的文件中,因此这是一个非常好的解决方案。既然你把它标记为jQuery,我假设你正在使用它。

jQuery 有一组关于它如何实现 Ajax 的页面

但是使用jQuery的最简单方法是.post

前任:

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

$.post()顾名思义,可以与对数据文件的请求一起发送数据,因此,如果该请求是针对PHP文件,则PHP文件可以使用该数据。

前任:

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

数据应采用键/值对的 JSON 格式。

17赞 AndrewD 2/14/2015 #2

更新 2添加有关如何从 PHP 使用的更多详细信息。phantomjs

更新 1(在澄清目标页面上的 javascript 需要先运行之后)

方法一:使用phantomjs(将执行javascript);

1. 下载 phantomjs 并将可执行文件放在 PHP 二进制文件可以到达的路径中。

2. 将以下 2 个文件放在同一目录中:

获取网站.php

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


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

    echo  htmlspecialchars($response);
    ?>

获取网站.js

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

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

3.浏览到目标站点,执行内联javascript后将返回内容。您也可以使用命令行调用它。get-website.phphttp://google.comphp /path/to/get-website.php

方法2:将Ajax与PHP一起使用(没有phantomjs,所以不会运行javascript);

/get-website.php

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

测试.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>

评论

0赞 AndrewD 2/22/2015
@victor费雷拉 你有机会看看这个解决方案吗?
2赞 Adamantus 1/16/2019
这已过时,PhantomJS 不再生产。
3赞 Adamantus 1/16/2019 #3

我在这个页面上找到了一个很棒的页面,这是一个关于如何处理完全使用 javascript 创建的 PHP 页面的 DOM 的完整教程。

https://www.jacobward.co.uk/using-php-to-scrape-javascript-jquery-json-websites/“PhantomJS 开发已暂停,直至另行通知”,因此该选项不是一个好的选项。

评论

0赞 valepu 11/18/2021
这篇文章似乎不再可用,但它可以在 waybackmachine 上找到
1赞 Mahdi mehrabi 9/24/2020 #4

我认为最简单和最好的方法是使用此软件包 https://github.com/spatie/browsershot 只需完全安装它并使用以下代码即可

Browsershot::url('https://example.com')->bodyHtml()