Tuesday, June 26, 2018

PHP + cURL 爬蟲基本語法

寫程式常常會聽到: 不要重複發明輪子! 或 站在巨人的肩膀上.
意思是已經有很多工具可以用的時候, 學習使用工具就好. (當然授權也要注意.)

如果要做一個網站分析的程式, 首要工作就是把網站的內容抓下來.
抓網站內容就有一個好工具: cURL , 基本上沒有授權問題, 而且 PHP 內已經有相關語法可以直接使用(註1).

在 PHP 內使用 cURL 的步驟, 大約是:
1. curl_init() 初始化一個連線.
2. curl_setopt() 指定相關參數.
3. curl_exec() 連線抓取網站資料.
4. curl_close() 關閉連線.

這樣好像不知道要抓什麼? 其實全部都在 curl_setopt() 內設定, 以常用的功能來看:

$ch = curl_init() ;
$url = 'https://slimetw.blogspot.com/' ;
curl_setopt( $ch , CURLOPT_URL , $url ) ;
curl_setopt( $ch , CURLOPT_HEADER , true ) ;
curl_setopt( $ch , CURLOPT_RETURNTRANSFER , true ) ;
curl_setopt( $ch , CURLOPT_FOLLOWLOCATION , true ) ;
$temp = curl_exec( $ch ) ;
curl_close( $ch ) ;
echo strlen( $temp ) ;

指定一個網址, 然後抓取時連同 header 都抓(註2), 用 CURLOPT_FOLLOWLOCATION 設定允許轉址, 然後用 CURLOPT_RETURNTRANSFER 設定回傳的資料不是直接顯示, 而是可以轉給其他地方用.

執行這個 PHP 之後, 就會把網站本身的內容長度顯示出來, 這當然不是主要的功能, 而是連線測試, 以後只有網址跟存放的地方會換掉, 就可以寫成函式(function)多次呼叫使用.

註:
1. XAMPP 7.2.6 包含的 PHP 已經內建.
2. header 是由網站主機提供給瀏覽器用的參考資料, 一般不會呈現給使用者看, 不過假如以後要分析可能會用到, 所以先抓.