如何通过cron作业在PHP中运行(和终止)无头浏览器的自动抓取


How to run (and kill) headless browser via cron job for automated scraping in PHP

我一直在尝试创建一个每天早上通过cron运行的蜘蛛。我想合并一个无头浏览器,以便获得渲染的DOM (javascript之后)。

我尝试使用Crowbar(一种无头浏览器),并成功地通过cURL获得一个(而且只有一个)页面。文档是不存在的,并且在每个第一个请求之后都会挂起。

我如何通过PHP杀死Crowbar的进程,本质上是能够随意启动/停止它。或者人们只是让这些无头的浏览器一直运行?这似乎是一种资源消耗。

这是我尝试过的代码,但是终止进程不起作用。

$toExecute = "'"" .ROOT . "/vendors/xulrunner/xulrunner.exe '" '"". ROOT . "/app/Vendor/crowbar/xulapp/application.ini '" 2>&1 &";
$handle = shell_exec($toExecute);
$curl = curl_init();
curl_setopt ($curl, CURLOPT_URL, 'http://127.0.0.1:10000/?url=' . $url . '&delay=3000&view=as-is');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$html = curl_exec ($curl);
exec("kill -KILL ".$handle); //this does not work...
echo $html;

或者有一个更好的方法刮在php与javascript?

shell_exec()没有返回句柄。它返回命令的输出。因此,您将在$handle中看到STDOUT和STDERR。我将停止此操作,而只回显$!,它将被设置为最后执行命令的PID。然后您可以将此PID传递给kill以正确杀死xulrunner.exe

所以,总结一下:

$toExecute = "<path>/xulrunner.exe <params> >/dev/null 2>/dev/null & echo $!";
$myPid = shell_exec( $toExecute );
...
exec( "/bin/kill $myPid" );

请注意,为了安全起见,您应该在适当的地方使用escapeshellarg()escapeshellcmd()。否则,你就是在让自己暴露在恶作剧中。