本文的分析仅用于记录本人的个人思考,如有错误请大家指正!谢谢大家
因为Nutch的爬行命令为bin/nutch crwal ...所以很容易就找到了nutch爬行程序的入口,即Crwal类的main方法,该方法的代码如下
如有些参数没有设置,则设置默认值
将已经设置值的参数赋值。dir爬行后存放数据的路径;threads是爬虫程序的线程数;depth参数是爬行深度,即从初始网址开始进入超链接的深度;topN下载符合条件的前N个页面。
将需要爬行的URL地址注入到crawlDb中。
fetcher.fetch(segs[0], threads, org.apache.nutch.fetcher.Fetcher.isParsing(conf)); // fetch it
爬行该网址,在Crawl类中,直接与爬虫相关的就只有这一句代码,Crawl类暂时看到这里。现在看看fetcher是怎么执行网址的爬行任务。
直接看Fetcher类中的fetch方法:
开始时候检测设置,然后调用SimpleDateFormat保存当前时间,并判断是否需要记录日志,如果需要则记录。Nutch里使用了LOG4J记录日志,以前在给郭老师写书时候接触过LOG4J,但是由于觉得自己写的程序规模不大,没有必要使用LOG4J,所以之后就一直没有接触过,跑题了。根据保存的时间可以记录各个步骤执行的时间。
timelimit参数用于保存浏览网页的超时时间,单位是秒。 getConf().setLong("fetcher.timelimit.mins", timelimit);用于在configuration里设置超时时间。
以上的代码使用了hadoop的分布式运算对网页进行分布式抓取,因为互联网的爬行是一个巨大的工程,通常需要几台服务器运行几天的时间才能完成全网爬行,所以分布式运算成了爬行的不二选择。可以将job看作一个工作,job中封装了爬行程序需要的设置。最后一行代码JobClient.runJob(job);就是执行分布式计算运行这个工作。
fetch方法的最后两句,打印出爬行所消耗的时间。