我们知道,当用户发送一个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)

HTTP请求中的User-Agent 判断浏览器类型的各种方法 网络爬虫的请求标示的更多相关文章

  1. js 判断浏览器类型

    前言 工作中需要用到判断浏览器类型,网上找到的内容不怎么全,故在此进行一下总结. 一.不同浏览器及版本下User-Agent信息 待续.....欢迎补充 二.根据User-Agent信息进行判断 参考 ...

  2. JS判断浏览器类型及版本

    浏览器 ie firefox opera safari chrome 分类: 一路辛酸---JavaScript 你知道世界上有多少种浏览器吗?除了我们熟知的IE, Firefox, Opera, S ...

  3. JavaScript判断浏览器类型及版本

    JavaScript是前端开发的主要语言,我们可以通过编写JavaScript程序来判断浏览器的类型及版本.JavaScript判断浏览器类型一般有两种办法,一种是根据各种浏览器独有的属性来分辨,另一 ...

  4. js判断浏览器类型 js判断ie6不执行

    js判断浏览器类型 $.browser  对象 $.browser.version 浏览器版本 var binfo = ''; if ($.browser.msie) { binfo = " ...

  5. 判断浏览器类型-----------navigator.userAgent.indexOf()

    <script language="JavaScript"> <!-- function getOs() { var OsObject = "" ...

  6. [转]JQuery判断浏览器类型版本1.9和2.0之后的区别

    转至:http://zhidao.baidu.com/link?url=Nzk2aSxBKRZKYg9Evqn8hLwMyXTI-4jza-zCAZq4Vd6hWCOHIvuBX6yj8hzDYDrf ...

  7. 使用javascript判断浏览器类型

    之前在项目中遇到过要针对不同浏览器做不同的一些js或者css操作,后来某个朋友也突然问到这个问题,所以,整理了一下,在这里留个笔记,方便以后使用. 使用javascript判断浏览器类型: funct ...

  8. js判断浏览器类型以及版本

    你知道世界上有多少种浏览器吗?除了我们熟知的IE, Firefox, Opera, Safari四大浏览器之外,世界上还有近百种浏览器. 几天前,浏览器家族有刚诞生了一位小王子,就是Google推出的 ...

  9. Js 判断浏览器类型整理

    判断原理 JavaScript是前端开发的主要语言,我们可以通过 编写JavaScript程序来判断浏览器的类型及版本.JavaScript判断浏览器类型一般有两种办法,一种是根据各种浏览器独有的属性 ...

随机推荐

  1. 【Hibernate】Hibernate系列7之二级缓存

    二级缓存 7.1.概述 7.2.配置方法

  2. MVC数据验证

    深入浅出 MVC 数据验证 2.0 [附演示源码] 今天在这里给大家介绍一下MVC的数据验证框架. 在1.0版中,很多朋友提出了怎么使用客户端验证,今天找了一些资料,发现了客户端验证的方法. 1.MV ...

  3. 34.数组中2个只出现一次的数字[Find two numbers which appear once]

    [题目] 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度是O(n),空间复杂度是O(1). [分析] 这是一道很新颖的关于位运算的面试题. ...

  4. Java读写文件的几种方式

    自工作以后好久没有整理Java的基础知识了.趁有时间,整理一下Java文件操作的几种方式.无论哪种编程语言,文件读写操作时避免不了的一件事情,Java也不例外.Java读写文件一般是通过字节.字符和行 ...

  5. 六间房 繁星 酷我 来疯 秀吧 新浪秀 直播播放器 Live 1.2

    适合用于进行录制的时候 特别说明: 安装 falsh play 19 时 不能正常播放 每个按钮都有提示,不详细说明 下载地址 http://pan.baidu.com/s/1i32ETIt 下载地址 ...

  6. Java for LeetCode 064 Minimum Path Sum

    Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which ...

  7. mybatis异常:Improper inline parameter map format. Should be: #{propName,attr1=val1,attr2=val2}问题分析及解决

    转载自:http://blog.csdn.net/jackpk/article/details/44158701 mybatis异常:Improper inline parameter map for ...

  8. IncDec Sequence(codevs 2098)

    题目描述 Description 给定一个长度为n的数列{a1,a2...an},每次可以选择一个区间[l,r],使这个区间内的数都加一或者都减一. 问至少需要多少次操作才能使数列中的所有数都一样,并 ...

  9. Android之canvas详解

    首先说一下canvas类: Class Overview The Canvas class holds the "draw" calls. To draw something, y ...

  10. Bitset 用法(STL)

    std::bitset是STL的一个模板类,它的参数是整形的数值,使用位的方式和数组区别不大,相当于只能存一个位的数组.下面看一个例子 bitset<20> b1(5); cout< ...