网络爬虫(Spider)Java实现原理

合集下载

搜索引擎spider爬虫(蜘蛛)原理

搜索引擎spider爬虫(蜘蛛)原理

搜索引擎spider爬⾍(蜘蛛)原理做SEO的⼈应该要对搜索引擎的基本原理有⼀些了解,从搜索引擎发现⽹址到该页⾯拥有排名,以及后续更新整个过程中,搜索引擎到底是怎么⼯作的?你都需要了解。

对于专业的算法不必进⾏深⼊的研究,但是对于搜索引擎⼯作中的⽣命⼒和算法原理要有个简单的认知,这样才能更有效地开展SEO⼯作,知其然也要知其所以然;当然也有⼀些朋友不懂这些,照样做昨有声有⾊,但是有对搜索引擎⼯作原理,懂总⽐不懂好⼀点。

以往的SEO书藉中对这内容讲解都⽐较简单,希望在些能够尝试结合SEO实际⼯作和现象,更进⼀步剖析⼀下搜索引擎的⼯作原理,其实当你了解了搜索引擎的⼯作流程、策略和基本算法后,就可以在⼀定程序上避免因为不当操作⽽带来的不必要处罚,同也可以快速分析出很多搜索引擎搜索结果异常的原因。

有搜索⾏为的地⽅就有搜索引擎,站内搜索、全⽹搜索、垂直搜索等都⽤到搜索引擎;接下来,本⽂会根据从业认知,讨论⼀下全⽂搜索引擎的基本架构。

百度、⾕歌等综合搜索巨头肯定有着更为复杂的架构和检索技术,但宏观上基本原理都差不多的。

搜索引擎的⼤概架构如图2-1所⽰。

可以分成虚线左右两个部分:⼀部分是主动抓取⽹页进⾏⼀系列处理后建⽴索引,等待⽤户搜索;另⼀部分是分析⽤户搜索意图,展现⽤户所需要的搜索结果。

搜索引擎主动抓取⽹页,并进⾏内容处理、索引部分的流程和机制⼀般如下:1.派出spider按照⼀定策略把⽹页抓回到搜索引擎服务器;2.对抓回的⽹页进⾏链接抽离、内容处理,削除噪声、提取该页主题⽂本内容等;3.对⽹页的⽂本内容进⾏中⽂分词、去除停⽌词等;4.对⽹页内容进⾏分词后判断该页⾯内容与已索引⽹页是否有重复,剔除重复页,对剩余⽹页进⾏倒排索引,然后等待⽤户的检索。

当有⽤户进⾏查询后,搜索引擎⼯作的流程机制⼀般如下:1.先对⽤户所查询的关键词进⾏分词处理,并根据⽤户的地理位置和历史检索特征进⾏⽤户需求分析,以便使⽤地域性搜索结果和个性化搜索结果展⽰⽤户最需要的内容;2.查找缓存中是否有该关键词的查询结果,如果有,有为最快地呈现查询,搜索引擎会根据当下⽤户的各种信息判断其真正需求,对缓存中的结果进⾏微调或直接呈现给⽤户;3.如果⽤户所查询的关键词在缓存中不存在,那么就在索引库中的⽹页进⾏调取排名呈现,并将该关键词和对应的搜索结果加⼊到缓存中;4.⽹页排名是⽤户的搜索词和搜索需求,对索引库中⽹页进⾏相关性、重要性(链接权重分析)和⽤户体验的⾼低进⾏分析所得出的。

爬虫工作原理

爬虫工作原理

爬虫工作原理爬虫,又称网络爬虫、网络蜘蛛,是一种按照一定的规则,自动地抓取互联网信息的程序或者脚本。

它可以在互联网上自动采集信息,并将采集到的信息存储在本地或者数据库中。

爬虫在搜索引擎、数据挖掘、网络监测等领域有着广泛的应用。

那么,爬虫是如何工作的呢?接下来,我们将从爬虫的工作原理来详细介绍。

首先,爬虫需要一个起始的URL,它会从这个URL开始抓取页面。

当爬虫访问一个页面时,它会解析页面内容,提取出页面中的链接,并将这些链接加入待抓取的URL队列中。

然后,爬虫会从待抓取的URL队列中取出一个URL,再次访问页面,重复上述的过程。

这就是爬虫的基本工作流程。

在访问页面时,爬虫需要注意一些细节。

比如,爬虫需要模拟浏览器的行为,设置合适的User-Agent,以免被网站屏蔽;还需要处理页面中的动态加载内容,确保能够获取到完整的页面信息。

另外,爬虫还需要处理页面中的重定向、验证码等情况,以确保能够正常地获取页面内容。

当爬虫抓取到页面内容后,它会进行页面内容的解析。

这包括提取页面中的文本信息、图片、链接等内容。

爬虫会根据预先设定的规则,提取出需要的信息,并将这些信息进行存储或者进一步处理。

在提取文本信息时,爬虫可能会用到正则表达式、XPath、CSS选择器等技术,以便能够准确地提取出目标信息。

在处理图片、视频等非文本内容时,爬虫可能会用到一些其他的技术。

比如,爬虫可能会下载图片到本地,或者将视频链接保存下来,以备后续处理。

这些非文本内容的处理,通常需要依赖于一些第三方的库或者工具。

除了页面内容的解析,爬虫还需要处理页面中的链接。

爬虫可能会根据一定的规则,筛选出需要抓取的链接,并将这些链接加入待抓取的URL队列中。

同时,爬虫还需要考虑到页面中的循环链接、重复链接等情况,以免陷入无限循环的抓取中。

最后,爬虫还需要考虑一些其他的问题。

比如,爬虫可能需要处理页面中的编码问题,以确保能够正确地解析页面内容。

另外,爬虫还需要考虑到抓取速度、并发数、代理IP等问题,以确保能够高效地抓取页面内容。

使用JAVA进行网络爬虫和数据抓取的方法与建议

使用JAVA进行网络爬虫和数据抓取的方法与建议

使用JAVA进行网络爬虫和数据抓取的方法与建议一、引言随着互联网的快速发展,网络上的数据量也在不断增长。

为了获取和分析这些数据,网络爬虫和数据抓取成为了一种重要的技术手段。

本文将介绍使用JAVA进行网络爬虫和数据抓取的方法与建议。

二、网络爬虫的原理网络爬虫是一种自动化程序,通过模拟浏览器的行为,访问网页并抓取其中的数据。

其主要原理包括以下几个步骤:1. 发送HTTP请求:通过JAVA的网络编程库,发送HTTP请求到目标网址。

2. 下载网页内容:获取到HTTP响应后,将网页内容下载到本地。

3. 解析网页内容:使用HTML解析库,解析网页的结构,提取出需要的数据。

4. 存储数据:将提取到的数据存储到数据库或者文件中。

三、JAVA网络编程库的选择在使用JAVA进行网络爬虫和数据抓取之前,我们需要选择一个适合的网络编程库。

常用的网络编程库有Apache HttpClient、OkHttp等。

这些库提供了丰富的API,可以方便地发送HTTP请求和处理HTTP响应。

四、HTML解析库的选择HTML解析库可以帮助我们解析网页的结构,提取出需要的数据。

常用的HTML解析库有Jsoup、HtmlUnit等。

这些库提供了简洁的API,可以方便地进行网页解析和数据提取。

五、设置合适的请求头在发送HTTP请求时,我们需要设置合适的请求头。

一些网站可能会对爬虫进行限制,通过设置合适的请求头可以模拟浏览器的行为,降低被封禁的风险。

常见的请求头包括User-Agent、Referer等。

六、处理反爬机制为了防止被爬虫抓取,一些网站会采取一些反爬机制,如验证码、IP封禁等。

在进行网络爬虫和数据抓取时,我们需要针对这些反爬机制进行相应的处理。

可以通过使用代理IP、使用验证码识别库等方式来应对反爬机制。

七、数据存储与处理在进行数据抓取之后,我们需要将抓取到的数据进行存储和处理。

可以选择将数据存储到数据库中,如MySQL、MongoDB等;也可以选择将数据存储到文件中,如CSV、JSON等。

爬虫的原理

爬虫的原理

爬虫的原理
爬虫,又称网络爬虫,是一种按照一定的规则,自动地抓取互联网信息的程序或脚本。

爬虫的原理主要包括以下几个方面,网页抓取、网页解析、数据存储和更新等。

首先,爬虫的原理之一是网页抓取。

爬虫程序通过发送HTTP请求,获取网页的HTML源代码。

在发送请求的过程中,爬虫需要模拟浏览器的行为,包括发送请求头、处理Cookie等,以便获取完整的网页内容。

在获取网页内容后,爬虫需要对网页进行解析。

其次,爬虫需要进行网页解析。

网页解析是指对获取的HTML源代码进行解析和提取有用信息的过程。

爬虫程序可以利用正则表达式、XPath、CSS选择器等技术,从HTML源代码中提取出需要的数据,如链接、文本、图片等。

解析完网页后,爬虫需要将提取的数据进行存储。

然后,爬虫需要进行数据存储和更新。

爬虫程序通常会将抓取到的数据存储到数据库或者本地文件中,以便后续的数据分析和处理。

同时,爬虫还需要定期更新已经抓取的数据,以保证数据的及时性和准确性。

除了以上几个主要的原理外,爬虫还需要考虑一些其他的问题。

比如,爬虫需要处理网页的反爬机制,避免被网站封禁IP或者账号。

此外,爬虫还需要考虑并发抓取、分布式部署、数据去重等问题,以提高抓取效率和数据质量。

总的来说,爬虫的原理主要包括网页抓取、网页解析、数据存储和更新等几个方面。

通过对这些原理的深入理解,可以帮助开发者更好地设计和实现爬虫程序,从而更高效地抓取和处理互联网上的海量数据。

干货:一文看懂网络爬虫实现原理与技术(值得收藏)

干货:一文看懂网络爬虫实现原理与技术(值得收藏)

干货:一文看懂网络爬虫实现原理与技术(值得收藏)01 网络爬虫实现原理详解不同类型的网络爬虫,其实现原理也是不同的,但这些实现原理中,会存在很多共性。

在此,我们将以两种典型的网络爬虫为例(即通用网络爬虫和聚焦网络爬虫),分别为大家讲解网络爬虫的实现原理。

1. 通用网络爬虫首先我们来看通用网络爬虫的实现原理。

通用网络爬虫的实现原理及过程可以简要概括如下(见图3-1)。

▲图3-1 通用网络爬虫的实现原理及过程1.获取初始的URL。

初始的URL地址可以由用户人为地指定,也可以由用户指定的某个或某几个初始爬取网页决定。

2.根据初始的URL爬取页面并获得新的URL。

获得初始的URL地址之后,首先需要爬取对应URL地址中的网页,爬取了对应的URL地址中的网页后,将网页存储到原始数据库中,并且在爬取网页的同时,发现新的URL地址,同时将已爬取的URL地址存放到一个URL列表中,用于去重及判断爬取的进程。

3.将新的URL放到URL队列中。

在第2步中,获取了下一个新的URL地址之后,会将新的URL地址放到URL队列中。

4.从URL队列中读取新的URL,并依据新的URL爬取网页,同时从新网页中获取新URL,并重复上述的爬取过程。

5.满足爬虫系统设置的停止条件时,停止爬取。

在编写爬虫的时候,一般会设置相应的停止条件。

如果没有设置停止条件,爬虫则会一直爬取下去,一直到无法获取新的URL地址为止,若设置了停止条件,爬虫则会在停止条件满足时停止爬取。

以上就是通用网络爬虫的实现过程与基本原理,接下来,我们为大家分析聚焦网络爬虫的基本原理及其实现过程。

2. 聚焦网络爬虫聚焦网络爬虫,由于其需要有目的地进行爬取,所以对于通用网络爬虫来说,必须要增加目标的定义和过滤机制,具体来说,此时,其执行原理和过程需要比通用网络爬虫多出三步,即目标的定义、无关链接的过滤、下一步要爬取的URL地址的选取等,如图3-2所示。

▲图3-2 聚焦网络爬虫的基本原理及其实现过程1.对爬取目标的定义和描述。

深入理解JAVA的网络爬虫与搜索引擎

深入理解JAVA的网络爬虫与搜索引擎

深入理解JAVA的网络爬虫与搜索引擎引言:随着互联网的快速发展,我们每天都会面临大量的信息。

为了更高效地获取我们需要的信息,网络爬虫和搜索引擎成为了必不可少的工具。

而作为一种常用的编程语言,JAVA在网络爬虫和搜索引擎的开发中扮演着重要的角色。

本文将深入理解JAVA的网络爬虫与搜索引擎的原理、应用以及相关技术。

一、网络爬虫的原理与应用1.1 网络爬虫的原理网络爬虫是一种自动化程序,通过模拟人类浏览器的行为,自动访问互联网上的网页并提取有用的信息。

其原理主要分为以下几个步骤:首先,网络爬虫需要指定一个起始网址,也称为种子URL。

然后,它会通过HTTP协议向服务器发送请求,获取网页的HTML源代码。

接下来,爬虫会解析HTML源代码,提取出页面中的链接,并将这些链接添加到待爬取的URL队列中。

然后,爬虫会从URL队列中取出一个URL,并重复前面的步骤,直到队列为空或达到设定的爬取深度。

最后,爬虫会将提取到的有用信息进行处理和存储,以供后续的分析和应用。

1.2 网络爬虫的应用网络爬虫在各个领域都有广泛的应用,以下是一些常见的应用场景:搜索引擎:搜索引擎通过网络爬虫来获取互联网上的网页信息,并建立索引以供用户搜索。

数据挖掘:网络爬虫可以用于获取大量的数据,用于分析和挖掘有用的信息。

舆情监测:通过网络爬虫可以实时监测社交媒体、新闻网站等发布的信息,用于舆情分析和预警。

价格比较:一些电商网站使用网络爬虫来获取竞争对手的价格信息,以便制定自己的价格策略。

二、JAVA网络爬虫的开发2.1 JAVA网络爬虫的基本框架在JAVA中,我们可以使用一些开源的网络爬虫框架来简化开发过程。

比较常用的有Jsoup、HttpClient和WebMagic等。

Jsoup是一款优秀的HTML解析器,可以方便地解析HTML源代码,并提供了丰富的API来获取和操作页面中的元素。

HttpClient是一个功能强大的HTTP客户端库,可以模拟浏览器的行为,发送HTTP请求并获取响应。

网络爬虫技术剖析

网络爬虫技术剖析

网络爬虫技术剖析随着互联网的迅猛发展,大量的网络信息被快速发布和更新,人们对于获取实时并有价值的信息变得越来越重要。

为了满足这一需求,网络爬虫技术应运而生。

本文将深入剖析网络爬虫技术的原理、应用以及存在的挑战。

一、网络爬虫技术的原理网络爬虫是一种通过自动化程序从网络上收集并解析数据的技术。

其基本原理是通过模拟浏览器的行为,自动发起HTTP请求,获取网页的HTML源代码或者其他指定格式的数据。

然后,通过解析HTML源码,提取出所需的数据信息。

为了实现这一目标,网络爬虫通常需要经历以下几个步骤:1. 确定起始URL:爬虫程序需要从一个或多个起始URL开始,然后逐级深入访问与之相关的链接。

2. 发起HTTP请求:对于每个URL,爬虫程序会模拟浏览器,通过发送HTTP请求获取相应的网页内容。

3. 解析网页:爬虫程序会解析网页的HTML源码,提取出所需的数据。

这个过程可以通过正则表达式、XPath或CSS选择器等方式进行。

4. 处理提取的数据:爬虫程序会对提取到的数据进行处理,可以是简单的数据清洗、整合,也可以是复杂的数据分析和挖掘。

5. 存储数据:最后,爬虫程序需要将处理后的数据存储到数据库、文件或者其他媒介中,以备后续的使用。

二、网络爬虫技术的应用网络爬虫技术具有广泛的应用场景。

以下列举了几个常见的应用领域:1. 搜索引擎:著名的搜索引擎,如Google、百度等,使用网络爬虫技术来收集和索引互联网上的信息,以便用户能够方便地搜索到相关的内容。

2. 数据采集与分析:许多企业和研究机构需要从互联网上获取大量的数据进行分析和研究。

网络爬虫技术可以帮助他们从各种资源中抓取所需的数据。

3. 新闻聚合:一些新闻聚合网站使用网络爬虫技术自动从各大新闻网站收集新闻资讯,以便用户在一个平台上获取多个来源的新闻。

4. 价格比较:一些电商网站或比价网站使用网络爬虫技术来抓取各大商家的商品信息和价格,以便用户能够进行比较和选择最优惠的商品。

java爬虫实现原理

java爬虫实现原理

java爬虫实现原理
Java爬虫实现的原理是基于网络爬取和数据提取的技术。

简单来说,爬虫就是通过HTTP协议从网络获取指定URL的
HTML页面,然后解析HTML文档,提取出所需的信息。

1. 指定URL:首先需要指定要爬取的网站URL,通常是通过URL连接来实现。

2. 发送HTTP请求:使用Java的URLConnection类或HttpClient等工具,构建HTTP请求,并发送到指定的URL上。

3. 接收响应:获取到服务器返回的HTML页面,可以通过InputStream或其他方法获取响应内容。

4. 解析HTML:将获取到的HTML页面进行解析,通常使用Jsoup等HTML解析库。

可以根据HTML标签、类名、ID等
特征来定位和提取所需的数据。

5. 保存数据:将提取到的数据保存到本地数据库或文件中,以便后续使用。

6. 遍历链接:如果需要爬取整个网站,可以在解析HTML时
获取到页面中的链接,并将这些链接加入到待爬取的URL集
合中,然后继续循环爬取。

7. 限制访问频率:为了避免对目标网站造成过大的负担,可以设置爬取间隔时间或使用代理服务器来降低访问频率。

需要注意的是,爬虫在实际应用时也需要遵循相关的法律法规和道德规范,避免对目标网站的正常运行造成干扰或侵犯隐私等问题。

网络爬虫

网络爬虫

查看文章Java 搜索引擎的实现——网络爬虫(1)2011年01月04日星期二14:43Java 搜索引擎的实现——网络爬虫【IT168 技术】自己动手写一个搜索引擎,想想这有多cool:在界面上输入关键词,点击搜索,得到自己想要的结果;那么它还可以做什么呢?也许是自己的网站需要一个站内搜索功能,抑或是对于硬盘中文档的搜索——最重要的是,是不是觉得众多IT 公司都在向你招手呢?如果你心动了,那么,Let's Go!这里首先要说明使用Java 语言而不是C/C++ 等其它语言的原因,因为Java 中提供了对于网络编程众多的基础包和类,比如URL 类、InetAddress 类、正则表达式,这为我们的搜索引擎实现提供了良好的基础,使我们可以专注于搜索引擎本身的实现,而不需要因为这些基础类的实现而分心。

这个分三部分的系列将逐步说明如何设计和实现一个搜索引擎。

在第一部分中,您将首先学习搜索引擎的工作原理,同时了解其体系结构,之后将讲解如何实现搜索引擎的第一部分,网络爬虫模块,即完成网页搜集功能。

在系列的第二部分中,将介绍预处理模块,即如何处理收集来的网页,整理、分词以及索引的建立都在这部分之中。

在系列的第三部分中,将介绍信息查询服务的实现,主要是查询界面的建立、查询结果的返回以及快照的实现。

dySE 的整体结构在开始学习搜索引擎的模块实现之前,您需要了解dySE 的整体结构以及数据传输的流程。

事实上,搜索引擎的三个部分是相互独立的,三个部分分别工作,主要的关系体现在前一部分得到的数据结果为后一部分提供原始数据。

三者的关系如下图所示:图1. 搜索引擎三段式工作流程在介绍搜索引擎的整体结构之前,我们借鉴《计算机网络——自顶向下的方法描述因特网特色》一书的叙事方法,从普通用户使用搜索引擎的角度来介绍搜索引擎的具体工作流程。

自顶向下的方法描述搜索引擎执行过程:用户通过浏览器提交查询的词或者短语P,搜索引擎根据用户的查询返回匹配的网页信息列表L;上述过程涉及到两个问题,如何匹配用户的查询以及网页信息列表从何而来,根据什么而排序?用户的查询P 经过分词器被切割成小词组并被剔除停用词( 的、了、啊等字),根据系统维护的一个倒排索引可以查询某个词pi 在哪些网页中出现过,匹配那些都出现的网页集即可作为初始结果,更进一步,返回的初始网页集通过计算与查询词的相关度从而得到网页排名,即Page Rank,按照网页的排名顺序即可得到最终的网页列表;假设分词器和网页排名的计算公式都是既定的,那么倒排索引以及原始网页集从何而来?原始网页集在之前的数据流程的介绍中,可以得知是由爬虫spider 爬取网页并且保存在本地的,而倒排索引,即词组到网页的映射表是建立在正排索引的基础上的,后者是分析了网页的内容并对其内容进行分词后,得到的网页到词组的映射表,将正排索引倒置即可得到倒排索引;网页的分析具体做什么呢?由于爬虫收集来的原始网页中包含很多信息,比如html 表单以及一些垃圾信息比如广告,网页分析去除这些信息,并抽取其中的正文信息作为后续的基础数据。

网络爬虫基本原理

网络爬虫基本原理

网络爬虫基本原理网络爬虫,又称网络蜘蛛、网络机器人,是一种按照一定的规则,自动地抓取互联网信息的程序或脚本。

它可以在互联网上按照一定的规则自动抓取信息,并将抓取的信息存储在本地或者传送到其他地方。

网络爬虫在搜索引擎、数据挖掘、网络监测等领域有着广泛的应用。

那么,网络爬虫的基本原理是什么呢?首先,网络爬虫的工作流程可以简单分为四个步骤,首先是发送请求,然后获取网页内容,接着是解析网页内容,最后是存储数据。

在发送请求阶段,网络爬虫会根据设定的规则,向目标网站发送HTTP请求,请求特定的页面信息。

获取网页内容后,网络爬虫会对网页进行解析,提取出所需的信息,比如链接、文本、图片等。

最后,网络爬虫会将提取的信息存储在本地或者传送到其他地方。

其次,网络爬虫的基本原理主要包括三个部分,URL管理、网页下载和数据处理。

URL管理是指网络爬虫如何管理待抓取的URL队列,以及如何避免重复抓取和循环抓取。

网页下载是指网络爬虫如何下载网页内容,包括如何发送HTTP请求、如何处理HTTP响应等。

数据处理是指网络爬虫如何从网页内容中提取所需的信息,并对信息进行处理和存储。

最后,网络爬虫的工作原理可以简单概括为,首先,网络爬虫会从一个或多个初始URL开始,将这些URL放入待抓取的URL队列中。

然后,网络爬虫会不断地从URL队列中取出URL,发送HTTP请求,获取网页内容,并对网页内容进行解析和处理。

在这个过程中,网络爬虫会根据一定的规则,将新的URL放入URL队列中,以便后续的抓取。

最终,网络爬虫会将抓取的信息存储在本地或者传送到其他地方。

总的来说,网络爬虫的基本原理包括发送请求、获取网页内容、解析网页内容和存储数据。

在实际应用中,网络爬虫还涉及到URL管理、网页下载和数据处理等方面。

通过对这些基本原理的理解,我们可以更好地掌握网络爬虫的工作原理,从而更好地应用网络爬虫技术。

一个简单的java网络爬虫(spider)

一个简单的java网络爬虫(spider)

