代码如下:function open_https_url($url,$postfields = '',$cookie_file = '',$referer = ''){
$curl = curl_init();
$options = array(
CURLOPT_URL => $url, // 地址
CURLOPT_HEADER => 0,
CURLOPT_NOBODY => 0, CURLOPT_PORT => 443, CURLOPT_RETURNTRANSFER => 1,
CURLOPT_FOLLOWLOCATION => 1, // 使用自动跳转 CURLOPT_SSL_VERIFYHOST => FALSE,
CURLOPT_SSL_VERIFYPEER => FALSE, CURLOPT_REFERER => $referer
);
if($postfields)
{
$options[CURLOPT_POST] = 1;
$options[CURLOPT_POSTFIELDS] = $postfields;
} if($cookie_file)
{
$options[CURLOPT_COOKIEJAR] = $cookie_file; // 存放Cookie信息的文件名称
$options[CURLOPT_COOKIEFILE] = $cookie_file; // 读取上面所储存的Cookie信息
} curl_setopt_array($curl, $options);
$result = curl_exec($curl);
$error = curl_error($curl);
curl_close($curl);
// 如果出错
return $error ? $error : $result;
}set_time_limit(0);
// 设置Cookie文件保存路径及文件名
$cookie_file = dirname(__FILE__)."/cookie_".md5(basename(__FILE__)).".txt";$url = 'https://member.mycard520.com.tw/Login/MemberLogin.aspx?ReturnUrl=%2fDefault.aspx';
$postfields = array();
echo open_https_url($url,$postfields,$cookie_file,'');无论怎么弄都是提示 Maximum (20) redirects followed ,真不知道是怎么回请高手帮忙分析一下这个页面。
把 $url 修改成其它的都没有问题,如:$url = 'https://www.mycard520.com.tw/mycardstore/store.aspx';
echo open_https_url($url);都能正常显示的呀。
$curl = curl_init();
$options = array(
CURLOPT_URL => $url, // 地址
CURLOPT_HEADER => 0,
CURLOPT_NOBODY => 0, CURLOPT_PORT => 443, CURLOPT_RETURNTRANSFER => 1,
CURLOPT_FOLLOWLOCATION => 1, // 使用自动跳转 CURLOPT_SSL_VERIFYHOST => FALSE,
CURLOPT_SSL_VERIFYPEER => FALSE, CURLOPT_REFERER => $referer
);
if($postfields)
{
$options[CURLOPT_POST] = 1;
$options[CURLOPT_POSTFIELDS] = $postfields;
} if($cookie_file)
{
$options[CURLOPT_COOKIEJAR] = $cookie_file; // 存放Cookie信息的文件名称
$options[CURLOPT_COOKIEFILE] = $cookie_file; // 读取上面所储存的Cookie信息
} curl_setopt_array($curl, $options);
$result = curl_exec($curl);
$error = curl_error($curl);
curl_close($curl);
// 如果出错
return $error ? $error : $result;
}set_time_limit(0);
// 设置Cookie文件保存路径及文件名
$cookie_file = dirname(__FILE__)."/cookie_".md5(basename(__FILE__)).".txt";$url = 'https://member.mycard520.com.tw/Login/MemberLogin.aspx?ReturnUrl=%2fDefault.aspx';
$postfields = array();
echo open_https_url($url,$postfields,$cookie_file,'');无论怎么弄都是提示 Maximum (20) redirects followed ,真不知道是怎么回请高手帮忙分析一下这个页面。
把 $url 修改成其它的都没有问题,如:$url = 'https://www.mycard520.com.tw/mycardstore/store.aspx';
echo open_https_url($url);都能正常显示的呀。
+++
同意这种看法!用HTTP分析工具看看到底转了几个地方。
HTTPS的协议,需要SSL,而你的代码里:
CURLOPT_SSL_VERIFYHOST => FALSE,
CURLOPT_SSL_VERIFYPEER => FALSE,
都是FALSE。
我想问题应该就是出在这里。对SSL的设置不太清楚。你可以GOOGLE找找资料看看如何设置这种HTTPS协议的。
这个地址。返回的。NET应用程序错误提示:
MyCardMemberService.Main.TreeView1_TreeNodeDataBound(Object sender, TreeNodeEventArgs e) in D:\MyCardWork\MyCardWeb\MyCardMemberService\MyCardMemberService\MasterPages\Main.Master.vb:18
System.Web.UI.WebControls.TreeView.OnTreeNodeDataBound(TreeNodeEventArgs e) +108
System.Web.UI.WebControls.TreeView.DataBindRecursive(TreeNode node, IHierarchicalEnumerable enumerable, Boolean ignorePopulateOnDemand) +2923
System.Web.UI.WebControls.TreeView.DataBindNode(TreeNode node) +285
System.Web.UI.WebControls.TreeView.PerformDataBinding() +120
System.Web.UI.WebControls.HierarchicalDataBoundControl.PerformSelect() +85
System.Web.UI.WebControls.BaseDataBoundControl.DataBind() +73
System.Web.UI.WebControls.TreeView.DataBind() +4
System.Web.UI.WebControls.BaseDataBoundControl.EnsureDataBound() +82
System.Web.UI.WebControls.BaseDataBoundControl.OnPreRender(EventArgs e) +22
System.Web.UI.WebControls.TreeView.OnPreRender(EventArgs e) +36
System.Web.UI.Control.PreRenderRecursiveInternal() +80
System.Web.UI.Control.PreRenderRecursiveInternal() +171
System.Web.UI.Control.PreRenderRecursiveInternal() +171
System.Web.UI.Control.PreRenderRecursiveInternal() +171
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +842
CURLOPT_SSL_VERIFYPEER => FALSE,
这两句是正确的.
你的代码已经能得到网页了.但问题是这个页面还使用了JS,而PHP的这种抓取不可能执行JS脚本,因此导致了ASP.NET页面的出错提示.不过从抛出的异常来看.这个网站做的实在是:不设防.
PHP的抓取无法抓取这种需要在客户端进行一定处理的页面.正常情况下,你抓取的页面如果客户端脚本未被执行,也可以获取页面HTML的,但问题是这个网站做的实在是太可爱了
要想抓取,除非你调用浏览器,或者IE或者火狐,或者你用.NET做,调用其Webbrowser控件,否则,你只能自己用PHP实现JAVASCRIPT的解析了
$curl=curl_init('https://member.mycard520.com.tw/Login/MemberLogin.aspx?ReturnUrl=%2fDefault.aspx');
curl_setopt($curl, CURLOPT_AUTOREFERER, 1);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($curl, CURLOPT_MAXREDIRS, 1000);$html=curl_exec($curl);
var_dump($html);