我们知道,当用户发送一个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. QQ,MSN,Skype在线客服代码

    QQ,MSN,Skype在线客服代码 在网站建设时,为了更好的实施网站的营销型,会用到QQ,MSN等在线交流,以便客户能够快捷方便的联系我们.在这里,提供QQ,MSN的在线客服代码给大家分享: 1.Q ...

  2. 【云计算】Docker Nginx示例

    使用数据卷容器,配置Nginx Docker作为静态文件服务器 . 该方法是直接使用命令行,当然也可使用Dockerfile文件进行创建. 其实,使用docker创建nginx容器是很简单的,但要和数 ...

  3. 【leetcode】Best Time to Buy and Sell Stock II

    Best Time to Buy and Sell Stock II Say you have an array for which the ith element is the price of a ...

  4. WPF 将PPT,Word转成图片

    在Office下,PowerPoint可以直接把每张幻灯片转成图片,而Word不能直接保存图片.所以只能通过先转换成xps文件,然后再转成图片. 一.PPT 保存为图片 /// <summary ...

  5. 【JAVA、C++】 LeetCode 008 String to Integer (atoi)

    Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input cases. ...

  6. HDU 4059 容斥原理+快速幂+逆元

    E - The Boss on Mars Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64 ...

  7. ip数据结构

    本文摘自 linux kernel ip.h,感谢开源的GNU struct ip { #if __BYTE_ORDER == __LITTLE_ENDIAN unsigned int ip_hl:4 ...

  8. 一、HTML和CSS基础--HTML+CSS基础课程--第1部分

    第一章 HTML介绍 Html和CSS的关系 1. HTML是网页内容的载体.内容就是网页制作者放在页面上想要让用户浏览的信息,可以包含文字.图片.视频等. 2. CSS样式是表现.就像网页的外衣.比 ...

  9. java中值类型和引用类型的区别

    [定义] 引用类型表示你操作的数据是同一个,也就是说当你传一个参数给另一个方法时,你在另一个方法中改变这个变量的值,那么调用这个方法是传入的变量的值也将改变. 值类型表示复制一个当前变量传给方法,当你 ...

  10. 随机sample文件Python程序

    经常遇到由于样本巨大,需要sample一部分文件进行案例分析的情况,下面的程序主要为了随机抽取一个大文件中的N行. #!/usr/bin/python # -*- coding: <encodi ...