基于广度优先算法的多线程网络爬虫毕业设计(编辑修改稿)内容摘要:
网络爬虫就是通过提取和分析出网页中的 URL 地址,对相应网络进行爬取。 HTTP 协议 超文本传输协议 (HTTPHypertext transfer protocol) 是一种详细规定了浏览器和万维网服务器之间互相通信的规则,通过因特网传送万维网文文件的数据传送协议。 HTTP 协议简介 超文本传输协议 (HTTPHypertext transfer protocol) 是分布式,协作式,超媒体系统应用之间的通信协议。 是万维网( world wide web)交换信息的基础。 HTTP 是 IETF( Inter Engineering Task Force)制定的国际化标准。 在 HTTP 标准制定和实现的过程中, W3C 积极参与了其中的工作,并发挥了重要作用。 它允许将超文本标记语言 (HTML) 文 档 从 Web 服务器传送到 Web 浏览器。 HTML 是一种用于创建文文件的标记语言,这些文文件包含到相关信息的链接。 您可以单击一个链接来访问其它文文件、图像或多媒体对象,并获得关于链接项的附加信息。 HTTP 协议的主要特点可概括如下: 沈阳理工大学学士学位论文 7 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。 请求方法常用的有 GET、 HEAD、 POST。 每种方 法规定了客户与服务器联系的类型不同。 由于 HTTP协议简单,使得 HTTP 服务器的程序规模小,因而通信速度很快。 灵活: HTTP 允许传输任意类型的数据对象。 正在传输的类型由 ContentType 加以标记。 无连接:无连接的含义是限制每次连接只处理一个请求。 服务器处理完客户的请求,并收到客户的应答后,即断开连接。 采用这种方式可以节省传输时间。 无状态: HTTP 协议是无状态协议。 无状态是指协议对于事务处理没有记忆能力。 缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数 据量增大。 另一方面,在服务器不需要先前信息时它的应答就较快。 HTTP 消息 结 构 Request 消息 结 构: Response 消息 结 构: 请 求方法 根据 HTTP 标准, HTTP 请求可以使用多种请求方法。 例如: 目前支持 7 种请求方法: GET、 POST、 HEAD、 OPTIONS、 PUT、 DELETE和 TARCE。 GET 请求获取由 RequestURI 所标识的资源。 POST 在 RequestURI 所标识的资源后附加新的数据。 HEAD 请求获取由 RequestURI 所标识的资源的响应消息报头。 沈阳理工大学学士学位论文 8 OPTIONS 请求查询服务器的性能,或查询与资源相关的选项和需求。 PUT 请求服务器存储一个资源,并用 RequestURI 作为其标识。 DELETE 请求服务器删除由 RequestURI 所标识的资源。 TRACE 请求服务器回送收到的请求信息,主要用语测试或诊断。 URI 完整地指定了要访问的网络资源,通常只要给出相对于服务器的根目录的相对目录即可,因此总是以“ /”开头,最后,协议版本声明了通信过程中使用 HTTP 的版本。 一 个 URL地址用于描述一 个 网 络 上的 资 源,而 HTTP中的 GET, POST, PUT, DELETE就 对应着对这个资 源的查,改,增, 删 4 个 操作。 其中最常 见 的就是 GET 和 POST 了。 GET 一般用于 获 取 /查 询资 源信息;而 POST 一般用于更新 资 源信息。 以下是二者的 区别 : 1. GET 提交的 数 据 会 放在 URL 之后,以 ?分割 URL 和 传输数 据, 参数 之 间 以 amp。 相连 ,如 ?name=test1amp。 id=123456; POST 方法是把提交的 数 据放在 HTTP 包的 Body 中; 2. GET 提交的 数 据大小有限制(因 为 浏览 器 对 URL 的 长 度有限制。 也有人 说 依服 务 器的 处 理能力而定);而 POST 方法提交的 数 据 没 有限制; 3. GET 方式需要使用 来 取得 变 量的值;而 POST 方式通 过 取 变数 的值; 4. GET 方式提交 数 据, 会带来 安全 问题 ,比如一 个 登 录页 面,通 过 GET 方式提交数 据 时 ,用 户 名和密 码将 出 现 在 URL 上,如果 页 面可以被 缓 存或者其它人可以 访问这 台机器,就可以 从历 史 记录获 得 该 用 户 的 账号 和密 码 ; HTTP 状态代码 状态代码由 3 位数字组成,表示请求是否被理解或被满足。 状态描述 : 状态描述给出了关于状态代码的简短的文字描述。 状态代码的第一个数字定义了响应的类别,后面两位没有具体的分类。 第一个数字有五种可能的取值: 沈阳理工大学学士学位论文 9 1xx: 指示信息 — 表示请求已接收,继续处理。 2xx: 成功 — 表示请求已经被成功接收、理解、接受。 3xx: 复位向 — 要完成请求必须进行更进一步的操作。 4xx: 客户端错误 — 请求有语法错误或请求无法实现。 5xx: 服务器端错误 — 服务器未能实现合法的请求。 状态代码状态描述说明 200 OK 客户端请求成功 400 Bad Request 由于客户端请求有语法错误,不能被服务器所理解。 401 Unauthonzed 请求未经授权。 这个状态代码必须和 WWWAuthenticate 报头域一起使用 403 Forbidden 服务器收到请求,但是拒绝提供服务。 服务器通常会在回应正文中给出不提供服务的原因 404 Not Found 请求的资源不存在,例如,输入了错误的 URL。 500 Internal Server Error 服务器发生不可预期的错误,导致无法完成客户端 的请求。 503 Service Unavailable 服务器当前不能够处理客户端的请求,在一段时间之后,服务器可能会恢复正常。 JAVA 多线 程 在一个程序中,一些独立运行的程序片断叫做“线程”( Thread),利用它编程的概念就叫作“多线程处理”。 (摘自百度百科 [5]) 定 义 线程的概念来源于计算机的操作系统的进程的概念。 进程是一个程序关于某个数据集的一次运行。 也就是说,进程是运行中的程序,是程序的一次运行活动。 线程和进程的相似之处在于,线程和运行的程 序都是单个顺序控制流。 有些教材将线程称为轻量级进程 (light weight process)。 线程被看作是轻量级进程是因为它运行在一个程序的上下文内,并利用分配给程序的资源和环境。 沈阳理工大学学士学位论文 10 作为单个顺序控制流,线程必须在运行的程序中得到自己运行的资源,如必须有自己的执行栈和程序计数器。 线程内运行的代码只能在该上下文内。 因此还有些教程将执行上下文 (execution context)作为线程的同义词。 所有的程序员都熟悉顺序程序的编写,如我们编写的名称排序和求素数的程序就是顺序程序。 顺序程序都有开始、执行序列和结束 ,在程序执行的任何时刻,只有一个执行点。 线程( thread) 则是进程中的一个单个的顺序控制流。 单线程的概念很简单,如图所示。 多线程( multithread)是指在单个的程序内可以同时运行多个不同的线程完成不同的任务,图 说明了一个程序中同时有两个线程运行。 图 单线程程序示意图 图 多线程程序示意图 有些程序中需要多个控制流并行执行。 例如, for(int i = 0。 i 100。 i++) (Runner A = + i)。 for(int j = 0。 j 100。 j++ ) (Runner B = +j)。 上面的代码段中,在只支持单线程的语言中,前一个循环不执行完不可能执行第二个循环。 要使两个循环同时执行,需要编写多线程的程序。 很多应用程序是用多线程实现的,如 Hot Java Web 浏览器就是多线程应用的例子。 在 Hot Java 浏览器中,你可以 一边滚动屏幕,一边下载 Applet 或图像,可以同时播放动画和声音等。 优 点 一个线程 两个线程 沈阳理工大学学士学位论文 11 使用线程可以把占据时间长的程序中的任务放到后台去处理。 用户接口可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度。 程序的运行速度可能加快。 在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。 在这种情况下可以释放一些珍贵的资源如内存占用等等。 还有其它很多使用多线程的好处,这里就不在累述。 不足 ,会 影响性能 ,因为操作系统需要在它们之间切换。 “ Bug”,因此要小心使用。 ,需要防止线程死锁情况的发生。 JAVA 多线 程 编 程 计算机程序得以执行的三个要素是: CPU,程序代码,可存取的数据。 在 JAVA 语言中,多线程的机制是通过虚拟 CPU 来实现的。 可以形象的理解为 ,在一个 JAVA 程序内部虚拟了多台计算机,每台计算机对应一个线程,有自己的 CPU, 可以获取所需的代码和数据,因此能独立执行任务,相互间还可以共享代码和数据。 JAVA 的线程是通过 类来实现的,它内部实现了虚拟 CPU 的功能,能够接收和处理传递给它的代码和资料,并提供了独立的运行控制功能。 每个 JAVA 应用程序都至少有一个线程,这就是所谓的主线程。 它由 JVM 创建并调用 JAVA 应用程序的 main 方法。 Java 语言实现多线程编程的类和接口。 在 包中定义了 Runnable 接口和Thread 类。 Runnable 界面中只定义了一个方法,它的格式为: public abstract void run() 这个方法要由实现了 Runnable 接口的类实现。 Runnable 对象称为可运行对象,一个线程的运行就是执行该对象的 run()方法。 沈阳理工大学学士学位论文 12 Thread 类实现了 Runnable 接口,因此 Thread 对象也是可运行对象。 同时 Thread 类也是线程类,该类的构造方法如下: public Thread() public Thread(Runnable target) public Thread(String name) public Thread(Runnable target, String name) public Thread(ThreadGroup group, Runnable target) public Thread(ThreadGroup group, String name) public Thread(ThreadGroup group, Runnable target, String name) target 为线程运行的目标对象,即线程调用 start()方法启动后运行那个对象的 run()方法,该对象的类型为 Runnable,若没有指定目标对象,则以当 前类对象为目标对象;name 为线程名, group 指定线程属于哪个线程组。 Thread 类的常用方法有: public static Thread currentThread() 返回当前正在执行的线程对象的引用。 public void setName(String name) 设置线程名。 public String getName() 返回线程名。 public static void sleep(long millis) throws InterruptedException public static void sleep(long millis, int nanos) throws InterruptedException 使当前正在执行的线程暂时停止执行指定的毫秒时间。 指定时间过后,线程继续执行。 该方法抛出 InterruptedException 异常,必须捕获。 public void run() 线程的线程体。 public void start() 由 JVM 调用线程的 run()方法,启动线程开始执行。 public void setDaemon(boolean on) 设置线程为 Daemon 线 程。 public boolean isDaemon() 返回线程是否为 Daemon 线程。 public static void yield() 使当前执行的线程暂停执行,允许其它线程执行。 public ThreadGroup getThreadGroup() 返回该线程所属的线程组对象。 public void interrupt() 中断当前线程。 public boolean isAlive() 返回指定线程是否处于活动状。基于广度优先算法的多线程网络爬虫毕业设计(编辑修改稿)
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。
用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。