gpt4 book ai didi

javascript - 使用 curl 打开 url,单击 ajax 按钮,等待并获取响应 html

转载 作者:搜寻专家 更新时间:2023-10-31 21:09:51 25 4
gpt4 key购买 nike

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

}

第二种抓取方法是选择显示如下结果的列表102050如果我的脚本成功选择了 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']);

}

最佳答案

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

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

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

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

关于javascript - 使用 curl 打开 url,单击 ajax 按钮,等待并获取响应 html,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22881344/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com