是否可以使用PHP(使用某种函数,如file_get_contents
或header
)获取URL的内容,但只能在执行某些JavaScript代码之后?
示例:
mysite.com有一个执行loadUrlAfterJavascriptExec('http://exampletogetcontent.com/')
并打印/回显内容的脚本。假设一些jQuery在更改DOM的http://exampletogetcontent.com/
上运行,loadUrlAfterJavascriptExec
将获得结果HTML
我们能做到吗?
需要明确的是,我想要的是通过URL获取页面的内容,但前提是JavaScript在目标页面上运行(PHP正在获取其内容)。
我知道PHP是在页面发送到客户端之前运行的,JS是在之后运行的,但我认为可能有一个专家的解决方法。
Update2添加了有关如何从PHP使用phantomjs
的更多详细信息。
更新1(在澄清目标页面上的javascript需要首先运行之后)
方法一:使用phantomjs(将执行javascript)
1.下载phantomjs并将可执行文件放在PHP二进制文件可以访问的路径中。
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
和目标站点,执行内联javascript后会返回http://google.com
的内容。您也可以使用php /path/to/get-website.php
从命令行调用它。
方法2:将Ajax与PHP结合使用(没有phantomjs,因此不会运行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>
我发现了一个很棒的页面,这是一个关于如何在PHP中处理页面DOM的完整教程,该页面完全是使用javascript创建的。
https://www.jacobward.co.uk/using-php-to-scrape-javascript-jquery-json-websites/"PhantomJS的开发将暂停,直到另行通知",所以这个选项并不好。
我认为最简单、最好的方法是使用这个包https://github.com/spatie/browsershot只需完全安装并使用以下代码
Browsershot::url('https://example.com')->bodyHtml()
所有的PHP都在信息发送到客户端之前运行。所有的JavaScript都是在信息发送到客户端之后运行的。
要在页面加载后使用PHP做一些事情,页面需要使用
- 重新加载,将JavaScript生成的信息保存在cookie中或作为POST数据(不理想)或
- 对另一个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格式。