如何通过CURL请求返回'noframes'页面?

时间:2011-02-17 14:14:06

标签: php curl

我已经设置了一个curl请求,该请求可以在许多网站上正常运行,其中大多数都使用框架,并且如果使用的浏览器不支持框架,则返回带有相关消息的noframes标记,所有这些都返回整页框架集,我使用Domdocument进行遍历。

然而,一个站点只会返回页面,说明“你需要一个支持帧的浏览器”。我正在传递CURLOPT_USERAGENT,Mozilla / 5.0(Windows; U; Windows NT 6.1; en-GB; rv:1.9.2.13)Gecko / 20101203 Firefox / 3.6.13,我尝试了很多用户代理定义并阅读了尝试了各种其他卷曲选项,但没有运气。

我可以在工作的网站和不工作的网站之间看到的唯一区别是它声明了doctype: !DOCTYPE html PUBLIC“ - // W3C // DTD XHTML 1.0 Frameset // EN”“http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd”

而工作正常的网站将doctype声明为: !DOCTYPE html PUBLIC“ - // W3C // DTD XHTML 1.0 Transitional // EN”“http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”

有问题的网址是:http://www.sainsburys.co.uk/groceries/index.jsp

我当然可以通过使用直接URL到框架集内的链接来访问我想要的框架集,但我宁愿从索引文件入口点开始,而不是硬编码链接到我随时间变化的页面。

任何有效的建议或卷曲脚本都会非常感激。

顺便说一句:收集的信息的使用在可接受的使用范围内。

1 个答案:

答案 0 :(得分:0)

我得到了包含两个框架的完整页面:
第一个:请求index.jsp从javascript代码中获取会话数据 第二次:再次请求index.jsp,但这次是将会话数据传递给它 这是我过去常用的代码:

<?php

function getGROSESSIONID(){
   $ch = curl_init();

   curl_setopt($ch, CURLOPT_URL, 'http://www.sainsburys.co.uk/groceries/index.jsp');
   curl_setopt($ch, CURLOPT_HEADER, 1);
   curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9) Gecko/2008052906 Firefox/3.0');
   curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

   $page_contents = curl_exec($ch);

   curl_close($ch);

   if(preg_match('/window\.location\.replace\(\"http\:\/\/www\.sainsburys\.co\.uk\/groceries\/frameset\/redirect\.jsp\;(.*)\"\)\;/', $page_contents, $matches)){
      return $matches[1];
   }
   return false;
}

function getSainsburysIndex($session_data){
   if($session_data == ''){
      return false;
   }
   $ch = curl_init();

   curl_setopt($ch, CURLOPT_URL, 'http://www.sainsburys.co.uk/groceries/index.jsp;'.$session_data);
   curl_setopt($ch, CURLOPT_HEADER, 0);
   curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9) Gecko/2008052906 Firefox/3.0');
   curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

   $page_contents = curl_exec($ch);

   curl_close($ch);

   return $page_contents;
}

$sessData = getGROSESSIONID();

if(false !== $sessData){
    echo "<pre>";
    print_r(htmlspecialchars(getSainsburysIndex($sessData)));
    echo "</pre>";
}else{
    echo "can not get session id.";
}
?>