多线程去mongodb中查询出现重复_Java 多线程爬虫及分布式爬虫架构

c54f24c5a0394b564454607f55c8c9c6.png

在这个时间就是金钱的年代,不可能给你时间去慢慢的采集,所以单线程爬虫程序是行不通的,我们需要将单线程改成多线程的模式,来提升采集效率和提高计算机利用率。维护待采集的 URL多线程爬虫程序就不能像单线程那样,每个线程独自维护这自己的待采集 URL,如果这样的话,那么每个线程采集的网页将是一样的,你这就不是多线程采集啦,你这是将一个页面采集的多次。

正文

在人们调节爬虫程序的那时候,单线程网络爬虫没有什么难题,但是当我们在线上环境使用单线程爬虫程序去采集网页时,单线程就普遍存在了2个致命性的难题:

采集高效率非常慢,单线程中间全是串行的,下一个执行动作需要等上一个执行完才能执行。

对网络服务器的CUP等使用率不高,想着人们的网络服务器全是 8核16G,32G 的只跑一个线程会否太奢侈浪费

网上自然环境不太可能像人们当地检测一样,不在意采集高效率,要是能恰当获取結果就行。在这一时间就是生命的时代,不太可能让你時间去渐渐地的采集,因此单线程爬虫程序是难以实现的,人们必须将单线程改为多核的方式,来提高采集高效率和提升电脑使用率。

多核的爬虫程序设计方案比单线程还要繁杂许多,可是与别的业务流程在分布式系统下要确保信息安全又不一样,多核网络爬虫在信息安全上升规定并不是那麼的高,由于每一网页页面能够被当作是一个单独体。要搞好多核网络爬虫就务必搞好二点:第一点就是说统一的待采集 URL 维护,第二点就是说 URL 的去重, 下边人们简易的来聊一聊这个方面。

维护待采集的 URL

多核爬虫程序就不可以像单线程那般,每一线程独自一人维护这自身的待采集 URL,假如那样的话,那麼每一线程采集的网页页面将是一样的,你这就并不是多核采集啦,你它是将一个网页页面采集的数次。根据这一缘故人们就必须将待采集的 URL 统一维护,每一线程从统一 URL 维护处领到采集 URL ,进行采集每日任务,假如在网页页面上发觉新的 URL 连接则加上到 统一 URL 维护的器皿中。下边是几类合适用来统一 URL 维护的器皿:

  • JDK 的安全性序列,比如 LinkedBlockingQueue
  • 性能的 NoSQL,例如 Redis、Mongodb
  • MQ 消息中间件
  • URL 的去重

URL 的去重都是多核采集的重要一步,由于假如没去重得话,那麼人们将采集到很多反复的 URL,那样并沒有提高人们的采集高效率,例如一个分页查询的新闻报道目录,人们在采集第一页的那时候能够获得 2、3、4、5 页的连接,在采集第二页的那时候又会获得 1、3、4、5 页的连接,待采集的 URL 序列军委委员存有很多的搜索结果页连接,那样就会反复采集以至于进到到一个无限循环之中,因此就必须 URL 去重。URL 去重的方式就十分多啦,下边是几类常见的 URL 去重方法:

  • 将 URL 储存到数据库查询开展去重,例如 redis、MongoDB
  • 将 URL 放进哈希表中去重,比如 hashset
  • 将 URL 经过 MD5 之后保存到哈希表中去重,相比于上面一种,能够节约空间
  • 使用 布隆过滤器(Bloom Filter)去重,这种方式能够节约大量的空间,就是不那么准确。

关于多线程爬虫的两个核心知识点我们都知道啦,下面我画了一个简单的多线程爬虫架构图,如下图所示:

e6d9ec6223e4b139c715159f64c354e6.png

多线程爬虫架构图

上面我们主要了解了多线程爬虫的架构设计,接下来我们不妨来试试 Java 多线程爬虫,我们以采集虎扑新闻为例来实战一下 Java 多线程爬虫,Java 多线程爬虫中设计到了 待采集 URL 的维护和 URL 去重,由于我们这里只是演示,所以我们就使用 JDK 内置的容器来完成,我们使用 LinkedBlockingQueue 作为待采集 URL 维护容器,HashSet 作为 URL 去重容器。下面是 Java 多线程爬虫核心代码,详细代码以上传 GitHub,地址在文末:

9c7948911eab554c4460f8e30380424d.png

b792ab54fa4952164c15eb91bd5b0688.png

10c3c6c6960db72d34242626d5e8fe04.png

我们用 5 个线程去采集虎扑新闻列表页看看效果如果?运行该程序,得到如下结果:

31e5a5dbb7f969d67f40684919ed50ff.png

多线程采集结果

结果中可以看出,我们启动了 5 个线程采集了 61 页页面,一共耗时 2 秒钟,可以说效果还是不错的,我们来跟单线程对比一下,看看差距有多大?我们将线程数设置为 1 ,再次启动程序,得到如下结果:

c31c4ebc5399e0360154cceb43af8aa7.png

单线程运行结果

可以看出单线程采集虎扑 61 条新闻花费了 7 秒钟,耗时差不多是多线程的 4 倍,你想想这可只是 61 个页面,页面更多的话,差距会越来越大,所以多线程爬虫效率还是非常高的。

分布式爬虫架构

分布式爬虫架构是一个大型采集程序才需要使用的架构,一般情况下使用单机多线程就可以解决业务需求,反正我是没有分布式爬虫项目的经验,所以这一块我也没什么可以讲的,但是我们作为技术人员,我们需要对技术保存热度,虽然不用,但是了解了解也无妨,我查阅了不少资料得出了如下结论:

分布式爬虫架构跟我们多线程爬虫架构在思路上来说是一样的,我们只需要在多线程的基础上稍加改进就可以变成一个简单的分布式爬虫架构。因为分布式爬虫架构中爬虫程序部署在不同的机器上,所以我们待采集的 URL 和 采集过的 URL 就不能存放在爬虫程序机器的内存中啦,我们需要将它统一在某台机器上维护啦,比如存放在 Redis 或者 MongoDB 中,每台机器都从这上面获取采集链接,而不是从 LinkedBlockingQueue 这样的内存队列中取链接啦,这样一个简单的分布式爬虫架构就出现了,当然这里面还会有很多细节问题,因为我没有分布式架构的经验

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值