用curl打开url,点击ajax按钮,等待并得到响应html
Open url with curl, click on ajax button, wait and get response html
我要刮 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']);
}
第二种抓取方法是选择列表,显示结果,例如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 在抓取中的运行,可以运行一个浏览器,并以编程方式与之交互。这就是硒的作用,我怀疑这样的事情可以用硒相当轻松地完成。不过,通过嗅探 AJAX 请求可能仍然更容易做到这一点。
相关文章:
- 如何在jquery ajax成功html响应中找到输入隐藏元素
- 如何从php返回php变量值以及html响应ajax
- 鼠标在HTML 5响应画布中的位置
- 为什么不't使用PHP动态生成的HTML响应JavaScript
- 如何从html响应解析javascript数组(包含JSON对象作为元素)
- Rails Application 发送 HTML 响应而不是 JS
- html 响应数据 ID 不能在 Facebook API 调用中用作字符串
- 在 C# 中从 HTML 响应中解析 javascript 值
- 将AJAX HTML响应读取到JavaScript数组中
- 检查ajax调用的html响应中是否存在类或id
- 如何在x-editable中打印html响应(tinymce)
- 将当前页面数据存储在一个变量中,其格式/结构与Ajax html响应相同
- 解析AJAX HTML响应:我可以找到元素,但不能访问它们的innerHTML或值
- AJAX HTML响应中的链接在被点击后会失去点击
- 使用 Web 代理修改从网站返回的 html 响应
- 我怎样才能进行“剥离”呢?包含HTML响应,可以是任何东西
- 如何在浏览器上加载html响应使用ajax调用
- 基于设备的HTML响应式链接
- 用Javascript提交表单会导致html响应,而不是AJAX响应
- Jquery的Html响应不能与javascript一起工作