Spider
按照是否匿名和是否遵循robots.txt协议有4种蜘蛛:1 真名真姓,遵循robots.txt 协议。代表:GoogleBot BaiduSpider MSNBot Yahoo!Slurp 等
2 真名真姓,不遵循robots.txt协议。代表:iAskSpider SohuAgent wget
3 匿名,不遵循robots.txt协议。代表:大量的匿名蜘蛛,例如 OutfoxBot;
4 伪装:不遵循robots.txt协议。代表:中搜,各种SpamBot,
如何识别这四类蜘蛛呢?通过HTTP协议和是否支持mod_gzip都很好的特征。做一个知荣知耻的spider很难吗?事实上:比较难。没有一定的技术积累,spider就和spambot一样。详细分析附后:
先看看第一类:
GoogleBot: 除了遵循robots.txt外,也支持HTTP 1.1压缩,可以非常有效的节省带宽;
66.249.72.165 - - "GET /blog/archives/000900.htmlHTTP/1.1" 200 8437 "-" "Mozilla/5.0 (compatible; Googlebot/2.1;+http://www.google.com/bot.html)" 66.249.72.165.321101163434175289
这个页面的原始大小是34211字节。
BaiduSpider:BaiduSpider不支持HTTP 1.1压缩,但使用大量使用了HEAD请求来校验文件更新,避免了很多网络传输;百度的蜘蛛支持Disallow命令,但是是抓了再删,而其他引擎是从请求队列中删除,根本不会抓取。
202.108.22.181 - - "GET/blog/atom.xml HTTP/1.1" 304 - "-""Baiduspider+(+http://www.baidu.com/search/spider.htm)"
202.108.22.181 - - "GET/cgi-bin/mt/mt-comments.cgi HTTP/1.1" 200 2076 "-""Baiduspider+(+http://www.baidu.com/search/spider.htm)"
202.108.22.181 - - "GET/blog/archives/000713.html HTTP/1.1" 200 31220 "-""Baiduspider+(+http://www.baidu.com/search/spider.htm)"
202.108.22.144 - - "HEAD /blog/archives/000642.html HTTP/1.1" 200 0 "-" "Baiduspider+(+http://www.baidu.com/search/spider.htm)"
Yahoo!Slurp: 只支持HTTP 1.0,也没用HEAD来校验更新,有很多报道说雅虎的蜘蛛抓取强度过高,但是Yahoo!Slurp很遵守规矩的,而且现在支持Crawl-delay命令:可以控制抓取频度。第二类的和第三类的还好办,至少方便通过web服务器通过agent判断进行控制。最烦的就是第四类:不但无法防止,还给日志统计分析带来了很多麻烦。
但如果服务上安装了mod_gzip支持,就可以区分出了:因为机器人对HTTP 1.1支持到HTTP压缩还是有一定难度的,如果来自某个IP有大量的MSIE 访问,却是只支持HTTP 1.0请求或者支持HTTP 1.1但又不支持压缩那个就有可能是伪装spam了。
中搜多年以来一直伪装成Mozilla/4.0 (compatible;MSIE 5.5;Windows NT 5.0),从中搜上的CrawledBy结果就可以看出来:
ipfw - phpMan
Apache/1.3.37 (Unix) mod_perl/1.29 PHP/4.4.2 Under GNU General Public License 2006-10-25 11:23 @202.108.1.6 CrawledBy Mozilla/4.0 (compatible;MSIE 5.5;Windows NT 5.0)
www.chedong.com/phpMan.php/man/ipfw 上的更多结果2006-10-25做一个知荣知耻的spider很难吗? sogou是最MJJ的,robots.txt禁止了他,还在最后加上了sogou & dog 不得入内的文字,他都视而不见 占位占位占位占位占位
[ 本帖最后由 faunus 于 2008-11-8 15:21 编辑 ] 占位占位占位占位占位
[ 本帖最后由 faunus 于 2008-11-8 15:21 编辑 ]
车技(模块)
爬虫模块 网络爬虫/Spider技术 网页非结构化信息抽取 网页块分析正文抽取 多语言,编码格式自动识别 搜索引擎与数据库无缝集成 分词模块 基于词库的分词技术 基于词库和语义分析的高级分词技术,人名、地名识别 中文处理模块 智能摘要、关键字提取技术 自动分类,聚类 信息指纹去重 拼音搜索 全文检索模块 全文检索系统 分布式系统、支持亿级数据,多台服务器协同检索 :ali0ls 大虫 又出来了啊Nutch中MapReduce的分析
Nutch从获取下载列表到建立索引的过程:插入url列表到Crawl DB,引导下面的抓取程序
循环:
– 从Crawl DB生成一些url列表;
– 抓取内容;
– 分析处理抓取的内容;
– 更新Crawl DB库.
转化每个页面中外部对它的链接
建立索引
具体技术实现细节:
1。插入url列表(Inject)
MapReduce程序1:
目标:转换input输入为CrawlDatum格式.
输入: url文件
Map(line) → <url, CrawlDatum>
Reduce()合并多重的Url.
输出:临时的CrawlDatum文件.
MapReduce2:
目标:合并上一步产生的临时文件到新的DB
输入: 上次MapReduce输出的CrawlDatum
Map()过滤重复的url.
Reduce: 合并两个CrawlDatum到一个新的DB
输出:CrawlDatum
2。生成抓取列表(Generate)
MapReduce程序1:
目标:选择抓取列表
输入: Crawl DB 文件
Map() → 如果抓取当前时间大于现在时间 ,抓换成 <CrawlDatum, url>格式.
分发器(Partition) :用url的host保证同一个站点分发到同一个Reduce程序上.
Reduce:取最顶部的N个链接.
MapReduce程序2:
目标:准备抓取
Map() 抓换成 <url,CrawlDatum,>格式
分发器(Partition) :用url的host
输出:<url,CrawlDatum>文件
3。抓取内容(Fetch)
MapReduce:
目标:抓取内容
输入: <url,CrawlDatum>, 按host划分, 按hash排序
Map(url,CrawlDatum) → 输出<url, FetcherOutput>
多线程, 调用Nutch的抓取协议插件,抓取输出<CrawlDatum, Content>
输出: <url,CrawlDatum>, <url,Content>两个文件
4。分析处理内容(Parse)
MapReduce:
目标:处理抓取的能容
输入: 抓取的<url, Content>
Map(url, Content) → <url, Parse>
调用Nutch的解析插件,输出处理完的格式是<ParseText, ParseData>
输出: <url,ParseText>, <url,ParseData><url,CrawlDatum>.
5。更新Crawl DB库(Update )
MapReduce:
目标: 整合 fetch和parse到DB中
输入:<url,CrawlDatum> 现有的db加上fetch和parse的输出,合并上面3个DB为一个新的DB
输出: 新的抓取DB
6。转化链接(Invert Links)
MapReduce:
目标:统计外部页面对本页面链接
输入: <url,ParseData>, 包含页面往外的链接
Map(srcUrl, ParseData> → <destUrl, Inlinks>
搜集外部对本页面的链接Inlinks格式:<srcUrl, anchorText>
Reduce() 添加inlinks
输出: <url, Inlinks>
7。建立索引(Index)
MapReduce:
目标:生成Lucene索引
输入: 多种文件格式
parse处理完的<url, ParseData> 提取title, metadata信息等
parse处理完的<url, ParseText> 提取text内容
转换链接处理完的<url, Inlinks> 提取anchors
抓取内容处理完的<url, CrawlDatum> 提取抓取时间.
Map() 用ObjectWritable包裹上面的内容
Reduce() 调用Nutch的索引插件,生成Lucene Document文档
输出: 输出Lucene索引
Nutch爬虫工作流程及文件格式详细分析
Nutch主要分为两个部分:爬虫crawler和查询searcher。Crawler主要用于从网络上抓取网页并为这些网页建立索引。Searcher主要利用这些索引检索用户的查找关键词来产生查找结果。两者之间的接口是索引,所以除去索引部分,两者之间的耦合度很低。Crawler和Searcher两部分尽量分开的目的主要是为了使两部分可以分布式配置在硬件平台上,例如将Crawler和Searcher分别放在两个主机上,这样可以提升性能。爬虫,Crawler:
Crawler的重点在两个方面,Crawler的工作流程和涉及的数据文件的格式和含义。数据文件主要包括三类,分别是web database,一系列的segment加上index,三者的物理文件分别存储在爬行结果目录下的db目录下webdb子文件夹内,segments文件夹和index文件夹。那么三者分别存储的信息是什么呢?
Web database,也叫WebDB,其中存储的是爬虫所抓取网页之间的链接结构信息,它只在爬虫Crawler工作中使用而和Searcher的工作没有任何关系。WebDB内存储了两种实体的信息:page和link。Page实体通过描述网络上一个网页的特征信息来表征一个实际的网页,因为网页有很多个需要描述,WebDB中通过网页的URL和网页内容的MD5两种索引方法对这些网页实体进行了索引。Page实体描述的网页特征主要包括网页内的link数目,抓取此网页的时间等相关抓取信息,对此网页的重要度评分等。同样的,Link实体描述的是两个page实体之间的链接关系。WebDB构成了一个所抓取网页的链接结构图,这个图中Page实体是图的结点,而Link实体则代表图的边。
一次爬行会产生很多个segment,每个segment内存储的是爬虫Crawler在单独一次抓取循环中抓到的网页以及这些网页的索引。Crawler爬行时会根据WebDB中的link关系按照一定的爬行策略生成每次抓取循环所需的fetchlist,然后Fetcher通过fetchlist中的URLs抓取这些网页并索引,然后将其存入segment。Segment是有时限的,当这些网页被Crawler重新抓取后,先前抓取产生的segment就作废了。在存储中。Segment文件夹是以产生时间命名的,方便我们删除作废的segments以节省存储空间。
Index是Crawler抓取的所有网页的索引,它是通过对所有单个segment中的索引进行合并处理所得的。Nutch利用Lucene技术进行索引,所以Lucene中对索引进行操作的接口对Nutch中的index同样有效。但是需要注意的是,Lucene中的segment和Nutch中的不同,Lucene中的segment是索引index的一部分,但是Nutch中的segment只是WebDB中各个部分网页的内容和索引,最后通过其生成的index跟这些segment已经毫无关系了。
Crawler工作流程:
在分析了Crawler工作中设计的文件之后,接下来我们研究一下Crawler的抓取流程以及这些文件在抓取中扮演的角色。Crawler的工作原理主要是:首先Crawler根据WebDB生成一个待抓取网页的URL集合叫做Fetchlist,接着下载线程Fetcher开始根据Fetchlist将网页抓取回来,如果下载线程有很多个,那么就生成很多个Fetchlist,也就是一个Fetcher对应一个Fetchlist。然后Crawler根据抓取回来的网页WebDB进行更新,根据更新后的WebDB生成新的Fetchlist,里面是未抓取的或者新发现的URLs,然后下一轮抓取循环重新开始。这个循环过程可以叫做“产生/抓取/更新”循环。
指向同一个主机上Web资源的URLs通常被分配到同一个Fetchlist中,这样的话防止过多的Fetchers对一个主机同时进行抓取造成主机负担过重。另外Nutch遵守Robots Exclusion Protocol,网站可以通过自定义Robots.txt控制Crawler的抓取。
在Nutch中,Crawler操作的实现是通过一系列子操作的实现来完成的。这些子操作Nutch都提供了子命令行可以单独进行调用。下面就是这些子操作的功能描述以及命令行,命令行在括号中。
1.创建一个新的WebDb (admin db -create).
2.将抓取起始URLs写入WebDB中 (inject).
3.根据WebDB生成fetchlist并写入相应的segment(generate).
4.根据fetchlist中的URL抓取网页 (fetch).
5.根据抓取网页更新WebDb (updatedb).
6.循环进行3-5步直至预先设定的抓取深度。
7.根据WebDB得到的网页评分和links更新segments (updatesegs).
8.对所抓取的网页进行索引(index).
9.在索引中丢弃有重复内容的网页和重复的URLs (dedup).
10.将segments中的索引进行合并生成用于检索的最终index(merge).
Crawler详细工作流程是:在创建一个WebDB之后(步骤1), “产生/抓取/更新”循环(步骤3-6)根据一些种子URLs开始启动。当这个循环彻底结束,Crawler根据抓取中生成的segments创建索引(步骤7-10)。在进行重复URLs清除(步骤9)之前,每个segment的索引都是独立的(步骤8)。最终,各个独立的segment索引被合并为一个最终的索引index(步骤10)。
其中有一个细节问题,Dedup操作主要用于清除segment索引中的重复URLs,但是我们知道,在WebDB中是不允许重复的URL存在的,那么为什么这里还要进行清除呢?原因在于抓取的更新。比方说一个月之前你抓取过这些网页,一个月后为了更新进行了重新抓取,那么旧的segment在没有删除之前仍然起作用,这个时候就需要在新旧segment之间进行除重。
另外这些子操作在第一次进行Crawler运行时可能并不用到,它们主要用于接下来的索引更新,增量搜索等操作的实现。这些在以后的文章中我再详细讲。
个性化设置:
Nutch中的所有配置文件都放置在总目录下的conf子文件夹中,最基本的配置文件是conf/nutch-default.xml。这个文件中定义了Nutch的所有必要设置以及一些默认值,它是不可以被修改的。如果你想进行个性化设置,你需要在conf/nutch-site.xml进行设置,它会对默认设置进行屏蔽。
Nutch考虑了其可扩展性,你可以自定义插件plugins来定制自己的服务,一些plugins存放于plugins子文件夹。Nutch的网页解析与索引功能是通过插件形式进行实现的,例如,对HTML文件的解析与索引是通过HTML document parsing plugin, parse-html实现的。所以你完全可以自定义各种解析插件然后对配置文件进行修改,然后你就可以抓取并索引各种类型的文件了。
Crawler运行实例分析
下一篇文章里,我将利用Nutch爬虫对一个已知结构和内容的实验网络进行爬行和抓取,对抓取的过程以及结果文件进行内容分析来更进一步地了解Nutch爬虫。
参考文章:http://today.java.net/pub/a/today/2006/01/10/introduction-to-nutch-1.html
[ 本帖最后由 faunus 于 2008-11-8 20:46 编辑 ] 爪,以后学习下。。
页:
[1]