HTTP请求中的User-Agent 判断浏览器类型的各种方法 网络爬虫的请求标示
本文由发表于4年前 | 网络知识 | 评论数 3 |  被围观 36,669 views+
而在Javascript中我们也提供了相关的API获取当前浏览器的信息:在PHP中也提供了相关的API:此外还可以使用条件注释语句:网络爬虫的爬取问题

我们知道,当用户发送一个http请求的时候,浏览的的版本信息也包含在了http请求信息中:

2013081201

如上图所示,请求 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宅的的一份统计数据:

2013081202

我们可以看到主要是来自以下几个搜索引擎:

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中模拟一下:

2013081203

访问之后可以发现返回了需要的结果:

2013081204

除了文章中有特别说明,均为IT宅原创文章,转载请以链接形式注明出处。
本文链接:http://www.itzhai.com/http-request-user-agent-determines-the-type-of-browser-requests-a-variety-of-ways-web-crawler-marked.html
关键字:
arthinking Java技术交流群:280755654,入门群:428693174 more
分享到:
 
2013 8/12
文章评论
    3条评论
  1. JK 2014年12月19日13:35:17  #-49楼 回复 回复

    不错的文章,刚好碰到这问题,挺有用的。转走,不谢!:)

给我留言

有人回复时邮件通知我
网络知识的相关文章
随机文章 本月热门 热评
1 使用SVN客户端Subclipse获取Spring的源代码 2011/11/29
2 JVM 类加载器介绍及其父亲委托机制 Parent Delegation 2011/11/5
3 Hibernate笔记 – Hibernate在项目中的使用和基本和配置 2011/7/16
4 基于分享式的试题库系统 | Project 2011/11/14
5 Java基础笔记 – 线程同步问题 解决同步问题的方法 synchronized方法 同步代码块 2011/10/24
6 jQuery中使用Ajax获取JSON格式数据 2011/5/17
友情推荐 更多
破博客 文官洗碗安天下,武将打怪定乾坤。多么美好的年代,思之令人泪落。
Mr.5's Life 白天是一名程序员,晚上就是个有抱负的探索者
行知-追寻技术之美 关注大数据,分布式系统
我爱编程 编程成长轨迹
Cynthia's Blog 学习笔记 知识总结 思考感悟
 
欢迎关注我的公众号 IT宅
关于IT宅 文章归档

IT宅中的文章除了标题注明转载或有特别说明的文章,均为IT宅的技术知识总结,学习笔记或随笔。如果喜欢,请使用文章下面提供的分享组件。转载请注明出处并加入文章的原链接。 感谢大家的支持。

联系我们:admin@itzhai.com

Theme by arthinking. Copyright © 2011-2015 IT宅.com 保留所有权利.