玩玩小爬虫——试搭小架构

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介:

     第一篇我们做了一个简单的页面广度优先来抓取url,很显然缺点有很多,第一:数据结构都是基于内存的,第二:单线程抓取

速度太慢,在实际开发中肯定不会这么做的,起码得要有序列化到硬盘的机制,对于整个爬虫架构来说,构建好爬虫队列相当重要。

     先上一幅我自己构思的架构图,不是很完善,算是一个雏形吧。

一:TODO队列和Visited集合

     在众多的nosql数据库中,mongodb还是很不错的,这里也就选择它了,做集群,做分片轻而易举。

二:中央处理器

     群架,斗殴都是有带头的,那中央处理器就可以干这样的事情,它的任务很简单,

    第一: 启动时,根据我们定义好的规则将种子页面分发到各个执行服务器。

    第二: 定时轮询”TODO——MongoDB“,将读取的新Url根据规则分发到对应的执行服务器中。

三:分发服务器

    中央处理器将url分发到了执行服务器的内存中,分发服务器可以开启10个线程依次读取队列来获取url,然后解析url,

第一:如果url是外链,直接剔除。

第二:如果url不是本机负责抓取的,就放到”TODO——MongoDB“中。

第三:如果是本机负责的,将新提取的url放入本机内存队列中。

 

 四:代码实现

 首先下载mongodb http://www.mongodb.org/downloads,简单起见就在一个database里面建两个collection。迫不及

待了,我要爬一个美女网站,http://www.800meinv.com ,申明一下,并非推广网站,看下”中央处理器“的实现。

namespace CrawlerCPU
{
    /* 根据规格,一个服务爬取3个导航页(由 中央处理器 统一管理)
     * 第一个服务:日韩时装,港台时装
     * 第二个服务:,欧美时装,明星穿衣,显瘦搭配
     * 第三个服务:少女搭配,职场搭配,裙装搭配
     */
    public class Program
    {
        static Dictionary<string, string> dicMapping = new Dictionary<string, string>();

        static void Main(string[] args)
        {
            //初始Url的分发
            foreach (var key in ConfigurationManager.AppSettings)
            {
                var factory = new ChannelFactory<ICrawlerService>(new NetTcpBinding(), new EndpointAddress(key.ToString()))
                                 .CreateChannel();

                var urls = ConfigurationManager.AppSettings[key.ToString()]
                                               .Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries)
                                               .ToList();

                factory.AddRange(urls);

                //将网址和“WCF分发地址“建立Mapping映射
                foreach (var item in urls)
                    dicMapping.Add(item, key.ToString());
            }

            Console.WriteLine("爬虫 中央处理器开启,正在监视TODO列表!");

            //开启定时监视MongoDB
            Timer timer = new Timer();

            timer.Interval = 1000 * 10; //10s轮询一次
            timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
            timer.Start();

            Console.Read();
        }

        static void timer_Elapsed(object sender, ElapsedEventArgs e)
        {
            //获取mongodb里面的数据
            MongodbHelper<Message> mongodb = new MongodbHelper<Message>("todo");

            //根据url的类型分发到相应的服务器中去处理
            var urls = mongodb.List(100);

            if (urls == null || urls.Count == 0)
                return;

            foreach (var item in dicMapping.Keys)
            {
                foreach (var url in urls)
                {
                    //寻找正确的 wcf 分发地址
                    if (url.Url.StartsWith(item))
                    {
                        var factory = new ChannelFactory<ICrawlerService>(new NetTcpBinding(),
                                      new EndpointAddress(dicMapping[item]))
                                      .CreateChannel();

                        //向正确的地方分发地址
                        factory.Add(url.Url);

                        break;
                    }
                }
            }

            //删除mongodb中的TODO表中指定数据
            mongodb.Remove(urls);
        }
    }
}

接下来,我们开启WCF服务,当然我们可以做10份,20份的copy,核心代码如下:
/// <summary>
        /// 开始执行任务
        /// </summary>
        public static void Start()
        {
            while (true)
            {
                //监视工作线程,如果某个线程已经跑完数据,则重新分配任务给该线程
                for (int j = 0; j < 10; j++)
                {
                    if (tasks[j] == null || tasks[j].IsCompleted || tasks[j].IsCanceled || tasks[j].IsFaulted)
                    {
                        //如果队列还有数据
                        if (todoQueue.Count > 0)
                        {
                            string currentUrl = string.Empty;

                            todoQueue.TryDequeue(out currentUrl);

                            Console.WriteLine("当前队列的个数为:{0}", todoQueue.Count);

                            tasks[j] = Task.Factory.StartNew((obj) =>
                            {
                                DownLoad(obj.ToString());

                            }, currentUrl);
                        }
                    }
                }
            }
        }

