如何通过cron作业运行(并杀死)headless browser以在PHP中实现自动抓取
我一直在尝试创建一个每天早上通过cron运行的spider。我想合并一个无头浏览器,以获得呈现的DOM(在javascript之后) 我尝试使用(无头浏览器),并成功地通过cURL获得了一个(而且只有一个)页面。文档不存在,并且在每次请求后都会挂起 我如何通过PHP杀死Crowbar的进程,本质上是为了能够随意启动/停止它。或者人们只是让这些无头浏览器持续运行?这似乎是资源的流失 这是我尝试过的代码,但扼杀进程不起作用如何通过cron作业运行(并杀死)headless browser以在PHP中实现自动抓取,php,web-scraping,headless-browser,Php,Web Scraping,Headless Browser,我一直在尝试创建一个每天早上通过cron运行的spider。我想合并一个无头浏览器,以获得呈现的DOM(在javascript之后) 我尝试使用(无头浏览器),并成功地通过cURL获得了一个(而且只有一个)页面。文档不存在,并且在每次请求后都会挂起 我如何通过PHP杀死Crowbar的进程,本质上是为了能够随意启动/停止它。或者人们只是让这些无头浏览器持续运行?这似乎是资源的流失 这是我尝试过的代码,但扼杀进程不起作用 $toExecute = "\"" .ROOT . "/vendors/xu
$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;
或者,有没有更好的方法可以使用javascript在php中进行刮取?我很想听听……shell\u 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" );
$toExecute=“/xulrunner.exe>/dev/null 2>/dev/null&echo$!”;
$myPid=shell_exec($toExecute);
...
exec(“/bin/kill$myPid”);
请注意,为了安全起见,您应该在适当的地方使用escapeshellarg()
和escapeshellcmd()
。否则,您将面临恶作剧。PHP中的curl句柄与可杀死的进程完全无关。curl将完全在php内部运行。没有外部进程可以终止。我不是在尝试“终止一个cURL进程”-我是在尝试终止crowbar(该进程从上述代码的第2行开始)。如果您使用proc_open()
,您可以稍后调用posix_kill()
我在windows上运行proc_open()
时遇到问题。在popen()
(xulrunner.exe)中运行良好的命令找不到要在proc\u open()
中运行的application.ini文件,尽管使用了绝对路径…我在windows环境(Apache)中,尽管这是朝着正确方向迈出的一步,我无法使用shell_exec在后台运行进程,也无法回显进程id。(我已经尽了一切努力让进程在后台运行,但在windows上,这是一场噩梦)对于后代,我相信Aleksi的信息是正确的,但为了抓取,我最终从撬棍变成了幻影。PhantomJS是一个简单的include,通过在脚本末尾调用phantom.exit()
,可以很容易地从内部停止,这完全解决了我的问题。