浏览器只是向服务器发送 HTTP 请求,您不一定需要加载 DOM。如果您可以对要发送的请求进行反向工程,则可以轻松模拟网页或工作流的行为。当您从 PHP 使用 cURL 发送请求时,您需要将 cookie 存储在 cookie jar 中以跨请求维护 cookie。这样的事情应该让你开始:
function load($url, $postData = array())
{
$useragent = "User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.109 Safari/537.36";
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($curl, CURLOPT_HEADER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($curl, CURLOPT_ENCODING, 'UTF-8');
curl_setopt($curl, CURLOPT_USERAGENT, $useragent);
curl_setopt($curl, CURLOPT_POST, !empty($postData));
if(!empty($postData)) curl_setopt($curl, CURLOPT_POSTFIELDS, $postData);
curl_setopt($curl, CURLOPT_COOKIEFILE, $cookieFile);
curl_setopt($curl, CURLOPT_COOKIEJAR, $cookieFile);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, TRUE);
$page = curl_exec ($curl);
curl_close ($curl);
return $page;
}
如果你想运行一个在 cookie jar 中维护 cookie 的无头浏览器,我会推荐像 PhantomJS 这样的东西。然后,您可以在页面的上下文中加载页面并执行代码:
"use strict";
var page = require('webpage').create();
page.onConsoleMessage = function(msg) {
console.log(msg);
};
page.open("http://phantomjs.org/", function(status) {
if (status === "success") {
page.includeJs("http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js", function() {
page.evaluate(function() {
console.log("$(\".explanation\").text() -> " + $(".explanation").text());
});
phantom.exit(0);
});
} else {
phantom.exit(1);
}
});
代码可以在 Github 上找到:https://github.com/ariya/phantomjs/blob/master/examples/phantomwebintro.js