公司网站建设公司好,哪个公司网站设计好,网页设计模板素材图片简单,wordpress集成文库插件在我们调试爬虫程序的时候#xff0c;单线程爬虫没什么问题#xff0c;但是当我们在线上环境使用单线程爬虫程序去采集网页时#xff0c;单线程就暴露出了两个致命的问题#xff1a;采集效率特别慢#xff0c;单线程之间都是串行的#xff0c;下一个执行动作需要等上一个…在我们调试爬虫程序的时候单线程爬虫没什么问题但是当我们在线上环境使用单线程爬虫程序去采集网页时单线程就暴露出了两个致命的问题采集效率特别慢单线程之间都是串行的下一个执行动作需要等上一个执行完才能执行对服务器的CUP等利用率不高想想我们的服务器都是 8核16G32G 的只跑一个线程会不会太浪费啦线上环境不可能像我们本地测试一样不在乎采集效率只要能正确提取结果就行。在这个时间就是金钱的年代不可能给你时间去慢慢的采集所以单线程爬虫程序是行不通的我们需要将单线程改成多线程的模式来提升采集效率和提高计算机利用率。多线程的爬虫程序设计比单线程就要复杂很多但是与其他业务在高并发下要保证数据安全又不同多线程爬虫在数据安全上到要求不是那么的高因为每个页面都可以被看作是一个独立体。要做好多线程爬虫就必须做好两点第一点就是统一的待采集 URL 维护第二点就是 URL 的去重 下面我们简单的来聊一聊这两点。维护待采集的 URL多线程爬虫程序就不能像单线程那样每个线程独自维护这自己的待采集 URL如果这样的话那么每个线程采集的网页将是一样的你这就不是多线程采集啦你这是将一个页面采集的多次。基于这个原因我们就需要将待采集的 URL 统一维护每个线程从统一 URL 维护处领取采集 URL 完成采集任务如果在页面上发现新的 URL 链接则添加到 统一 URL 维护的容器中。下面是几种适合用作统一 URL 维护的容器JDK 的安全队列例如 LinkedBlockingQueue高性能的 NoSQL比如 Redis、MongodbMQ 消息中间件URL 的去重URL 的去重也是多线程采集的关键一步因为如果不去重的话那么我们将采集到大量重复的 URL这样并没有提升我们的采集效率比如一个分页的新闻列表我们在采集第一页的时候可以得到 2、3、4、5 页的链接在采集第二页的时候又会得到 1、3、4、5 页的链接待采集的 URL 队列中将存在大量的列表页链接这样就会重复采集甚至进入到一个死循环当中所以就需要 URL 去重。URL 去重的方法就非常多啦下面是几种常用的 URL 去重方式将 URL 保存到数据库进行去重比如 redis、MongoDB将 URL 放到哈希表中去重例如 hashset将 URL 经过 MD5 之后保存到哈希表中去重相比于上面一种能够节约空间使用 布隆过滤器(Bloom Filter)去重这种方式能够节约大量的空间就是不那么准确。关于多线程爬虫的两个核心知识点我们都知道啦下面我画了一个简单的多线程爬虫架构图如下图所示多线程爬虫架构图上面我们主要了解了多线程爬虫的架构设计接下来我们不妨来试试 Java 多线程爬虫我们以采集虎扑新闻为例来实战一下 Java 多线程爬虫Java 多线程爬虫中设计到了 待采集 URL 的维护和 URL 去重由于我们这里只是演示所以我们就使用 JDK 内置的容器来完成我们使用 LinkedBlockingQueue 作为待采集 URL 维护容器HashSet 作为 URL 去重容器。下面是 Java 多线程爬虫核心代码详细代码以上传 GitHub地址在文末我们用 5 个线程去采集虎扑新闻列表页看看效果如果运行该程序得到如下结果多线程采集结果结果中可以看出我们启动了 5 个线程采集了 61 页页面一共耗时 2 秒钟可以说效果还是不错的我们来跟单线程对比一下看看差距有多大我们将线程数设置为 1 再次启动程序得到如下结果单线程运行结果可以看出单线程采集虎扑 61 条新闻花费了 7 秒钟耗时差不多是多线程的 4 倍你想想这可只是 61 个页面页面更多的话差距会越来越大所以多线程爬虫效率还是非常高的。分布式爬虫架构分布式爬虫架构是一个大型采集程序才需要使用的架构一般情况下使用单机多线程就可以解决业务需求反正我是没有分布式爬虫项目的经验所以这一块我也没什么可以讲的但是我们作为技术人员我们需要对技术保存热度虽然不用但是了解了解也无妨我查阅了不少资料得出了如下结论分布式爬虫架构跟我们多线程爬虫架构在思路上来说是一样的我们只需要在多线程的基础上稍加改进就可以变成一个简单的分布式爬虫架构。因为分布式爬虫架构中爬虫程序部署在不同的机器上所以我们待采集的 URL 和 采集过的 URL 就不能存放在爬虫程序机器的内存中啦我们需要将它统一在某台机器上维护啦比如存放在 Redis 或者 MongoDB 中每台机器都从这上面获取采集链接而不是从 LinkedBlockingQueue 这样的内存队列中取链接啦这样一个简单的分布式爬虫架构就出现了当然这里面还会有很多细节问题因为我没有分布式架构的经验