2014-04-05 26 views
3

我要抓http://www.car4you.at/Haendlersuche 它显示20个结果第一次和分页。我成功地抓取了20个链接,但由于分页中没有链接,因此无法链接到下一页。它包含一个javascript函数。用curl打开网址,点击ajax按钮,等待并得到回复html

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

我的问题是如何加载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个结果如果我的脚本成功选择50那么它也就会b Ë快乐工作 并试图代码是选择列表

$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']); 

} 
+0

我现在正面临同样的问题! – sunny

+0

嗯如果你得到解决方案,请在这里提供 –

+0

m对不起!我真的没有一个!我转向了一个没有分页的页面! – sunny

回答

2

当刮网站,你不运行的浏览器,只需拿起从网站的HTML响应。这意味着你不能只运行JavaScript代码,你必须自己解析它,或者使用库来解析它。

但是那获取更多的结果只是调用另一个URL(或许与GET或POST变量),并自己分析的结果,或在页面的HTML某处坚持任何AJAX按钮。您可以计算出使用Chrome中的开发人员工具或Firebug等进行的网址调用。然后,您可以抓取这些网址而不是原始网址来提取信息。

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

在一般情况下,如果你真的想要模拟刮的JavaScript的运行,可以运行浏览器,有了它编程交互。这就是Selenium所做的,我怀疑这样的事情可以用Selenium很轻松地完成。尽管通过嗅探AJAX请求可能仍然更容易。

+0

感谢gandaliter的详细解答 –

+0

没问题。希望能帮助到你。 – gandaliter