2011-02-17 20 views
0

我已经建立了一个curl请求,它可以在许多站点上正常工作,其中大部分使用框架,并且在返回相关消息的情况下使用noframes标签,如果浏览器使用的框架不支持框架,则返回整页框架集,我使用Domdocument遍历。如何让CURL请求返回'noframes'页面?

但是,一个站点只会返回页面,指出'您将需要支持框架的浏览器'。我正在通过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/杂货/ index.jsp

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

任何意见或卷曲脚本的作品,将不胜感激。

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

+0

你应该比较提琴手的请求。 – SLaks 2011-02-17 14:16:29

回答

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."; 
} 
?> 
+0

穆罕默德,你的明星,非常感谢你! – Rich2020 2011-02-17 16:39:34