【问题标题】:Open url with curl, click on ajax button, wait and get response html用 curl 打开 url,点击 ajax 按钮,等待并获取响应 html
【发布时间】:2014-05-17 20:41:02
【问题描述】:

我要去刮http://www.car4you.at/Haendlersuche 它首次显示 20 个结果和分页。我成功抓取了 20 个链接,但由于分页的 href 中没有链接,因此无法获取到下一页的链接。它包含一个javascript函数。

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

}

【问题讨论】:

  • 和我现在遇到的问题一模一样!
  • hmmmm,如果你得到解决方案,也请在这里提供
  • 对不起!我真的没有!我转到了一个没有分页的页面!
  • 您不能在 PHP 中使用 cURL 运行 javascript,您必须弄清楚请求的内容和位置,或者使用无头浏览器来伪造用户操作。

标签: javascript php jquery ajax curl


【解决方案1】:

抓取网站时,您并没有运行浏览器,只是从该网站获取 HTML 响应。这意味着您不能只运行 JavaScript 代码,您必须自己解析它,或者可能使用一个库来为您解析它。

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

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

一般来说,如果你真的想在抓取中模拟 JavaScript 的运行,可以运行一个浏览器,并以编程方式与之交互。这就是Selenium 所做的事情,我怀疑这样的事情可以用 Selenium 相当轻松地完成。不过,通过嗅探 AJAX 请求可能更容易做到这一点。

【讨论】:

  • 感谢gandaliter详细解答
  • 没问题。希望对您有所帮助。
猜你喜欢
  • 2013-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-07
相关资源
最近更新 更多