我們知道,當用戶發送一個http請求的時候,瀏覽的的版本信息也包含在了http請求信息中:
如上圖所示,請求 google plus 請求頭就包含了用戶的瀏覽器信息:
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36
我們可以通過服務器端語言提供的相關API獲取客戶端的瀏覽器信息,進而對不同的瀏覽器返回不同的html文檔,這樣就可以針對現代瀏覽器返回絢麗的展示頁面了。
而在Javascript中我們也提供了相關的API獲取當前瀏覽器的信息:
navigator.userAgent
userAgent中提供給了瀏覽器將要發送給服務器端的http請求頭中user-agent的信息。獲取到這個信息之后我們可以通過正則匹配獲取到瀏覽器和版本信息:
//獲取瀏覽器發送的userAgent信息 var userAgentInfo = navigator.userAgent.toLowerCase(); document.write(userAgentInfo + '<br />'); /** * 輸出運行的瀏覽器信息: * Chrome: mozilla/5.0 (windows nt 6.1; wow64) applewebkit/537.36 (khtml, like gecko) chrome/27.0.1453.94 safari/537.36 * IE10: mozilla/5.0 (windows nt 6.1; wow64) applewebkit/537.36 (khtml, like gecko) chrome/27.0.1453.94 safari/537.36 */ // 通過正則匹配獲取瀏覽類型和版本 // 例如可以這樣獲取IE的 var agent = {}; if (window.ActiveXObject) agent.ie = userAgentInfo.match(/msie ([\d.]+)/)[1]; // 下面就輸出信息 if(agent.ie) document.write(agent.ie); // IE瀏覽器下輸出瀏覽下版本號,其他瀏覽器沒有輸出信息
在PHP中也提供了相關的API:
strpos() 函數返回字符串在另一個字符串中第一次出現的位置。 如果沒有找到該字符串,則返回 false。
$_SERVER 中存放着很多服務器的變量,其中$_SERVER['HTTP_USER_AGENT'] #當前請求的 User_Agent: 頭部的內容。
可以像下面這樣判斷請求者的瀏覽器和版本,注意,這里的版本可以是訪問者偽造的,不一定正確。
<?php if(strpos($_SERVER["HTTP_USER_AGENT"],"MSIE8.0")) echo"IE8.0"; elseif(strpos($_SERVER["HTTP_USER_AGENT"],"MSIE7.0")) echo"IE7.0"; elseif(strpos($_SERVER["HTTP_USER_AGENT"],"MSIE6.0")) echo"IE6.0"; elseif(strpos($_SERVER["HTTP_USER_AGENT"],"Firefox/17")) echo"Firefox17"; elseif(strpos($_SERVER["HTTP_USER_AGENT"],"Firefox/16")) echo"Firefox16"; elseif(strpos($_SERVER["HTTP_USER_AGENT"],"Chrome")) echo"Chrome"; elseif(strpos($_SERVER["HTTP_USER_AGENT"],"Safari")) echo"Safari"; elseif(strpos($_SERVER["HTTP_USER_AGENT"],"Opera")) echo"Opera"; else echo$_SERVER["HTTP_USER_AGENT"]; ?>
此外還可以使用條件注釋語句:
條件注釋 (conditional comment) 是於HTML源碼中被 Microsoft Internet Explorer 有條件解釋的語句。條件注釋可被用來向 Internet Explorer 提供及隱藏代碼。
條件注釋最初於微軟的 Internet Explorer 5瀏覽器中出現,並且直至 Internet Explorer 9 均支持。[1]微軟已宣布於 Internet Explorer 10 中以標准模式處理頁面 - 如 HTML5 - 時停止支持,但是舊版網頁使用這種技術(於兼容性視圖)將繼續有效。
<!--[if !IE]><!--> 除IE外都可識別 <!--<![endif]--> <!--[if IE]> 所有的IE可識別 <![endif]--> <!--[if IE 6]> 僅IE6可識別 <![endif]--> <!--[if lt IE 6]> IE6以下版本可識別 <![endif]--> <!--[if gte IE 6]> IE6以及IE6以上版本可識別 <![endif]--> <!--[if IE 7]> 僅IE7可識別 <![endif]--> <!--[if lt IE 7]> IE7以下版本可識別 <![endif]--> <!--[if gte IE 7]> IE7以及IE7以上版本可識別 <![endif]--> <!--[if IE 8]> 僅IE8可識別 <![endif]--> <!--[if IE 9]> 僅IE9可識別 <![endif]-->
網絡爬蟲的爬取問題
接下來可能會遇到的就是網絡爬蟲的爬取問題,我們應該給爬蟲返回怎樣的頁面才能保證給爬蟲提供的頁面最適合於網站的SEO呢。其實爬蟲請求頭中的User-Agent也包含了特殊的標記信息,我們獲取到該信息判斷是否爬蟲,然后返回最佳的SEO頁面就可以了。
網絡爬蟲在發送http請求獲取網頁數據時也會在頭部附加 User-Agent信息,特別注意的一點就是有些野蜘蛛 User-Agent信息為空,這樣就需要在程序中做是否為空的判斷,防止robots.txt 文件也對它的限制無效,導致不斷的爬去你的網站。
可以向下面這樣,判斷到訪問者的User-Agent為空,則返回404:
<?php $flag = false; $ua = $SERVER['HTTP_USER_AGENT']; if($ua == ''){ $flag = true; } if($flag){ header('HTTP/1.1 404 Not Found'); header("status: 404 Not Found"); echo '您的請求未通過我們的驗證!'; exit(); } ?>
我們網站的流量主要是從哪幾個搜索引擎獲取的呢,這里是IT宅的的一份統計數據:
我們可以看到主要是來自以下幾個搜索引擎:
www.baidu.com www.google.com so.360.cn
下面是官方給出的一些user agent信息:
百度:http://www.baidu.com/search/spider.htm google:https://support.google.com/webmasters/answer/1061943 360:http://www.so.com/help/help_3_2.html soso:http://help.soso.com/webspider.htm sogou:http://www.sogou.com/docs/help/webmasters.htm#07
所以我們需要匹配的userAgent關鍵字如下:
Baiduspider
Googlebot
360Spider
Sosospider
sogou spider
如下函數即可判斷是否屬於上面所列舉的spider:
<?php function isSpider(){ $ua = strtolower($_SERVER['HTTP_USER_AGENT']); if(!empty($ua)){ $spiderAgentArr = array( "Baiduspider", "Googlebot", "360Spider", "Sosospider", "sogou spider" ); foreach($spiderAgentArr as $val){ $spiderAgent = strtolower($val); if(strpos($ua, $spiderAgent) !== false){ return true; } } return false; } else { return false; } } echo $_SERVER['HTTP_USER_AGENT']; if(isSpider()){ echo '爬蟲正在訪問網站'; } else { echo '不是爬蟲訪問網站'; } ?>
所以我們可以這樣根據不同的訪問用戶提供不同的響應結果。
我們可以模擬一下百度的網絡爬蟲爬取數據,我們在Chrome中模擬一下:
訪問之后可以發現返回了需要的結果:
(轉自:http://www.itzhai.com/http-request-user-agent-determines-the-type-of-browser-requests-a-variety-of-ways-web-crawler-marked.html)