工作中要采集一些網頁的數據,在php中常用到的采集函數就是file_get_contents和curl函數。php在用file_get_contents函數采集網站時,有時明明用瀏覽器可以看,但就是采不到任何內容。
這樣的問題我就遇到了,我要采集的這個頁面卻怎么也獲取不到數據,經過測試獲取百度、新浪、網易等頁面內容都是正常。這個問題讓我百思不得其解,於是找了個朋友來試試,他通過file_get_contents和curl函數獲取都是正常的。我就郁悶了,后來才知道他用的是nginx的web服務器,我的是apache服務器。
通過不斷的測試和查找資料,發現原來是php的User Agent的問題。這很有可能是服務器上做了設置,通過php $_SERVER["HTTP_USER_AGENT"]獲取 User_agent判斷是否為正常的瀏覽器請求 ,因為默認php的file_get_contents函數是不發送ua的。
我們就來認識下什么是User Agent,User Agent中文名為用戶代理,簡稱 UA,它是一個特殊字符串頭,使得服務器能夠識別客戶使用的操作系統及版本、CPU 類型、瀏覽器及版本、瀏覽器渲染引擎、瀏覽器語言、瀏覽器插件等。
我通過測試,在要抓取的頁面輸出變量$_SERVER["HTTP_USER_AGENT"]為空。這樣在被抓取的服務器通過php來獲取$_SERVER["HTTP_USER_AGENT"]的值,如果為空的話,就跳轉到404錯誤頁面,這樣就無法抓取到頁面信息。
說下上面朋友nginx服務器可以采集的原因,估計是nginx在編譯的時候,開啟了UA代理。這個大家可以測試下。
解決這個問題有2種方法
1、設置php.ini配置文件,找到user_agent這個開啟,把前面的分號去掉;
2、通過php的ini_set()方法設置用戶代理。
實例如下
ini_set(‘user_agent’,'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322)’);
echo file_get_contents(‘你想要采集的頁面url’);
通過上面2種方法就可以讓$_SERVER["HTTP_USER_AGENT"]的值不為空,就可以順利的采集到你想要的內容。
注意:在設置user_agent的時候,最好使用瀏覽器的版本或者蜘蛛,像我上面設置的是火狐的,這樣被采集的服務器就會正常的通過認證。因為服務器不會屏蔽蜘蛛或者瀏覽器的版本的,這個問題你應該清楚吧,哈哈。如果他要是把這個也屏蔽了的話,那就是不讓蜘蛛抓取頁面,也無法識別用戶使用的瀏覽器里。
出處:http://blog.sina.com.cn/s/blog_5d6c3a1f0101nmii.html //設置http 頭部個息header就不行了嗎?