初次使用curl抓取某宝购物网站内容时遇到了一些问题。
这里简单记录下问题和解决方案:
1. curl抓住页面常规方法:
$my_curl = curl_init(); //初始化一个curl对象 $url = "www.soosmart.com"; curl_setopt($my_curl, CURLOPT_URL, $url); //设置抓取的URL curl_setopt($my_curl, CURLOPT_RETURNTRANSFER,1); //设置是将结果保存到字符串中 $str = curl_exec($my_curl); //执行请求 curl_close($curl); //关闭化一个curl对象
2. 网站页面跳转的情况下,$str就会为false/empty. 需要通过CURL_FOLLOWLOCATION来跟踪到下一个链接,直至最后。CURL_MAXREDIRS可以控制跟踪层级。
$my_curl = curl_init(); //初始化一个curl对象
$url = "www.sooscc.com";
curl_setopt($my_curl, CURLOPT_URL, $url); //设置抓取的URL
curl_setopt($my_curl, CURLOPT_RETURNTRANSFER,1); //设置是将结果保存到字符串中
curl_setopt($my_curl, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($my_curl, CURLOPT_MAXREDIRS,5);
curl_setopt($my_curl, CURLOPT_TIMEOUT, 30);
$str = curl_exec($my_curl); //执行请求
curl_close($curl); //关闭化一个curl对象
那如果获取最终访问的location呢?通过CURLINFO_EFFECTIVE_URL获取最终生效链接。
$info = curl_getinfo($my_curl,CURLINFO_EFFECTIVE_URL);
3. 如果网站在跳转的过程中有一步是通过通过js来实现页面跳转,那么CURL_FOLLOWLOCATION就不起作用了,(它只跟踪到最后200响应状态码)。这给页面抓取带来了麻烦,不过方法还是有且清晰的。通过解析这个js跳转页,获取跳转url,重新抓取。问题即可解决。
4. 在抓取页面时还有一个就是协议问题,在https协议下,应添加下面的option来获取页面,否则返回的$str为false/empty。
$my_curl = curl_init(); //初始化一个curl对象
$url = "www.soosmart.com";
curl_setopt($my_curl, CURLOPT_URL, $url); //设置抓取的URL
curl_setopt($my_curl, CURLOPT_RETURNTRANSFER,1); //设置是将结果保存到字符串中
curl_setopt($my_curl, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($my_curl, CURLOPT_MAXREDIRS,5);
curl_setopt($my_curl, CURLOPT_TIMEOUT, 30);
curl_setopt($my_curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$str = curl_exec($my_curl); //执行请求
curl_close($curl); //关闭化一个curl对象