共计 2734 个字符,预计需要花费 7 分钟才能阅读完成。
本篇内容介绍了“Java 爬虫框架的举例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让丸趣 TV 小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
一、架构图
那里搜网络爬虫框架主要针对电子商务网站进行数据爬取,分析,存储,索引。
爬虫:爬虫负责爬取,解析,处理电子商务网站的网页的内容
数据库:存储商品信息
索引:商品的全文搜索索引
Task 队列:需要爬取的网页列表
Visited 表:已经爬取过的网页列表
爬虫监控平台:web 平台可以启动,停止爬虫,管理爬虫,task 队列,visited 表。
二、爬虫 1. 流程
1) Scheduler 启动爬虫器,TaskMaster 初始化 taskQueue
2) Workers 从 TaskQueue 中获取任务
3) Worker 线程调用 Fetcher 爬取 Task 中描述的网页
4) Worker 线程将爬取到的网页交给 Parser 解析
5) Parser 解析出来的数据送交 Handler 处理,抽取网页 Link 和处理网页内容
6) VisitedTableManager 判断从 URLExtractor 抽取出来的链接是否已经被爬取过,如果没有提交到 TaskQueue 中
2. Scheduler
Scheduler 负责启动爬虫器,调用 TaskMaster 初始化 TaskQueue,同时创建一个 monitor 线程,负责控制程序的退出。
何时退出?
当 TaskQueue 为空,并且 Workers 中的所有线程都处于空闲状态。而这种形势在指定 10 分钟内没有发生任何变化。就认为所有网页已经全部爬完。程序退出。
3. Task Master
任务管理器,负责管理任务队列。任务管理器抽象了任务队列的实现。
l 在简单应用中,我们可以使用内存的任务管理器
l 在分布式平台,有多个爬虫机器的情况下我们需要集中的任务队列
在现阶段,我们用 SQLLite 作为任务队列的实现。可供替代的还有 Redis。
任务管理器的处理流程:
l 任务管理器初始化任务队列,任务队列的初始化根据不同的配置可能不同。增量式的情况下,根据指定的 URL List 初始化。而全文爬取的情况下只预先初始化某个或几个电子商务网站的首页。
l 任务管理器创建 monitor 线程,控制整个程序的退出
l 任务管理器调度任务,如果任务队列是持久化的,负责从任务队列服务器 load 任务。需要考虑预取。
l 任务管理器还负责验证任务的有效性验证,爬虫监控平台可以将任务队列中的某些任务设为失效?
4. Workers
Worker 线程池,每个线程都会执行整个爬取的流程。可以考虑用多个线程池,分割异步化整个流程。提高线程的利用率。
5. Fetcher
Fetcher 负责直接爬取电子商务网站的网页。用 HTTP Client 实现。HTTP core 4 以上已经有 NIO 的功能, 用 NIO 实现。
Fetcher 可以配置需不需要保存 HTML 文件
6. Parser
Parser 解析 Fetcher 获取的网页,一般的网页可能不是完好格式化的(XHTML 是完美格式化的),这样就不能利用 XML 的类库处理。我们需要一款比较好的 HTML 解析器,可以修复这些非完好格式化的网页。
熟悉的第三方工具有 TagSoup,nekohtml,htmlparser 三款。tagsoup 和 nekohtml 可以将 HTML 用 SAX 事件流处理,节省了内存。
已知的第三方框架又使用了哪款作为他们的解析器呢?
l Nutch:正式支持的有 tagsoup,nekohtml,二者通过配置选择
l Droids:用的是 nekohtml,Tika
l Tika:tagsoup
据称,tagsoup 的可靠性要比 nekohtml 好,nekohtml 的性能比 tagsoup 好。nekohtml 不管是在可靠性还是性能上都比 htmlparser 好。具体结论我们还需要进一步测试。
我们还支持 regex,dom 结构的 html 解析器。在使用中我们可以结合使用。
进一步,我们需要研究文档比较器,同时需要我们保存爬取过的网站的 HTML. 可以通过语义指纹或者 simhash 来实现。在处理海量数据的时候才需要用上。如果两个 HTML 被认为是相同的,就不会再解析和处理。
7. Handler
Handler 是对 Parser 解析出来的内容做处理。
回调方式(visitor):对于 SAX event 处理,我们需要将 handler 适配成 sax 的 content handler。作为 parser 的回调方法。不同事件解析出来的内容可以存储在 HandlingContext 中。最后由 Parser 一起返回。
主动方式:需要解析整个 HTML,选取自己需要的内容。对 Parser 提取的内容进行处理。XML 需要解析成 DOM 结构。方便使用,可以使用 Xpath,nodefilter 等,但耗内存。
ContentHandler:它还包含组件 ContentFilter。过滤 content。
URLExtractor 负责从网页中提取符合格式的 URL,将 URL 构建成 Task,并提交到 Task queue 中。
8. VisitedTableManager
访问表管理器,管理访问过的 URLs。提取统一接口,抽象底层实现。如果 URL 被爬取过,就不会被添加到 TaskQueue 中。
三、 Task 队列
Task 队列存储了需要被爬取的任务。任务之间是有关联的。我们可以保存和管理这个任务关系。这个关系也是 URL 之间的关系。保存下来,有助于后台形成 Web 图,分析数据。
Task 队列在分布式爬虫集群中,需要使用集中的服务器存放。一些轻量级的数据库或者支持列表的 NoSql 都可以用来存储。可选方案:
l 用 SQLLite 存储:需要不停地插入删除,不知性能如何。
l 用 Redis 存储
四、 Visited 表
Visited 表存储了已经被爬的网站。每次爬取都需要构建。
l SQLLite 存储:需要动态创建表,需要不停地查询,插入,还需要后台定期地清理,不知性能如何。
l Mysql 内存表 hash index
l Redis: Key value,设过期时间
l Memcached: key value, value 为 bloomfilter 的值
针对目前的数据量,可以采用 SQLLite
五、 爬虫监控管理平台
l 启动,停止爬虫,监控各爬虫状态
l 监控,管理 task 队列,visited 表
l 配置爬虫
l 对爬虫爬取的数据进行管理。在并发情况下,很难保证不重复爬取相同的商品。在爬取完后,可以通过爬虫监控管理平台进行手动排重。
“Java 爬虫框架的举例分析”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注丸趣 TV 网站,丸趣 TV 小编将为大家输出更多高质量的实用文章!