`
woshizn
  • 浏览: 206876 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Java 多线程 爬虫程序(spider)设计与实现

阅读更多
当spider程序访问到一个网页,必须进行以下几项基本处理:抽取网页中包含的文本;抽取网页中包含的URL,并将其区分为网页中包含的文本;抽取网页中包含的URL,并将其区分为网站内URL或网站外URL。

2.2各主要功能 模块(类)设计

2.2.1 spider类

    该类为主类,继承自线程类。它本事并不做获取网页的具体工作,而是协调其他各类共同完成任务。其主要类成员及方法如下:

   2.2.2 spiderworker类

   该类继承线程类,进行获取网页,抽取文本,URL等实际工作。

   2.2.3 urlmanager类

   该类管理所获得的各种URL,利用四种URL队列来管理。

等待队列:等待刚问的URL队列,队列中的URL一经访问完便进入完成队列或不可达URL队列。运行队列:正在访问的URL队列;完成队列:已访问过的URL队列;不可达队列:不可达的URL队列,即该URL对应的文件不可访问。

2.2.4 spiderwatcher类

该类用来监视各线程的运行情况数,能确定实时的活动线程数。

2.3 SPIDER 工作过程

a 给spider程序赋予一个初始URL,加入URL等待队列。

b根据需要确定线程池大小,启动n个线程。

c查询等待队列中是否有URL,若没有,且无其他活动线程序,线程结束;若有转 d。

d从URL等待队列中取出一个URL,并移入运行对流,根据该URL去访问,并进行网页下载,抽取文本,抽取链接等工作。若网页中包含URL,则把这些URL加入等待队列;吧访问过的URL加入完成队列,转c

3.1 java中线程的生命周期

   java的线程从产生到消失,可分为四个状态:

a 新建状态:线程在已被创建但尚未执行这段时间内,处于新建状态。此时,线程对象已被分配内存空间 ,起私有数据已被初始化,但没有给其分配系统资源且线程未被调度。处于此状态的线程,可以通过调用start()或stop()函数来开始线程或终止线程。

b 运行状态:处于此状态的线程,说明它已取得处理器的控制权,正在执行中。

c 不能运行状态:当线程休眠,被挂起或等待某一资源时,它便进入不能运行状态。如果休眠时间过去,或已获得等待的资源,变重新进入运行状态。

d 死状态:当线程正常终止或强行终止时,进入死状态。此时,线程放弃所拥有的所有资源。

3.2 多线程同步

当同时运行的相互独立的线程需要共享数据并且需要考虑其他线程的状态时,就需要使用一套机制使得这些线程同步,避免在争用资源时发生冲突,甚至发生死锁。java提供多种机制以实现线程同步。多数java同步是以对象锁定为中心的。java中从object对象继承来的每个对象都有一个单独的锁。由于java中的每个对象都是从object继承来的。所以Java中的每个对象都有自己的锁。这样使它在共享的线程之间可以相互协调。在java中实现线程同步的另一个方法是通过使用synchronized关键字。java使用synchronized关键字来定义程序中要求线程同步的部分。 synchronized关键字来定义程序中要求线程同步的部分。synchronized关键字实现的基本操作是把每个需要线程同步的部分定义为一个临界区,在临界去中通一时刻只有一个线程被执行。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
长期推荐成都知名外企(英语好 C++ JAVA)
mail to:hot13399@163.com
http://woshizn.iteye.com/blog/1195498
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4 系统实现

spider程序启动时,用下列语句初始化线程,所有线程进入新建状态:

 for(int i=0;i<pool.length;i++)


建立的线程数:

 pool[i].start();


正式为了是spider程序高效地运行,spider程序的工作-访问众多的网页,被分成小的字任务,然后把这些任务分给不同的线程。这些线程相互通信以确定获得新的工作,并把没有完成的工作当作新的工作,而且我们要确保一个URL不被多个线程访问。因此,我们创建一个urlspider类来管理各种URL,各个线程共享这些url。这些url称为临界资源,任一时刻只允许一个线程拥有该资源。如2.2.3所示。该类中从等待队列中取出一个URL的操作geturl()被定义为synchronized,即同一时刻只能有一个线程从等待队列中取出URL,并把url移入运行队列。这个线程操作完后,释放它拥有的等待队列,以便其他线程有机会使用。正是以这种机制,使的n个线程同步运行。

线程进入运行状态,调用run()完成,便进入死状态,如果这样,每个线程只访问一个URL。因此,我们在spiderworker类的run()函数里设置一个循环,每循环一次,线程就查看下一个等待队列里是否有等待url,若有,则取出,访问之;若没有等待URL,还需要查看是否有其他活动的线程,若有,继续循环,否则退出循环。线程进入死状态。考虑以下情况,若循环终止条件仅为等待队列里没有URL。那么,可能会出现以下情况:在某一时刻,URL等待队列为空,一部分线程查看后没取道URL,退出运行状态。而另一部分线程正在网络上访问网页,尚未把刚获得的新的URL加入等待队列。这就造成一部分线程提早退出运行。这使程序的效率大打折扣。实验表明,启动一百个线程,运行一段时间后,往往只剩下两三个线程处于运行状态,其余全部退出运行。这时,该多线程程序几乎退化为单线程。因此,循环终止条件必须设置为等待队列为空且其余活动线程数为零。为此,我们建立spiderwacher类,来监视各个线程的运行状态。如2.2.4所示。当一个线程从等待队列获取到一个URL时,活动线程数加一,访问完URL时,活动线程数减一。这样,我们就能确保所有线程一直保持运行状态知道没有新的URL出现。
分享到:
评论

相关推荐

    简单爬虫 Java实现 多线程

    Java 爬虫 spider crawder web

    基于Python的一个获取知乎用户主页信息的多线程爬虫程序源码.zip

    基于Python的一个获取知乎用户主页信息的多线程爬虫程序源码.zip 一个获取知乎用户主页信息的多线程Python爬虫程序。 简介: * 使用[Requests](http://www.python-requests.org/en/master/)模拟HTTP请求/响应,...

    网络爬虫论文 Java实现 多线程

    我自己做的毕业设计论文 题目是《网络爬虫的设计与实现》 java做的

    java写爬虫代码

    java写爬虫代码,很适合初学者学习的。java写爬虫代码 超简单的 Web 爬虫程序,不过可以在他基础之上改造一下,写出强大...但是jaxa部分要删去,因PHP不是多线程。下面是网上转载的一个JAVA爬虫小例。很好的学习资料。

    网络爬虫之Spider

    小小网络爬虫测试软件,对搜索引擎设计者有所帮助!java语言开发。需要导入第三方包,可以到网站上下载,也可以找本人索取。

    java源码网络爬虫-spider4j:Spider4j是从webmagicforJava扩展而来的开源Web爬网程序,它提供了用于爬网Web

    java原始网络爬虫蜘蛛4j Spider4j是从webmagic for Java扩展而来的开源Web爬网程序,它提供了用于爬网Web的简单界面。 使用它,您可以在几分钟内设置多线程Web搜寻器。

    简易网络爬虫的实现

    简易网络爬虫的实现,实现了网页的解析和抽取网页的相关数据,并将数据写入文本文件中。解析页面还涉及到了多线程技术。

    java8stream源码-elves::confetti_ball:轻量级爬虫框架的设计与实现

    一个轻量级的爬虫框架设计与实现,。 特性 事件驱动 易于定制 多线程执行 CSS 选择器和 XPath 支持 Maven 坐标 &lt;groupId&gt;io.github.biezhi &lt;artifactId&gt;elves &lt;version&gt;0.0.2 如果你想在本地运行这个项目源码,请...

    Sosoo 1.0网络爬虫程序.doc

    Sosoo 1.0网络爬虫程序 ---用户开发手册 编写人:王建华(rimen/jerry) 编写目的:基于sosoo定制web spider程序的编程人员。 目录 一:安装sosoo 2 二:功能定制 2 1.基本功能参数的设置。 2 2.配置...

    多线程美团酒店爬虫,python模拟美团_tokenMeituan-spider.zip

    这种系统通常涵盖多个方面,包括客房预订、前台管理、客户关系管理、财务管理、员工管理、库存管理、报告和分析等。通过使用酒店管理系统,酒店可以更高效地管理他们的业务,提高客户满意度,优化运营流程,并实现更...

    python写的一个简单的爬虫

    这是一个简单的多线程的小爬虫,可以实现抓取并下载csdn上任何一个人的文章,可以修改spider改成你想爬的网站的内容。

    java网络爬虫,网络检索作业

    实现了一下功能: (1) 能够搜集本站内的所有网页,能提取出其中的URL并加入到待搜集的URL队列中,对非本网站域名的URL,只允许搜集首页,记录发现的URL即可;... (7)采用多线程并行编程技术,提高搜集速度。

    WebCrawler.java

    sun官方提供的网络爬虫的一个实现,用的是Applet。附件内容为具体源码。

    WebMagic 0.4.0 发布,Java爬虫框架

    重写了多线程逻辑 代码更加易懂了 同时修复了一些线程安全问题 引入了Google Guava API 让代码更简洁 增加配置Spider setSpawnUrl false 此选项为false时 只下载给定的url 不下载任何新发现的url 可以给初始url中...

    Java-Spider:AklisのJAVA初体验-爬虫-想去爬萌萌的图

    Java-Spider AklisのJAVA初体验-爬虫-想去爬萌萌的图 下一次更新会完成抓取页面内的链接 不递归 下下一次更新会完成多线程

    norkts-spider:网络爬虫的初步实现

    多线程的网络爬虫,App类是一个抓取百度新闻的所有网页存储到本地的实例程序 程序中使用了Jsoup作为HTML解析器 要实际使用,首先需要给ProcessThread添加Processor,如果需要URL过滤,还需要添加URL Filter HTTP请求...

    java8源码-elevs:高铁

    一个轻量级的爬虫框架设计与实现,。 特性 事件驱动 易于定制 多线程执行 CSS 选择器和 XPath 支持 Maven 坐标 &lt;groupId&gt;io.github.biezhi &lt;artifactId&gt;elves &lt;version&gt;0.0.2 如果你想在本地运行这个项目源码,请...

Global site tag (gtag.js) - Google Analytics