初次使用curl抓取某宝购物网站内容时遇到了一些问题。

  1. 网站301/302跳转问题
  2. 网站js跳转问题
  3. http请求与https请求下抓取内容的不同

这里简单记录下问题和解决方案:

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对象

 

发表评论