解決php無法通過file_get_contents或curl采集頁面內容


工作中要采集一些網頁的數據,在php中常用到的采集函數就是file_get_contentscurl函數。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、通過phpini_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就不行了嗎?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM