用curl打开url,点击ajax按钮,等待并获得响应html

时间:2014-04-05 13:11:48

标签: javascript php jquery ajax curl

我要刮http://www.car4you.at/Haendlersuche 它首次显示20个结果和分页。我成功地抓了20个链接但面临问题以获得链接到下一页,因为分页的 href 中没有链接。它包含一个javascript函数。

href="javascript:AjaxCallback_ResList('ResultList', 'Pager', '1_1874')"

我的问题是如何使用curl加载页面然后单击下一页按钮,等待响应然后解析它。

这是我正在尝试的

curl的功能

function postCurlReq($loginActionUrl,$parameters,$referer)
{
        curl_setopt ($this->curl, CURLOPT_URL,$loginActionUrl); 
        curl_setopt ($this->curl, CURLOPT_POST, 1); 
        curl_setopt ($this->curl, CURLOPT_POSTFIELDS, $parameters); 
        curl_setopt ($this->curl, CURLOPT_COOKIEJAR, realpath('cookie.txt')); // cookie.txt should be in same directoy, where calling script is 
        curl_setopt ($this->curl, CURLOPT_COOKIEFILE, realpath('cookie.txt'));
        curl_setopt ($this->curl, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt ($this->curl, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt ($this->curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (X11; U; Linux i586; de; rv:5.0) Gecko/20100101 Firefox/5.0');            
        curl_setopt ($this->curl, CURLOPT_REFERER, $referer);   // set referer
        curl_setopt ($this->curl, CURLOPT_SSL_VERIFYPEER, FALSE);// ssl certificate
        curl_setopt ($this->curl, CURLOPT_SSL_VERIFYHOST, 2);
        $result['EXE'] = curl_exec($this->curl);
        $result['INF'] = curl_getinfo($this->curl);
        $result['ERR'] = curl_error($this->curl);
        return $result;                 
}

并尝试使用代码进行分页

$loginUrl = "http://www.car4you.at/Haendlersuche";
$parameters = array("href" => "javascript:AjaxCallback_ResList('ResultList', 'Pager', '1_1874')");
$referer = "http://www.car4you.at/Haendlersuche";

$loginHTML = $crawler->postCurlReq($loginUrl,$parameters,$referer);

if ( empty($loginHTML['ERR']) ) { // if no error occure in opening url

print_r($loginHTML['EXE']);

}

第二种刮刮方法是显示结果的选择列表 10 20 50 如果我的脚本成功选择50,那么它也将是快乐的工作 并尝试了代码用于选择列表

$loginUrl = "http://www.car4you.at/Haendlersuche";
$parameters = array("value" => "50");
$referer = "http://www.car4you.at/Haendlersuche";

$loginHTML = $crawler->postCurlReq($loginUrl,$parameters,$referer);

if ( empty($loginHTML['ERR']) ) { // if no error occure in opening url

print_r($loginHTML['EXE']);

}

1 个答案:

答案 0 :(得分:2)

在抓取网站时,您不会运行浏览器,只需从网站上获取HTML响应即可。这意味着您无法运行JavaScript代码,您必须自己解析它,或者使用库来为您解析它。

然而,获取更多结果的任何AJAX按钮只是调用另一个URL(可能使用GET或POST变量),并且它们自己解析结果,或者将其粘贴在页面的HTML中。您可以使用Chrome或Firebug等中的开发者工具来计算正在进行的网址调用。然后,您可以抓取这些网址而不是原始网址,以提取信息。

在这种特殊情况下,它非常棘手,因为AJAX请求中有许多POST变量,并且发现模式并不简单,但它可能比尝试模拟JavaScript更容易。

通常,如果你真的想在扫描中模拟JavaScript的运行,可以运行浏览器,并以编程方式与它进行交互。这就是Selenium的作用,我怀疑使用Selenium可以毫不费力地完成这样的事情。通过嗅探AJAX请求,可能更容易做到这一点。