crawler4j爬虫入门

电玩女神 2022-07-14 12:09 361阅读 0赞

一、nutch和crawler4

  1. nutch的人比较多,适合大规模海量数据的爬取。
  2. crawler4j是一个短小精悍的爬虫。

二、下载crawler4j源码

  1. 项目主页:https://code.google.com/p/crawler4j/。
  2. Git把源码下下来导入eclipse
  3. 爬虫业务逻辑在src/main/java下,可直接运行src/test/javaedu.uci.ics.crawler4j.examples.basic.BasicCrawlController

架构很清晰:

  1. edu.uci.ics.crawler4j.crawler 基本逻辑和配置
  2. edu.uci.ics.crawler4j.fetcher 爬取
  3. edu.uci.ics.crawler4j.frontier URL队列相关
  4. edu.uci.ics.crawler4j.parser 对爬取结果进行解析
  5. edu.uci.ics.crawler4j.robotstxt 检查robots.txt是否存在
  6. edu.uci.ics.crawler4j.url URL相关,主要是WebURL
  7. edu.uci.ics.crawler4j.util 是工具类

三、源码分析

  1. Crawler包:
  2. Crawler.CrawController 控制爬虫,先addseed,再开启多个爬虫,并不断监听各个爬虫存活状态。
  3. Crawler.WebCrawler 爬虫
  4. 1. Run():不断循环,每次从Frontier50url,对每条urlprocessPage(curUrl)。
  5. 2. processPage(curURL):用PageFetcher.fetch爬取网页,如果curURLredirect,则将redirect urlurl加入Frontier,以后再调度;如果爬取正常,则先进行parse,生成Page,将新urls降入Frontier(新加入url的深度此时确定),调用visit(Page){用户自定义操作}。
  6. Crawler.Configurations 读取crawler4j.properties中的信息
  7. Crawler.PageFetcher 启动IdleConnectionMonitorThread,用fetch(Page, ignoreIfBinary),爬取单个Page页面。是一个static类。
  8. Crawler.Page 一个页面
  9. Crawler.PageFetchStatus 单个页面爬取的配置,如返回爬取状态数字所代表的含义等等。
  10. Crawler.HTMLParser HTML源码进行parse,存入Page中。
  11. Crawler.LinkExtractor 抽取出一个HTML页面中包含的所有link
  12. Crawler.IdleConnectionMonitorThread 用来监听连接器(用来发送get请求,获取页面),其connMgr则负责HTML请求的发送。
  13. url
  14. url.WebURL 代表一条url,内含docid, depth, url
  15. url.URLCanonicalizer url进行normalize
  16. Frontier
  17. Frontier.Frontier
  18. Init() 如果resumable,则从env所指home中读取已处理过得urlsscheduleAll加入调度workQueue中。
  19. Frontier.workQueues 要处理的页面集,如果resumable,在构造时会打开对应env中的database(PendingURLsDB),获取上一次遗留的未处理的urls
  20. Frontier.inprocessPages 当前正在处理的页面集,继承workQueues,存入InProcessPagesDB数据库。
  21. Frontier.DocIDServer 对应数据库DocIDs,记录已经见过的页面url
  22. 处理流程:newurl--->workQueues--->inprovessPages--->delete
  23. Robotstxt包,用来判断url是否被允许。
  24. Util包,用来提供一些小工具。

注意点:

  1. seed页面深度为0。
  2. url去重利用的是DocIDServer.newdocid(url),如果该值大于0,则表示该url以前见过。通过这个机制,所有以前见过的页面都可以被记录识别。
  3. 当设定resumable后,程序跑完后就会把PendingURLsDB和DocIDs保存下来。
  4. 如果不设定resumable,在运行程序前,会把env对应的home目录清空。

发表评论

表情:
评论列表 (有 0 条评论,361人围观)

还没有评论,来说两句吧...

相关阅读