使用PHP登录后抓取具有异步内容的网站

时间:2019-05-05 12:50:28

标签: php curl

我在本地网络中有一个网站。它隐藏在登录名后面。我希望我的PHP代码进入该网站并复制其内容。内容没有立即发布,仅在1-3秒后加载。

我已经想出了如何通过cURL登录和复制网站。但是它仅显示立即发布的内容,而我瞄准的内容将在1-3秒后添加。

<?php
$url = "http://@192.168.1.101/cgi-bin/minerStatus.cgi";

$username = 'User';
$password = 'Password';

$ch = curl_init($url);
curl_setopt($ch,CURLOPT_HTTPHEADER,array('User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:19.0) Gecko/20100101 Firefox/19.0'));
curl_setopt($ch, CURLOPT_USERPWD, $username . ":" . $password);  
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$response = curl_exec($ch);

if(curl_errno($ch)){
    //If an error occured, throw an Exception.
    throw new Exception(curl_error($ch));
}
echo $response;

?>

输出为空表。而且,我希望他们会看到稍后在此网站上显示的数据。

1 个答案:

答案 0 :(得分:1)

问题在于curl仅发出HTTP请求并将响应正文返回给您。目标页面上的表可能使用JavaScript填充了asynchronously。您在这里有两个选择:

  1. 找出请求的资源,然后使用curl直接获取它们。为此,请在浏览器中打开页面并检查developer tools for outgoing AJAX requests。一旦确定了实际加载的文件后,只需请求即可,而不是您的$url

  2. 使用模拟/无头浏览器执行JavaScript。如果由于某种原因第一个选项对您不起作用,则可以使用headless browser模拟真实用户浏览网站。这允许完整的JavaScript功能。对于PHP,有一个很棒的Symfony/Panther库,该库在后台使用了facebook webdriver,并且运行良好。这将比第一个解决方案更多的工作,因此请首先尝试。