1. 程式人生 > >curl抓取頁面時遇到重定向的解決方法

curl抓取頁面時遇到重定向的解決方法

phpcurl抓取網頁遇到了問題,為闡述方便,將程式碼簡化如下:

  1. <?php
  2. function curlGet($url) {
  3. $ch = curl_init();
  4. curl_setopt($ch, CURLOPT_URL, $url);
  5. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  6. curl_setopt($ch, CURLOPT_HEADER, true);
  7. return curl_exec($ch);
  8. }
  9. $url = 'http://144go.com';
  10. echo curlGet($url), "\n"
    ;
程式碼的目的很簡單,抓取頁面:http://www.144go.com
執行上述程式碼,得到的結果:
  1. HTTP/1.1 301 Moved Permanently
  2. Content-Length: 144
  3. Content-Type: text/html
  4. Location: http://www.144go.com/
  5. Server: Microsoft-IIS/6.0
  6. X-Powered-By: ASP.NET
  7. Date: Mon, 03 Sep 2012 04:25:22 GMT
  8. &lt;head&gt;&lt;title&gt;Document Moved&lt;/title&gt;&lt;/head
    &gt;
  9. &lt;body&gt;&lt;h1&gt;Object Moved&lt;/h1&gt;This document may be found &lt;a HREF="http://www.144go.com/"&gt;here&lt;/a&gt;&lt;/body&gt;
由結果中的
Location: http://www.144go.com/
可知http://144go.com被重定向到了http://www.144go.com/

怎麼辦呢,要用正則分析出Location部分的連結,重複執行執行curlGet嗎?行到是行,就是有點麻煩。

其實只要加一條語就可以了:

  1. <?php
  2. function curlGet($url) {
  3. $ch = curl_init();
  4. curl_setopt($ch, CURLOPT_URL, $url);
  5. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  6. curl_setopt($ch, CURLOPT_HEADER, true);
  7.   //函式中加入下面這條語句
  8. curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
  9. return curl_exec($ch);
  10. }
再次執行程式碼,可以抓取到想要的頁面。

CURLOPT_FOLLOWLOCATION指明:
curl遞迴的抓取http頭中Location中指明的url
當抓取次數超過CURLOPT_MAXREDIRS時,遞迴將終止。
在抓取中任何跳轉帶來的問題,都可通過設定此引數解決。