使用 PHP 运行 Javascript 后获取 URL 的内容(文本)

IT技术 javascript php jquery curl http-headers
2021-02-28 19:20:48

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

例子:

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

我们可以这样做吗?

明确地说,我想要的是通过 URL 获取页面的内容,但前提是 JavaScript 在目标页面上运行(PHP 正在获取其内容)。

我知道 PHP 在页面发送到客户端之前运行,而 JS 只在此之后运行,但认为可能有专家解决方法。

4个回答

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

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

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

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

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

获取-website.php

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


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

    echo  htmlspecialchars($response);
    ?>

获取-website.js

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

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

3.浏览到get-website.php目标站点,http://google.com执行内联javascript后返回内容。您也可以使用php /path/to/get-website.php.

方法二: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>
@victor-ferreira 你有机会看看这个解决方案吗?
2021-04-19 19:20:48
这是过时的,PhantomJS 不再生产。
2021-04-30 19:20:48

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

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

该文章似乎不再可用,但它在waybackmachine上可用
2021-05-11 19:20:48

我认为最简单和最好的方法是使用这个包 https://github.com/spatie/browsershot 只需完全安装它并使用下面的代码

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

所有 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 格式的键/值对。