zoukankan      html  css  js  c++  java
  • 搜索引擎手记(二)之爬虫的开发

    2015323日(星期一) 

    晴、南风

      今天数据组开会说爬虫已经开发完毕,在尝试爬网站。由于我们采集的网站,网址都是固定的,并且爬虫网页深度为3。不需要像heritrix这些通用爬虫那么强大的功能。

    爬虫主要采用了httpclienthtmlparse两个Java库,爬虫的架构思路借鉴了下面的思路。

    一、        架构图

    那里搜网络爬虫框架主要针对电子商务网站进行数据爬取,分析,存储,索引。
     

    爬虫:爬虫负责爬取,解析,处理网页的内容

    数据库:存储网页信息

    索引:网页内容的指纹信息

    Task队列:需要爬取的网页列表

    Visited表:已经爬取过的网页列表

    爬虫监控平台:web平台可以启动,停止爬虫,管理爬虫,task队列,visited表。

    二、 爬虫

    1.      流程

    1)       Scheduler启动爬虫器,TaskMaster初始化taskQueue

    2)       WorkersTaskQueue中获取任务

    3)       Worker线程调用Fetcher爬取Task中描述的网页

    4)       Worker线程将爬取到的网页交给Parser解析

    5)       Parser解析出来的数据送交Handler处理,抽取网页Link和处理网页内容

    6)       VisitedTableManager判断从URLExtractor抽取出来的链接是否已经被爬取过,如果没有提交到TaskQueue



     

    2.      Scheduler

    Scheduler负责启动爬虫器,调用TaskMaster初始化TaskQueue,同时创建一个monitor线程,负责控制程序的退出。

    3.      Task Master

      任务管理器,负责管理任务队列。任务管理器抽象了任务队列的实现。

    在现阶段,我们用mysql作为任务队列的实现。可供替代的还有Redis

    任务管理器的处理流程:

    1)        任务管理器初始化任务队列,任务队列的初始化根据不同的配置可能不同。增量式的情况下,根据指定的URL List初始化。而全文爬取的情况下只预先初始化某个或几个电子商务网站的首页。

    2)       任务管理器创建monitor线程,控制整个程序的退出

    3)       任务管理器调度任务,如果任务队列是持久化的,负责从任务队列服务器load任务。需要考虑预取。

    4)       任务管理器还负责验证任务的有效性验证,爬虫监控平台可以将任务队列中的某些任务设为失效?

    4.      Workers

      Worker线程池,每个线程都会执行整个爬取的流程。可以考虑用多个线程池,分割异步化整个流程。提高线程的利用率。

    5.      Fetcher

      Fetcher负责直接爬取电子商务网站的网页。用HTTP Client实现。HTTP core 4以上已经有NIO的功能NIO实现。

    Fetcher可以配置需不需要保存HTML文件

    6.      Parser

      Parser解析Fetcher获取的网页,一般的网页可能不是完好格式化的(XHTML是完美格式化的),这样就不能利用XML的类库处理。我们需要一款比较好的HTML解析器,可以修复这些非完好格式化的网页,我们采用的是htmlparse

    7.      Handler

      Handler是对Parser解析出来的内容做处理。

    回调方式(visitor):对于SAX event处理,我们需要将handler适配成saxcontent handler。作为parser的回调方法。不同事件解析出来的内容可以存储在HandlingContext中。最后由Parser一起返回。

      主动方式:需要解析整个HTML,选取自己需要的内容。对Parser提取的内容进行处理。XML需要解析成DOM结构。方便使用,可以使用Xpathnodefilter等,但耗内存。

    ContentHandler:它还包含组件ContentFilter。过滤content

    URLExtractor负责从网页中提取符合格式的URL,将URL构建成Task,并提交到Task queue中。

    8.      VisitedTableManager

      访问表管理器,管理访问过的URLs。提取统一接口,抽象底层实现。如果URL被爬取过,就不会被添加到TaskQueue中。

    三、        Task队列

      Task队列存储了需要被爬取的任务。任务之间是有关联的。我们可以保存和管理这个任务关系。这个关系也是URL之间的关系。保存下来,有助于后台形成Web图,分析数据。

    Task队列在分布式爬虫集群中,需要使用集中的服务器存放。一些轻量级的数据库或者支持列表的NoSql都可以用来存储。可选方案:

    1)         mysql存储。

    2)         Redis存储

    四、        Visited

      Visited表存储了已经被爬的网站。每次爬取都需要构建。

      针对目前的数据量,采用mysql

    五、结束语

      爬虫是爬虫组负责的开发,我没有详细的参与,具体的细节不是很清楚。不过,后来听说爬虫出现了经常掉线的问题。经常遭网站屏蔽,问题至今没解决。

    擅长爬虫技术的,可以指导一下。

         今天是难得的晴天。窗外,两棵不知名的树,树叶也已经绿了。焕发生机的树干,直插云端,让远方的天空,显得那样近,那么蓝。

  • 相关阅读:
    2020系统综合实践 第4次实践作业
    2020系统综合实践 第3次实践作业
    2020系统综合实践 第2次实践作业
    第1次实践作业
    Wireshark组 2019SDN大作业
    第04组 Beta版本演示
    转载:北大老师语录(2016年秋)
    康德哲学基本概念
    white album句子
    tex基础
  • 原文地址:https://www.cnblogs.com/bigdatafly/p/5008967.html
Copyright © 2011-2022 走看看