2014年2月4日 星期二

PHP : file_get_contents 加 HTTP Headers

2014年2月4日 星期二
有個以前可以抓網頁的網站突然抓不到想要的內容,手動在瀏覽器中輸入網址可以看到內容,而以 PHP 的「file_get_contents」卻只出現錯誤訊息,很明顯加了道關卡,一般的方法,不外乎檢查 HTTP Headers:User-Agent、Referer......,以前使用「file_get_contents」都是傻傻的直接呼叫,為了「破關」,這下就得使用更底層的方法囉!

查了 PHP 的參考手冊:

string file_get_contents ( string $filename [, int $flags = 0 [, resource $context [, int $offset = -1 [, int $maxlen = -1 ]]]] )

第三個參數「$context」是關鍵,參考了它的範例,多送出「User-Agent」的 Header ,模擬成人使用瀏覽器來擷取內容的試試:

$url = 'http://xxx.xxx.edu.tw/';

$opts = array(
   'http'=>array(
      'header'=>"User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW; rv:1.9.2.28) Gecko/20120306 Firefox/3.6.28 ( .NET CLR 3.5.30729; .NET4.0E)\r\n"
   )
);

$context = stream_context_create($opts);

$html = file_get_contents($url, false, $context);

試了一下,哈!只用一個「User-Agent」就破關,防禦力太低了!

如果遇到要檢查 Referer 呢?把上面的 header 再加料,餵給 server 就是囉!

$url = 'http://xxx.xxx.edu.tw/';

$referer = 'http://xxx.xxx.edu.tw/rrrrr';

$opts = array(
   'http'=>array(
      'header'=>"User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW; rv:1.9.2.28) Gecko/20120306 Firefox/3.6.28 ( .NET CLR 3.5.30729; .NET4.0E)\r\n"
               ."Referer:".$referer."\r\n"
   )
);

$context = stream_context_create($opts);

$html = file_get_contents($url, false, $context);

如果還需要其它的 HTTP Headers 就繼續加。


1 則留言:

  1. 原來php_get_contents()還能這樣用
    長知識了,謝謝您!

    回覆刪除

 
雄::gsyan © 2009. Design by Pocket