然后我们把”分发服务器“和”中央处理器“开启:

好了,稍等会,我们就会看到,数据已经哗啦啦的往mongodb里面跑了。

 

五:不足点

    有的时候会出现某些机器非常free,而某些机器非常busy,这时就要实现双工通讯了,当执行服务器的内存队列到达

一个量级的时候就应该通知中央处理器,要么减缓对该执行服务器的任务分发,要么将任务分给其他的执行服务器。

最后是工程代码,有什么好的建议可以提出来,大家可以一起研究研究:ConsoleApplication1.rar

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
数据采集 数据库 Python
Python爬虫:滤网架构处理爬虫数据
Python爬虫:滤网架构处理爬虫数据
220 0
Python爬虫:滤网架构处理爬虫数据
|
数据采集 搜索推荐 Python
24、Python快速开发分布式搜索引擎Scrapy精讲—爬虫和反爬的对抗过程以及策略—scrapy架构源码分析图
【百度云搜索:http://www.lqkweb.com】 【搜网盘:http://www.swpan.cn】 1、基本概念 2、反爬虫的目的 3、爬虫和反爬的对抗过程以及策略 scrapy架构源码分析图
6022 0
|
数据采集 消息中间件 NoSQL
三种分布式爬虫系统的架构方式
分布式爬虫系统广泛应用于大型爬虫项目中,力求以最高的效率完成任务,这也是分布式爬虫系统的意义所在。 分布式系统的核心在于通信,介绍三种分布式爬虫系统的架构思路,都是围绕通信开始,也就是说有多少分布式系统的通信方式就有多少分布式爬虫系统的架构思路。
4076 0
|
数据采集 中间件 调度
Python爬虫从入门到放弃(十二)之 Scrapy框架的架构和原理
这一篇文章主要是为了对scrapy框架的工作流程以及各个组件功能的介绍 Scrapy目前已经可以很好的在python3上运行Scrapy使用了Twisted作为框架,Twisted有些特殊的地方是它是事件驱动的,并且比较适合异步的代码。
1821 0
|
数据采集 JavaScript
垂直型爬虫架构设计(1)
个人对于垂直型爬虫的理解,对于垂直型爬虫与常规爬虫的分析.
1596 0
|
Web App开发 存储 数据采集
分布式爬虫技术架构
Spiderman Spiderman 是一个Java开源Web数据抽取工具。它能够收集指定的Web页面并从这些页面中提取有用的数据。 Spiderman主要是运用了像XPath、正则、表达式引擎等这些技术来实现数据抽取。
1192 0
|
数据采集 中间件 数据处理
Python网络爬虫2 ---- scrapy爬虫架构介绍和初试
原文出处:http://my.oschina.net/dragonblog/blog/173290 上一篇文章的环境搭建是相对于手动操作的过程,而大家可能对这个疑问是什么是scrapy?为什么要用scrapy?下面主要是对这两个问题的简要回答。
2067 0
|
1月前
|
弹性计算 API 持续交付
后端服务架构的微服务化转型
本文旨在探讨后端服务从单体架构向微服务架构转型的过程,分析微服务架构的优势和面临的挑战。文章首先介绍单体架构的局限性,然后详细阐述微服务架构的核心概念及其在现代软件开发中的应用。通过对比两种架构,指出微服务化转型的必要性和实施策略。最后,讨论了微服务架构实施过程中可能遇到的问题及解决方案。
|
2月前
|
Cloud Native Devops 云计算
云计算的未来:云原生架构与微服务的革命####
【10月更文挑战第21天】 随着企业数字化转型的加速,云原生技术正迅速成为IT行业的新宠。本文深入探讨了云原生架构的核心理念、关键技术如容器化和微服务的优势,以及如何通过这些技术实现高效、灵活且可扩展的现代应用开发。我们将揭示云原生如何重塑软件开发流程,提升业务敏捷性,并探索其对企业IT架构的深远影响。 ####
64 3
|
2月前
|
Cloud Native 安全 数据安全/隐私保护
云原生架构下的微服务治理与挑战####
随着云计算技术的飞速发展,云原生架构以其高效、灵活、可扩展的特性成为现代企业IT架构的首选。本文聚焦于云原生环境下的微服务治理问题,探讨其在促进业务敏捷性的同时所面临的挑战及应对策略。通过分析微服务拆分、服务间通信、故障隔离与恢复等关键环节,本文旨在为读者提供一个关于如何在云原生环境中有效实施微服务治理的全面视角,助力企业在数字化转型的道路上稳健前行。 ####

热门文章

最新文章