Tomcat和搜索引擎网络爬虫的攻防
不知道广大程序员朋友们注意到一个现象么?使用百度是无法搜索到淘宝网的网页。为什么会造成这种现象?这就要从网络爬虫说起了。
咱们程序员假如自己搭设个人网站,在上面分享少量自己的技术文章,面临的一个重要问题就是让搜索引擎能够搜索到自己的个人网站,这样才能让更多的读者访问到。
而搜索引擎如百度和微软Bing搜索,Google搜索等通过什么方式才能收录我们的个人网站呢?
答案是搜索引擎的网络爬虫。 网络爬虫是一个很形象的名词,是属于搜索引擎的工具,只有被这些网络爬虫“爬过”的内容才有机会出现在对应搜索引擎的搜索结果中。
个人站长对网络爬虫是又爱又恨。一方面,网络爬虫可以让我们的个人网站出现在搜索结果里,对我们的个人网站进行扩散。另一方面,假如网络爬虫太多太频繁地访问个人网站,会肯定程度上影响正常使用户的请求解决。
于是就有了文章开头我提到的百度搜不到淘宝产品信息的文章。
在浏览器里输入https://www.taobao.com/robots.txt,
能看到淘宝网的一个文件robots.txt:

随意选一段解释:这个robots.txt的意思是,淘宝网做出了规定,假如网络请求来自百度爬虫(Baiduspider), 那么只允许(allow)百度爬虫读取article, oshtml和/ershou, 不允许读取的是product。
User-agent: Baiduspider
Allow: /article
Allow: /oshtml
Allow: /ershou
Disallow: /product/
Disallow: /
那么淘宝网怎样知道一个请求是来自百度爬虫,还是来自真正的使用户访问呢?答案就是HTTP请求的User-agent字段。
下图是我使用Chrome访问淘宝网的HTTP请求的User-agent:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.84 Safari/537.36

再回到Tomcat。假如有大量来自网络爬虫的读取请求,Web服务器需要为每一个请求创立一个session。当Session数量变得巨大时,消耗的服务器内存和资源也是巨大的。
因而,Tomcat对于来自网络爬虫的请求,用同一个session来解决。
我们打开Tomcat的源代码来学习。
Tomcat的源代码可以到其官网去下载:
https://tomcat.apache.org/download-70.cgi
点这个链接:

我下载的是7.0.90版本,只有7MB大。
这里需要注意,即便Spider显式的传了一个 sessionId过来,也会弃使用,而是根据client Ip 来进行判断,即对于 相同的 Spider 只提供一个Session。
在下载好的源代码文件夹里,找到这个子文件夹:\apache-tomcat-7.0.90-src\java\org\apache\catalina\valves
打开CrawlerSessionManagerValve.java:
可以看到从第192行代码开始都是Tomcat使用来检测进来的网络请求能否是网络爬虫:

通过这个类里定义的正则表达式检测HTTP请求的user-agent字段来判断究竟该请求能否来自网络爬虫:

".[bB]ot.|.Yahoo! Slurp.|.Feedfetcher-Google."
一旦正则表达式在第205行匹配成功,将第206行的标志位设成true。

假如检测到是网络爬虫,则使用clientIdSessionId.get这个API获取Tomcat专门为网络爬虫预留的sessionId, 而后在第226行把该sessionId分配到进来的网络爬虫请求,这样就避免了白费太多的资源申请session来服务海量的网络爬虫请求,节省了Web服务器的资源。

要获取更多Jerry的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:


