NUTCH研究系列4——剖析NUTCH爬虫3
下面我们来研究一下fetch操作,在爬虫中,抓取是最主要的操作。
Fetch命令:net.nutch.fetcher.Fetcher
此命令的作用就是抓取网页,但是需要注意的是,抓取的单位不是单个的网页,而是同属于一个segment的网页集合。命令格式:
Fetcher [-logLevel level] [-showThreadID] [-threads n] dir
在进行fetch之前,我们已经生成了webdb,在其中初始化写入了URL,并且生成了segment留待写入抓取内容。我们首先看一下Fetcher类,然后运行一下看其效果。
net.nutch.fetcher.Fetcher类依靠下面几个类:
l FetcherThread, an inner class
l net.nutch.parse.ParserFactory
l net.nutch.plugin.PluginRepository
l and, of course, any "plugin" classes loaded by the PluginRepository
Fetcher类中的main()函数的功能主要是读取参数,实例化一个Fetcher对象,设置选项,然后调用run()函数。Fetcher类的构造函数很简单,它只是实例化了所有的输入输出流:
实例对象 |
类 |
参数 |
fetchList |
ArrayFile.Reader |
(dir, "fetchlist") |
fetchWriter |
ArrayFile.Writer |
(dir, "fetcher", FetcherOutput.class) |
contentWriter |
ArrayFile.Writer |
(dir, "content", Content.class) |
parseTextWriter |
ArrayFile.Writer |
(dir, "parse_text", ParseText.class) |
parseDataWriter |
ArrayFile.Writer |
(dir, "parse_data", ParseData.class) |
Run()函数逐个的实例化抓取线程FetcherThread对象,然后触发各个线程的start()函数,在其共初始化threadCount个线程并等待线程结束后或者出现大的异常后,此函数调用close()结束输入输出流。
FetcherThread是Fetcher类的一个内部类,它继承于java.lang.Thread类,它只有一个实体方法run()和三个静态函数:handleFetch(), handleNoFetch(), and logError().
FetcherThread.run()实例化了一个新的FetchListEntry实例名叫”fle”,然后执行以下循环:
1. 如果出现错误,记录并退出循环
2. 从FetchList中取得下一个URL集,如果取得结果为空,退出循环
3. 从FetchListEntry解析出URL
4. 如果FetchListEntry没有被标记为”fetch”(未抓取此URL的网页),那么调用this.handleNoFetch()函数,设置status=1。然后逐步执行:
Ø 取得此URL的MD5摘要
Ø 建立FetcherOutput(fle, hash, status)
Ø 建立空的Content、ParseText和 ParseData对象
Ø 利用这些对象调用Fetcher.outputPage()函数
5. 如果标记为”fetch”(已抓取此URL的网页),调用ProtocolFactory并取得符合此URL的协议和内容对象。
6. 调用Call this.handleFetch(url, fle, content).然后逐步执行:
Ø 调用符合此内容类型的ParserFactory.getParser()
Ø 执行parser.getParse(content)
Ø 利用新建立的FetcherOutput和URL的MD5摘要,产生的内容对象和已解析的ParseText调用Fetcher.outputPage()函数
7. 循环100次,在log中记录
8. 扑捉各种小的异常以及记录写入log文件
我们可以看出,Fetcher利用Factory类来选择合适的code去处理不同的内容类型:ProtocolFactory()获取URL的协议类型, ParserFactory 根据文件类型进行合适的内容解析。
我们可以看出,如果我们想对nutch爬虫进行功能上的扩充,比方说增加可抓取的web资源类型,如PDF什么的,我们就可以通过对ProtocolFactory和ParserFactory的扩充来进行实现。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?