一个简单的java网络爬虫(spider)一个简单的java网络爬虫,由于时间原因,没有进一步解释.需要的htmlparser.jar包到官方网上去下.---------------------------------------------Spider.java-----------------------------------------------------------------import java.io.BufferedReader; import java.io.InputStreamReader; import .URL; import .URLConnection; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import org.htmlparser.RemarkNode; import org.htmlparser.StringNode; import org.htmlparser.Node; import org.htmlparser.tags.*; import org.htmlparser.Parser; import org.htmlparser.filters.StringFilter; import org.htmlparser.util.NodeIterator; import org.htmlparser.util.NodeList; import org.htmlparser.util.ParserException; import java.util.Queue; import java.util.LinkedList;public class Spider implements Runnable {boolean search_key_words = false;int count = 0;int limitsite = 10;int countsite = 1;String keyword = "中国";//搜索关键字Parser parser = new Parser();// List linklist = new ArrayList();String startsite = "";//搜索的其实站点SearchResultBean srb;//保存搜索结果List resultlist = new ArrayList();//搜索到关键字链接列表List searchedsite = new ArrayList();//已经被搜索站点列表Queue linklist = new LinkedList();//需解析的链接列表HashMap<String, ArrayList<String>> disallowListCache = new HashMap<String, ArrayList<String>>();public Spider(String keyword, String startsite) { this.keyword = keyword; this.startsite = startsite; linklist.add(startsite);srb = new SearchResultBean();}public void run() {// TODO Auto-generated method stubsearch(linklist);}public void search(Queue queue) {String url = "";while(!queue.isEmpty()){ url = queue.peek().toString();//查找列队try {if (!isSearched(searchedsite, url)) {if (isRobotAllowed(new URL(url)))//检查该链接是否被允许搜索processHtml(url);elseSystem.out.println("this page is disallowed to search");}} catch (Exception ex) {}queue.remove();}}/***解析HTML* @param url* @throws ParserException* @throws Exception*/public void processHtml(String url) throws ParserException, Exception { searchedsite.add(url);count = 0;System.out.println("searching ... :" + url); parser.setURL(url); parser.setEncoding("GBK"); URLConnection uc = parser.getConnection(); uc.connect(); //uc.getLastModified(); NodeIterator nit = parser.elements();while (nit.hasMoreNodes()) { Node node = nit.nextNode();parserNode(node);}srb.setKeywords(keyword); srb.setUrl(url); srb.setCount_key_words(count); resultlist.add(srb); System.out.println("count keywords is :" + count); System.out.println("----------------------------------------------");}/***处理HTML标签* @param tag* @throws Exception*/public void dealTag(Tag tag) throws Exception {NodeList list = tag.getChildren(); if (list != null) { NodeIterator it = list.elements(); while (it.hasMoreNodes()) { Node node = it.nextNode();parserNode(node);}}}/***处理HTML标签结点* @param node* @throws Exception*/public void parserNode(Node node) throws Exception{if (node instanceof StringNode) {//判断是否是文本结点StringNode sNode = (StringNode) node;StringFilter sf = new StringFilter(keyword,false); search_key_words = sf.accept(sNode);if (search_key_words) {count++;}// System.out.println("text is :"+sNode.getText().trim());} else if (node instanceof Tag) {//判断是否是标签库结点Tag atag = (Tag) node;if (atag instanceof TitleTag) {//判断是否是标TITLE结点srb.setTitle(atag.getText());}if (atag instanceof LinkTag) {//判断是否是标LINK结点LinkTag linkatag = (LinkTag) atag;checkLink(linkatag.getLink(), linklist); // System.out.println("-----------------this is link --------------");}dealTag(atag);} else if (node instanceof RemarkNode) {//判断是否是注释// System.out.println("this is remark");}}/**检查链接是否需要加入列队*/public void checkLink(String link, Queue queue) { if (link != null && !link.equals("") && link.indexOf("#") == -1) { if (!link.startsWith("http://") && !link.startsWith("ftp://") && !link.startsWith("www.")) {link = "file:///" + link;} else if (link.startsWith("www.")) {link = "http://" + link;}if (queue.isEmpty()) queue.add(link);else {String link_end_=link.endsWith("/")?link.substring(0,stIndexOf("/")):(link+"/"); if (!queue.contains(link)&&!queue .contains(link_end_)) { queue.add(link);}}}}/***检查该链接是否已经被扫描* @param list* @param url* @return*/public boolean isSearched(List list, String url) {String url_end_ = "";if (url.endsWith("/")) { url_end_ = url.substring(0, stIndexOf("/"));} else {url_end_ = url + "/";}if (list.size() > 0) { if (list.indexOf(url) != -1 || list.indexOf(url_end_) != -1) {return true;}}return false;}/***检查URL是否被允许搜索* @param urlToCheck* @return*/private boolean isRobotAllowed(URL urlToCheck) {String host = urlToCheck.getHost().toLowerCase();// 获取给出RUL的主机// System.out.println("主机="+host);//获取主机不允许搜索的URL缓存ArrayList<String> disallowList = disallowListCache.get(host);// 如果还没有缓存,下载并缓存。

网络爬虫的工作原理(PPT最新)

网络爬虫的工作原理(PPT最新)
商务数据分析与应用专业教学资源库
数据采集与处理
网络爬虫的工作原理
数据采集与处理教学团队
网络爬虫的工作原理
在网络爬虫的系统框架中,主过程由控制器,解析 器,资源库三部分组成。
控制器的主要工作是负责给多线程中的各个爬虫线 程分配工作任务。
网络爬虫的工作原理
解析器的主要工作是下载网页,进行页面的处理, 主要是将一些JS脚本标签、CSS代码内容、空格字符 、HTML标签等内容处理掉,爬虫的基本工作是由解 析器完成。资源库是用来存放下载到的网页资源,一 般都采用大型的数据库存储,如Oracle数据库,并对 其建立索引。
网络爬虫的工作原理
网络爬虫的基本工作流程如下: 1.首先选取一部分精心挑选的种子URL; 2.将这些URL放入待抓取URL队列;
网络爬虫的工作原理
3.从待抓取URL队列中取出待抓取在URL,解析DNS,并且得 到主机的ip,并将URL对应的网页下载下来,存储进已下载网页库 中。此外,将这些URL放进已抓取URL队列。
Байду номын сангаас
网络爬虫的工作原理
解析器 解析器是负责网络爬虫的主要部分,其负责的工作 主要有:下载网页的功能,对网页的文本进行处理, 如过滤功能,抽取特殊HTML标签的功能,分析数据 功能。
网络爬虫的工作原理
资源库 主要是用来存储网页中下载下来的数据记录的容器 ,并提供生成索引的目标源。中大型的数据库产品有 :Oracle、Sql Server等。
网络爬虫的工作原理
控制器 控制器是网络爬虫的中央控制器,它主要是负责根 据系统传过来的URL链接,分配一线程,然后启动线 程调用爬虫爬取网页的过程。
网络爬虫的工作原理
解析器 解析器是负责网络爬虫的主要部分,其负责的工作 主要有:下载网页的功能,对网页的文本进行处理, 如过滤功能,抽取特殊HTML标签的功能,分析数据 功能。

Java实现网络爬虫框架详细代码

Java实现网络爬虫框架详细代码

Java实现⽹络爬⾍框架详细代码⽬录Java 实现⽹络爬⾍框架⼀、每个类的功能介绍⼆、每个类的源代码Java 实现⽹络爬⾍框架最近在做⼀个搜索相关的项⽬,需要爬取⽹络上的⼀些链接存储到索引库中,虽然有很多开源的强⼤的爬⾍框架,但本着学习的态度,⾃⼰写了⼀个简单的⽹络爬⾍,以便了解其中的原理。

今天,就为⼩伙伴们分享下这个简单的爬⾍程序!!⼀、每个类的功能介绍DownloadPage.java的功能是下载此超链接的页⾯源代码.FunctionUtils.java 的功能是提供不同的静态⽅法,包括:页⾯链接正则表达式匹配,获取URL链接的元素,判断是否创建⽂件,获取页⾯的Url并将其转换为规范的Url,截取⽹页⽹页源⽂件的⽬标内容。

HrefOfPage.java 的功能是获取页⾯源代码的超链接。

UrlDataHanding.java 的功能是整合各个给类,实现url到获取数据到数据处理类。

UrlQueue.java 的未访问Url队列。

VisitedUrlQueue.java 已访问过的URL队列。

⼆、每个类的源代码DownloadPage.java 此类要⽤到HttpClient组件。

package com.sreach.spider;import java.io.IOException;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.client.ClientProtocolException;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpGet;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.util.EntityUtils;/*** @author binghe*/public class DownloadPage {/*** 根据URL抓取⽹页内容** @param url* @return*/public static String getContentFormUrl(String url) {/* 实例化⼀个HttpClient客户端 */HttpClient client = new DefaultHttpClient();HttpGet getHttp = new HttpGet(url);String content = null;HttpResponse response;try {/* 获得信息载体 */response = client.execute(getHttp);HttpEntity entity = response.getEntity();VisitedUrlQueue.addElem(url);if (entity != null) {/* 转化为⽂本信息 */content = EntityUtils.toString(entity);/* 判断是否符合下载⽹页源代码到本地的条件 */if (FunctionUtils.isCreateFile(url)&& FunctionUtils.isHasGoalContent(content) != -1) {FunctionUtils.createFile(FunctionUtils.getGoalContent(content), url);}}} catch (ClientProtocolException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {client.getConnectionManager().shutdown();}return content;}}FunctionUtils.java 此类的⽅法均为static⽅法package com.sreach.spider;import java.io.BufferedWriter;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStreamWriter;import java.util.regex.Matcher;import java.util.regex.Pattern;/*** @author binghe*/public class FunctionUtils {/*** 匹配超链接的正则表达式*/private static String pat = "http://www\\.oschina\\.net/code/explore/.*/\\w+\\.[a-zA-Z]+"; private static Pattern pattern = pile(pat);private static BufferedWriter writer = null;/*** 爬⾍搜索深度*/public static int depth = 0;/*** 以"/"来分割URL,获得超链接的元素** @param url* @return*/public static String[] divUrl(String url) {return url.split("/");}/*** 判断是否创建⽂件** @param url* @return*/public static boolean isCreateFile(String url) {Matcher matcher = pattern.matcher(url);return matcher.matches();}/*** 创建对应⽂件** @param content* @param urlPath*/public static void createFile(String content, String urlPath) {/* 分割url */String[] elems = divUrl(urlPath);StringBuffer path = new StringBuffer();File file = null;for (int i = 1; i < elems.length; i++) {if (i != elems.length - 1) {path.append(elems[i]);path.append(File.separator);file = new File("D:" + File.separator + path.toString());}if (i == elems.length - 1) {Pattern pattern = pile("\\w+\\.[a-zA-Z]+");Matcher matcher = pattern.matcher(elems[i]);if ((matcher.matches())) {if (!file.exists()) {file.mkdirs();}String[] fileName = elems[i].split("\\.");file = new File("D:" + File.separator + path.toString()+ File.separator + fileName[0] + ".txt");try {file.createNewFile();writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file)));writer.write(content);writer.flush();writer.close();System.out.println("创建⽂件成功");} catch (IOException e) {e.printStackTrace();}}}}}/*** 获取页⾯的超链接并将其转换为正式的A标签** @param href* @return*/public static String getHrefOfInOut(String href) {/* 内外部链接最终转化为完整的链接格式 */String resultHref = null;/* 判断是否为外部链接 */if (href.startsWith("http://")) {resultHref = href;} else {/* 如果是内部链接,则补充完整的链接地址,其他的格式忽略不处理,如:a href="#" rel="external nofollow" */ if (href.startsWith("/")) {resultHref = "" + href;}}return resultHref;}/*** 截取⽹页⽹页源⽂件的⽬标内容** @param content* @return*/public static String getGoalContent(String content) {int sign = content.indexOf("<pre class=\"");String signContent = content.substring(sign);int start = signContent.indexOf(">");int end = signContent.indexOf("</pre>");return signContent.substring(start + 1, end);}/*** 检查⽹页源⽂件中是否有⽬标⽂件** @param content* @return*/public static int isHasGoalContent(String content) {return content.indexOf("<pre class=\"");}}HrefOfPage.java 此类为获取页⾯的超链接package com.sreach.spider;/*** @author binghe**/public class HrefOfPage {/*** 获得页⾯源代码中超链接*/public static void getHrefOfContent(String content) {System.out.println("开始");String[] contents = content.split("<a href=\"");for (int i = 1; i < contents.length; i++) {int endHref = contents[i].indexOf("\"");String aHref = FunctionUtils.getHrefOfInOut(contents[i].substring(0, endHref));if (aHref != null) {String href = FunctionUtils.getHrefOfInOut(aHref);if (!UrlQueue.isContains(href)&& href.indexOf("/code/explore") != -1&& !VisitedUrlQueue.isContains(href)) {UrlQueue.addElem(href);}}}System.out.println(UrlQueue.size() + "--抓取到的连接数");System.out.println(VisitedUrlQueue.size() + "--已处理的页⾯数");}}UrlDataHanding.java 此类主要是从未访问队列中获取url,下载页⾯,分析url,保存已访问url等操作,实现Runnable接⼝package com.sreach.spider;/*** @author binghe**/public class UrlDataHanding implements Runnable {/*** 下载对应页⾯并分析出页⾯对应的URL放在未访问队列中。

基本的网络爬虫原理与实践教程

基本的网络爬虫原理与实践教程

基本的网络爬虫原理与实践教程网络爬虫是一种自动化程序,用于在互联网上收集特定信息的工具。

它可以模拟人类浏览网页的行为,通过抓取网页内容,提取数据,实现对互联网上信息的自动化抓取与分析。

本文将介绍一些基本的网络爬虫原理与实践教程。

首先,网络爬虫的基本原理是通过发送HTTP请求获取网页内容,并解析网页获取所需信息。

在实践中,我们可以使用Python编程语言的第三方库,如Requests和BeautifulSoup,来快速实现爬虫功能。

在开始编写爬虫之前,我们首先需要了解目标网站的结构和网页的状态码。

常见的状态码有200(表示请求成功)、404(表示页面不存在)等。

要避免被服务器屏蔽,我们还需要注意设置请求头,模拟浏览器行为。

接下来,我们可以使用Requests库向目标网站发送HTTP请求,并接收响应。

这个过程类似于在浏览器中输入网址并获取网页内容。

通过解析响应的内容,我们可以获取到网页中的文本、图片、链接等信息。

在解析网页时,我们可以使用BeautifulSoup库来提取感兴趣的内容。

BeautifulSoup提供了一种灵活而高效的方式来处理HTML和XML文件,它能够根据标签、属性、CSS选择器等进行数据的提取和解析。

除了直接解析网页内容,我们还可以通过模拟用户交互来获取动态网页中的数据。

动态网页是指在加载页面时通过JavaScript代码生成内容的网页。

为了抓取动态网页中的数据,我们可以使用Selenium库,它可以模拟浏览器的行为,执行JavaScript代码,并获取生成的数据。

在实践中,我们还需要注意爬虫的合法性和道德性。

我们应该尊重网站的规则,遵守robots.txt协议,避免对目标网站造成过多的访问负荷,并尽量减少对网站服务器的影响。

在爬取大量数据时,我们还需要考虑如何高效地存储和处理数据。

一种常见的做法是使用数据库,如MySQL或MongoDB,来存储爬取到的数据。

此外,我们还可以使用相关的数据分析工具,如Pandas和NumPy,对数据进行处理和分析。

爬虫工作原理

爬虫工作原理

爬虫工作原理
爬虫工作原理是指通过网络爬虫程序自动获取互联网上的信息。

其一般步骤如下:
1. 发送请求:爬虫程序首先向目标网站发送HTTP请求,请求获取页面内容。

2. 获取页面内容:网站服务器收到请求后,会返回HTML页
面作为响应。

爬虫程序接收到响应后,解析HTML页面内容。

3. 解析页面内容:爬虫程序使用解析库(如BeautifulSoup)
进行页面内容解析,提取出需要的信息,如文本、链接、图片等。

4. 存储数据:爬虫程序将提取的数据存储到本地文件或数据库中,以备后续使用。

5. 翻页爬取:如果需要获取多个页面的数据,爬虫程序会模拟点击或修改URL参数,发送多次请求获取不同页面的内容。

6. 遵守规则:为了不对目标网站造成过大的负担或侵犯其规定,爬虫程序需要遵守爬取速度限制、robots.txt等规则。

7. 异常处理:如果在请求、解析、存储过程中出现错误或异常,爬虫程序需要进行相应的处理,如重试、记录错误日志等。

值得注意的是,不同网站的结构和反爬措施各有不同,爬虫程
序需要根据实际情况进行适配和改进。

此外,爬虫程序的合法性也需要在遵守相关法律和道德规范的前提下进行。

Java实现网络爬虫

Java实现网络爬虫

Java实现网络爬虫
网络爬虫的是做什么的? 手动写一个容易的网络爬虫;网络爬虫(又被称为网页蜘蛛,网络机器人),是一种根据一定的规章,自动地抓取万维网信息的程序或者脚
本。

另外一些不常用法的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。

网络爬虫是通过网页的链接地址来寻觅网页,从网站某一个页面(通常是首页)开头,读取网页的内容,找到
在网页中的其它链接地址,然后通过这些链接地址寻觅下一个网页,这样向来循环下去,直到把这个网站全部
的网页都抓取完为止。

假如把囫囵互联网当成一个网站,那么网络蜘蛛就可以用这个原理把互联网上全部的网页都抓取下来。

所以要想抓取网络上的数据,不仅需要爬虫程序还需要一个可以接受爬虫发回的数据并举行处理过滤的服务
器,爬虫抓取的数据量越大,对服务器的性能要求则越高。

网络爬虫是做什么的? 他的主要工作就是跟据指定的url地址去发送哀求,获得响应, 然后解析响应 , 一方面从
响应中查找出想要查找的数据,另一方面从响应中解析出新的URL路径,然后继续拜访,继续解析;继续查找需要的
数据和继续解析出新的URL路径 .这就是网络爬虫主要干的工作. 下面是流程图:
通过上面的流程图能也许了解到网络爬虫干了哪些活 ,按照这些
第1页共9页。

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

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

Java 多线程爬虫程序(spider)设计与实现2009年04月15日星期三19:01转自:《福建电脑》吴小竹当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加入完成队列,转c3.1 java中线程的生命周期java的线程从产生到消失,可分为四个状态:a 新建状态:线程在已被创建但尚未执行这段时间内,处于新建状态。

此时,线程对象已被分配内存空间,起私有数据已被初始化,但没有给其分配系统资源且线程未被调度。

处于此状态的线程,可以通过调用start()或stop()函数来开始线程或终止线程。

网络爬虫的工作原理是什么呢

网络爬虫的工作原理是什么呢

网络爬虫的工作原理是什么呢
现今很多会使用代理ip进行网络爬虫,从而提供工作效率。

那么,网络爬虫的工作原理是什么呢?
如果把互联网比作蜘蛛网,爬虫就是蜘蛛网上爬行的蜘蛛,网络节点则代表网页。

当通过客户端发出任务需求命令时,ip将通过互联网到达终端服务器,找到客户端交代的任务。

一个节点是一个网页。

蜘蛛通过一个节点后,可以沿着几点连线继续爬行到达下一个节点。

简而言之,爬虫首先需要获得终端服务器的网页,从那里获得网页的源代码,若是源代码中有有用的信息,就在源代码中提取任务所需的信息。

然后ip就会将获得的有用信息送回客户端存储,然后再返回,反复频繁访问网页获取信息,直到任务完成。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

“网络蜘蛛”或者说“网络爬虫”,是一种能访问网站并跟踪链接的程序,通过它,可快速地画出一个网站所包含的网页地图信息。

本文主要讲述如何使用Java编程来构建一个“蜘蛛”,我们会先以一个可复用的蜘蛛类包装一个基本的“蜘蛛”,并在示例程序中演示如何创建一个特定的“蜘蛛”来扫描相关网站并找出死链接。

Java语言在此非常适合构建一个“蜘蛛”程序,其内建了对HTTP协议的支持,通过它可以传输大部分的网页信息;其还内建了一个HTML解析器,正是这两个原因使Java 语言成为本文构建“蜘蛛”程序的首选。

文章后面例1的示例程序,将会扫描一个网站,并寻找死链接。

使用这个程序时需先输入一个URL并单击“Begin”按钮,程序开始之后,“Begin”按钮会变成“Cancel”按钮。

在程序扫描网站期间,会在“Cancel”按钮之下显示进度,且在检查当前网页时,也会显示相关正常链接与死链接的数目,死链接将显示在程序底部的滚动文本框中。

单击“Cancel”按钮会停止扫描过程,之后可以输入一个新的URL;如果期间没有单击“Cancel”,程序将会一直运行直到查找完所有网页,此后,“Cancel”按钮会再次变回“Begin”,表示程序已停止。

下面将演示示例程序是如何与可复用“Spider”类交互的,示例程序包含在例1的CheckLinks类中,这个类实现了ISpiderReportable接口,如例2所示,正是通过这个接口,蜘蛛类才能与示例程序相交互。

在这个接口中,定义了三个方法:第一个方法是“spiderFoundURL”,它在每次程序定位一个URL时被调用,如果方法返回true,表示程序应继续执行下去并找出其中的链接;第二个方法是“spiderURLError”,它在每次程序检测URL导致错误时被调用(如“404 页面未找到”);第三个方法是“spiderFoundEMail”,它在每次发现电子邮件地址时被调用。

有了这三个方法,Spider类就能把相关信息反馈给创建它的程序了。

在begin方法被调用后,“蜘蛛”就开始工作了;为允许程序重绘其用户界面,“蜘蛛”是作为一个单独的线程启动的。

点击“Begin”按钮会开始这个后台线程,当后台线程运行之后,又会调用“CheckLinks”类的run方法,而run方法是由Spider对象实例化时启动的,如下所示:spider = new Spider(this);spider.clear();base = new URL(url.getText());spider.addURL(base);spider.begin();首先,一个新的Spider对象被实例化,在此,需要传递一个“ISpiderReportable”对象给Spider对象的构造函数,因为“CheckLinks”类实现了“ISpiderReportable”接口,只需简单地把它作为当前对象(可由关键字this表示)传递给构造函数即可;其次,在程序中维护了一个其访问过的URL列表,而“clear”方法的调用则是为了确保程序开始时URL列表为空,程序开始运行之前必须添加一个URL到它的待处理列表中,此时用户输入的URL则是添加到列表中的第一个,程序就由扫描这个网页开始,并找到与这个起始URL相链接的其他页面;最后,调用“begin”方法开始运行“蜘蛛”,这个方法直到“蜘蛛”工作完毕或用户取消才会返回。

当“蜘蛛”运行时,可以调用由“ISpiderReportable”接口实现的三个方法来报告程序当前状态,程序的大部分工作都是由“spiderFoundURL”方法来完成的,当“蜘蛛”发现一个新的URL时,它首先检查其是否有效,如果这个URL导致一个错误,就会把它当作一个死链接;如果链接有效,就会继续检查它是否在一个不同的服务器上,如果链接在同一服务器上,“spiderFoundURL”返回true,表示“蜘蛛”应继续跟踪这个URL并找出其他链接,如果链接在另外的服务器上,就不会扫描是否还有其他链接,因为这会导致“蜘蛛”不断地浏览Internet,寻找更多、更多的网站,所以,示例程序只会查找用户指定网站上的链接。

构造Spider类前面已经讲了如何使用Spider类,请看例3中的代码。

使用Spider类及“ISpiderReportable”接口能方便地为某一程序添加“蜘蛛”功能,下面继续讲解Spider类是怎样工作的。

Spider类必须保持对其访问过的URL的跟踪,这样做的目的是为了确保“蜘蛛”不会访问同一URL一次以上;进一步来说,“蜘蛛”必须把URL分成三组,第一组存储在“workloadWaiting”属性中,包含了一个未处理的URL列表,“蜘蛛”要访问的第一个URL也存在其中;第二组存储在“workloadProcessed”中,它是“蜘蛛”已经处理过且无需再次访问的URL;第三组存储在“workloadError”中,包含了发生错误的URL。

Begin方法包含了Spider类的主循环,其一直重复遍历“workloadWaiting”,并处理其中的每一个页面,当然我们也想到了,在这些页面被处理时,很可能有其他的URL 添加到“workloadWaiting”中,所以,begin方法一直继续此过程,直到调用Spider类的cancel方法,或“workloadWaiting”中已不再剩有URL。

这个过程如下:cancel = false;while ( !getWorkloadWaiting().isEmpty() && !cancel ) {Object list[] = getWorkloadWaiting().toArray();for ( int i=0; (i<list.length)&&!cancel; i++="" )="">processURL((URL)list[i]);}当上述代码遍历“workloadWaiting”时,它把每个需处理的URL都传递给“processURL”方法,而这个方法才是真正读取并解析URL中HTML信息的。

读取并解析HTMLJava同时支持访问URL内容及解析HTML,而这正是“processURL”方法要做的。

在Java中读取URL内容相对还比较简单,下面就是“processURL”方法实现此功能的代码:URLConnection connection = url.openConnection();if ( (connection.getContentType()!=null) &&!connection.getContentType().toLowerCase().startsWith("text/") ) {getWorkloadWaiting().remove(url);getWorkloadProcessed().add(url);log("Not processing because content type is: " +connection.getContentType() );return;}首先,为每个传递进来的变量url中存储的URL构造一个“URLConnection”对象,因为网站上会有多种类型的文档,而“蜘蛛”只对那些包含HTML,尤其是基于文本的文档感兴趣。

前述代码是为了确保文档内容以“text/”打头,如果文档类型为非文本,会从等待区移除此URL,并把它添加到已处理区,这也是为了保证不会再次访问此URL。

在对特定URL建立连接之后,接下来就要解析其内容了。

下面的代码打开了URL 连接,并读取内容:InputStream is = connection.getInputStream();Reader r = new InputStreamReader(is); //字符流reader现在,我们有了一个Reader对象,可以用它来读取此URL的内容,对本文中的“蜘蛛”来说,只需简单地把其内容传递给HTML解析器就可以了。

本例中使用的HTML解析器为Swing HTML解析器,其由Java内置,但由于Java对HTML解析的支持力度不够,所以必须重载一个类来实现对HTML解析器的访问,这就是为什么我们要调用“HTMLEditorKit”类中的“getParser”方法。

但不幸的是,Sun公司把这个方法置为protected,唯一的解决办法就是创建自己的类并重载“getParser”方法,并把它置为public,这由“HTMLParse”类来实现,请看例4:import javax.swing.text.html.*;public class HTMLParse extends HTMLEditorKit {public HTMLEditorKit.Parser getParser(){return super.getParser();}}这个类用在Spider类的“processURL”方法中,我们也会看到,Reader对象会用于读取传递到“HTMLEditorKit.Parser”中网页的内容://这个地方意思是,所谓的回调方法,就是供别人调用的,当parser的对reader对象进行解析的时候,发现标记或者文本就会去调用回调类的方法去执行相应的动作readerHTMLEditorKit.Parser parse = new HTMLParse().getParser();parse.parse(r,new Parser(url),true);请留意,这里又构造了一个新的Parser类,这个Parser类是一个Spider类中的内嵌类,而且还是一个回调类,它包含了对应于每种HTML tag将要调用的特定方法。

在本文中,我们只需关心两类回调函数,它们分别对应一个简单tag(即不带结束tag的tag,如)和一个开始tag,这两类回调函数名为“handleSimpleTag”和“handleStartTag”。

因为每种的处理过程都是一样的,所以“handleStartTag”方法仅是简单地调用“handleSimpleTag”,而“handleSimpleTag”则会负责从文档中取出超链接,这些超链接将会用于定位“蜘蛛”要访问的其他页面。

在当前tag 被解析时,“handleSimpleTag”会检查是否存在一个“href”或超文本引用:String href = (String)a.getAttribute(HTML.Attribute.HREF);if( (href==null) && (t==HTML.Tag.FRAME) )href = (String)a.getAttribute(HTML.Attribute.SRC);if ( href==null )return;如果不存在“href”属性,会继续检查当前tag是否为一个Frame,Frame会使用一个“src”属性指向其他页面,一个典型的超链接通常为以下形式:上面链接中的“href”属性指向其链接到的页面,但是“linkedpage.html”不是一个地址,它只是指定了这个Web服务器上一个页面上的某处,这称为相对URL,相对URL必须被解析为绝对URL,而这由以下代码完成:URL url = new URL(base,str);这又会构造一个URL,str为相对URL,base为这个URL上的页面,这种形式的URL类构造函数可构造一个绝对URL。

相关文档
最新文档