Tomcat和搜索引擎网络爬虫的攻防的更多相关文章
- [Search Engine] 搜索引擎技术之网络爬虫
随着互联网的大力发展,互联网称为信息的主要载体,而如何在互联网中搜集信息是互联网领域面临的一大挑战.网络爬虫技术是什么?其实网络爬虫技术就是指的网络数据的抓取,因为在网络中抓取数据是具有关联性的抓取, ...
- 基于Nutch+Hadoop+Hbase+ElasticSearch的网络爬虫及搜索引擎
基于Nutch+Hadoop+Hbase+ElasticSearch的网络爬虫及搜索引擎 网络爬虫架构在Nutch+Hadoop之上,是一个典型的分布式离线批量处理架构,有非常优异的吞吐量和抓取性能并 ...
- 什么是网络爬虫(Spider) 程序
Spider又叫WebCrawler或者Robot,是一个沿着链接漫游Web 文档集合的程序.它一般驻留在服务器上,通过给定的一些URL,利用HTTP等标准协议读取相应文档,然后以文档中包括的所有未访 ...
- 2.02_Python网络爬虫分类及其原理
一:通用爬虫和聚焦爬虫 根据使用场景,网络爬虫可分为 通用爬虫 和 聚焦爬虫 两种. 通用爬虫 通用网络爬虫是捜索引擎抓取系统(Baidu.Google.Yahoo等)的重要组成部分.主要目的是将互联 ...
- 【搜索引擎Jediael开发笔记1】搜索引擎初步介绍及网络爬虫
详细可参考 (1)书箱:<这就是搜索引擎><自己动手写网络爬虫><解密搜索引擎打桩实践> (2)[搜索引擎基础知识1]搜索引擎的技术架构 (3)[搜索引擎基础知识2 ...
- 网络爬虫与搜索引擎优化(SEO)
爬虫及爬行方式 爬虫有很多名字,比如web机器人.spider等,它是一种可以在无需人类干预的情况下自动进行一系列web事务处理的软件程序.web爬虫是一种机器人,它们会递归地对各种信息性的web站点 ...
- 一个大数据方案:基于Nutch+Hadoop+Hbase+ElasticSearch的网络爬虫及搜索引擎
网络爬虫架构在Nutch+Hadoop之上,是一个典型的分布式离线批量处理架构,有非常优异的吞吐量和抓取性能并提供了大量的配置定制选项.由于网络爬虫只负责网络资源的抓取,所以,需要一个分布式搜索引擎, ...
- nutch从搜索引擎到网络爬虫
人物介绍 姓名:DougCutting 个人名望:开发出开源全文检索引擎工具包Lucene. 个人简介/主要荣誉:除了 Lucene,还开发了著名的网络爬虫工具 Nutch,分布式系统基础架构Hado ...
- 【架构】基于Nutch+Hadoop+Hbase+ElasticSearch的网络爬虫及搜索引擎
网络爬虫架构在Nutch+Hadoop之上,是一个典型的分布式离线批量处理架构,有非常优异的吞吐量和抓取性能并提供了大量的配置定制选项.由于网络爬虫只负责网络资源的抓取,所以,需要一个分布式搜索引擎, ...
随机推荐
- 【CQOI2009】中位数图
[题目链接] 点击打开链接 [算法] 将小于m的数看作-1,大于m的看作1 然后求前缀和,如果区间[l,r]的中位数是m,显然有 : sum(r) - sum(l-1) = 0 因此,只需m的位置之前 ...
- NOIP2003题解
传送门 考查题型 搜索 字符串 模拟 dp T1 神经网络 题目背景 人工神经网络(Artificial Neural Network)是一种新兴的具有自我学习能力的计算系统,在模式识别.函数逼近及贷 ...
- GYM 100741A Queries
传送门 题目大意: 一个长度为n的序列,q次三种操作 +p r:下标为p的数+r -p r:下标为p的数-r s l r mod [L,R]中有多少数%m=mod,m已经给出 题解: 开十个树状数组 ...
- org.hibernate.hql.ast.QuerySyntaxException: Student is not mapped [from Student as stu where stu.sclass=?]
java.lang.IllegalArgumentException: org.hibernate.hql.ast.QuerySyntaxException: t_aty_disease is not ...
- GetSafeHwnd()
CreateCompatibleBitmap The CreateCompatibleBitmap function creates a bitmap compatible with the devi ...
- B - Soldier and Badges
Time Limit:3000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Description Colone ...
- linux线程笔记1之创建线程
1 线程与进程的对比 这里有一个笔记详细的阐述 http://blog.csdn.net/laviolette/article/details/51506953 2 创建线程函数 int pthrea ...
- Gradle系列之二 Groovy对文件的操作
Groovy对文件的操作 对文件的遍历 假设文件的原始内容为: hello,world 这里是北京 andorid and ios are good system 第一种方法:使用 eachLine( ...
- 51nod 1003【数学】
思路: 2和5能构成0,然后就是看2和5因子组成个数,然而我们知道,1-n中2的因子数肯定>5的,所以我们只要求一下1-n中5的因子个数就好了... #include <stdio.h&g ...
- Codeforces626B - Cards【模拟】
题意: 两张相同可以合并成相同: 两张不同可以产生另外一个不同: 求最终的可能颜色: 思路: 模拟啊. 总共也就那么几种情况,具体看挫code--. #include<iostream> ...