`
woshizn
  • 浏览: 209760 次
  • 性别: 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出现。
分享到:
评论

相关推荐

    基于多线程的网络爬虫设计与实现.pdf

    ### 基于多线程的网络爬虫设计与实现 #### 概述 网络爬虫作为一种高效的数据抓取工具,在大数据时代扮演着极其重要的角色。通过对互联网网页内容的自动检索与下载,网络爬虫为数据挖掘、搜索引擎优化等工作提供了强...

    简单爬虫 Java实现 多线程

    通过以上步骤,我们可以构建一个基础的Java多线程爬虫。在实际应用中,可能还需要结合其他工具和技术,如Scrapy for Java、Nutch等高级爬虫框架,以及Apache Tika进行内容分析,或者使用Hadoop进行大数据处理。总之...

    Java编写spider网络爬虫程序源码

    - **多线程/异步**:为了提高爬虫效率,可以采用多线程或异步处理技术。 - **分布式爬虫**:当需要抓取大量数据时,可以设计分布式爬虫,将任务分散到多台机器上执行。 - **动态内容加载**:如今很多网站使用AJAX等...

    网络爬虫之Spider

    综上所述,“网络爬虫之Spider”项目是一个使用Java语言实现的网络爬虫软件,通过多线程技术提高了爬取效率,可能利用了第三方库进行网络请求和HTML解析,并具备数据存储和异常处理功能。通过这个项目,开发者可以...

    Java网络爬虫程序

    3. **程序(Program)**:Java程序的实现通常涉及类的设计、异常处理、线程管理等。这个项目可能包含一个主类作为爬虫的入口,以及多个辅助类来分别负责请求、解析、存储等功能。 接下来,我们关注压缩包中的文件:...

    Java-Web-crawler-spider.rar_JAVA web 爬虫_Java spider_crawler_spid

    Java Web 爬虫,又称为Java Spider或Crawler,是一种自动抓取互联网信息的程序。在Java领域,实现Web爬虫技术可以帮助开发者获取大量网页数据,进行数据分析、搜索引擎优化、市场研究等多种用途。本资源"Java-Web-...

    python实现的多线程爬虫源码.zip

    本资源"python实现的多线程爬虫源码.zip"包含了一个名为"multithreading-spider-master"的项目,它很可能是用Python编写的一个多线程爬虫示例。以下是对这个主题的详细讲解: 首先,我们需要理解什么是网络爬虫。...

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

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

    多线程精品资源--QQZone mood spider and analysis. QQ空间多线程爬虫和数据挖掘。提.zip

    在【描述】中,“QQ空间多线程爬虫和数据挖掘。提”进一步确认了项目的重点在于QQ空间的数据抓取,特别是情绪数据,同时采用了数据挖掘技术来深入分析这些信息。可能包括对用户发表的状态、照片、评论等进行情感分析...

    java爬虫spider

    Java爬虫,通常被称为Spider,是一种使用编程语言(如Java)编写的应用程序,用于自动抓取互联网上的信息。Java作为一款强大的、跨平台的编程语言,非常适合开发爬虫项目。在本篇中,我们将深入探讨Java爬虫的相关...

    用java写的crawler(spider)网络爬虫 源代码

    综上所述,Java网络爬虫的开发涉及到多个方面的技术和实践,不仅需要掌握基本的编程知识,还需要了解网络协议、多线程处理、GUI设计等相关领域的知识。通过对上述关键技术点的理解和应用,可以帮助开发者更好地构建...

    强力 Java 爬虫spiderman-master.zip

    在"强力 Java 爬虫spiderman-master.zip"这个压缩包中,我们很可能找到了一个名为"spiderman-master"的项目源码,这通常是一个Java爬虫项目的根目录。该项目可能包含了实现爬虫功能的各种组件和配置,帮助开发者构建...

    网络爬虫Java实现原理

    ### 网络爬虫Java实现原理...本篇文章详细介绍了如何使用Java实现网络爬虫,包括Spider类的设计、与主程序的交互方式以及具体的实现细节。通过深入理解这些原理和技术,开发者可以更好地应用Java进行网络爬虫的开发。

    java——spider

    【Java——Spider】是一个关于使用Java编程语言实现网络爬虫(Spider)的示例程序,其主要目的是将一个网站的所有HTML文件抓取并保存到本地硬盘。网络爬虫是自动化浏览互联网并提取信息的一种工具,它能够遍历网页,...

    java爬虫源码

    了解并掌握上述知识点后,你就可以构建一个功能完善的Java多线程爬虫,高效地抓取和处理网络上的数据。"webspider"这个文件可能包含了实现这些功能的源代码,你可以研究这些代码以加深对Java爬虫开发的理解。

    爬虫程序开发指南2(java)

    Sosoo设计为多线程,核心类是`com.sosoo.robot.spider.Roboter`,它代表一个爬虫机器人。通过设置JavaBean属性,可以自定义其行为。 **四:应用开发指南** 开发Sosoo应用涉及以下关键组件和接口: 1. **Roboter类...

    网络爬虫网络爬虫

    3. **多线程与并发**:为了提高爬虫的效率,我们常采用多线程或异步处理。Java的并发库提供了丰富的工具,如`ExecutorService`和`Future`,帮助我们管理线程池和任务执行。 4. **数据存储**:抓取的数据可能需要...

Global site tag (gtag.js) - Google Analytics