《毕业设计(论文)-Web服务爬虫程序的设计与实现(40页).doc》由会员分享,可在线阅读,更多相关《毕业设计(论文)-Web服务爬虫程序的设计与实现(40页).doc(40页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、-毕业设计(论文)-Web服务爬虫程序的设计与实现-第 35 页Web服务爬虫程序的设计与实现摘要随着互联网的发展人们对跨平台程序之间进行交互的需求也越来越大,Web服务的提出有效地满足了人们的需要,它可以实现两个跨平台程序之间的无缝连接,从而降低了软件维护和升级的费用。目前,互联网上存在着大量的Web服务,但是它们大都分散在不同的服务器上,这就使得用户在浩瀚的互联网上寻找自己需要的服务时要耗费大量的时间和精力,因此设计一个可以将到处分散的服务收集起来,统一存储在本地数据库,并对其进行管理与更新的程序十分有必要。本项目是一个基于Python的多线程的Web服务爬虫程序,它采用广度优先爬取的方式
2、,先抓取出种子网站的全部URL链接存入列队中,然后再依次访问列队中的URL,继续抓取页面中新的URL往列队中存放,一直循环直到列队为空停止。对于抓取到的URL依次用正则表达式进行判别,检查其是否符合Web服务WSDL文档的规范。对于符合规范的URL,访问其对应的页面,若可以访问则将该页面下载到本地,如此,便可以将网络上分散的Web服务描述文档WSDL文档都抓取到本地。接下来,对抓取到本地的文档进行解析,获取其中的关键信息,比如服务名称、端口类型、操作等,然后将这些信息存入数据库中。最后,开发一个Web服务展示网站将爬取到的Web服务进行分类展示到页面上,同时显示其相关信息,方便用户查看与阅读。
3、本文对该爬虫程序进行了详细的介绍。首先从研究背景与现状入手,在介绍完项目关键技术的基础上,重点介绍了Web服务爬虫程序的设计、WSDL文档的解析与存储以及展示网站的设计与实现,最后对整个项目进行了总结并对该项目以后的发展做了展望。关键词:Web服务,网络爬虫,WSDL,Python,服务解析DESIGN AND IMPLENMENTATION OF WEB CLAWER OF WEB SERVICEAbstractWith the development of the Internet, the demand for interaction of cross platform program
4、is also growing, the proposal of Web services effectively meets the needs. Web services can achieve a seamless connection between the two cross platform programs, which reduces software maintenance and upgrade costs. Currently, there are a large number of Web services on the Internet, but most of th
5、em scattered in different server, which makes users spend a lot of time and energy to find them in the vast Internet when they need this service. So it is necessary to design a program that can collected services which decentralized everywhere to local database to unified storage, manage and update.
6、The project is a multi-threaded Python-based Web service crawler, which uses breadth-first crawling way. Firstly, the crawler crawls out of the entire URLs from seed page, then turn the URL into the queue and turn to access the URL of URL queue, and then continue to crawl the page to get new URLs, r
7、epeat the above operation until the queue is empty. For the URL crawled, discriminating them with a regular expression, to check whether they meet the Web service WSDL document specification. For compliant URL, visit the corresponding page, if you can access the page then download it, then WSDL docu
8、ments are crawled locally. Next, the local documents crawled need to parse to get the critical information, such as the service name, port types, operations, etc. Then store the information into the database. Finally, displaying the clawed Web services in a Web site, showing their information, makin
9、g it easier for users to view and read.In this paper, the crawler has been described in detail. The paper starts with the research background and present situation, and on the basis of introduction to project key technologies, it focuses on the design of Web service crawlers, the analysis and design
10、 and implementation of storage and exhibition site WSDL documents, and finally the entire project are summarized and future development of the project are put forward.Keywords: Web services, Web Crawler, WSDL, Python, services parsing目 录1 绪论11.1 研究背景11.2 研究现状21.2.1 Web服务搜索技术21.2.2 搜索引擎与网络爬虫技术31.3 项目
11、研究内容41.4 论文章节安排41.5 本章小结52 核心技术简介62.1 Web服务62.2 WSDL文档相关技术62.2.1 XML62.2.2 WSDL文档72.2.3 xml.etree.ElementTree72.3 网络爬虫82.4 MySQL数据库92.5 Apache服务器92.6 本章小结93 Web服务的抓取103.1 程序运行环境103.2 程序总体设计103.2.1 多线程113.2.2 爬取策略123.2.3 种子站点的选择133.2.4 正则表达式的设计143.2.5 WSDL文档的下载143.3 本章小结164 WSDL文档的解析与存储174.1 WSDL文档的解
12、析174.2 WSDL文档的筛选204.3 数据库的设计214.4 解析结果的存储224.4.1 Python与MySQL数据库的连接224.4.2 数据的存储234.5 本章小结235 Web服务展示网站的设计与实现255.1 整体框架255.2 各部分实现及结果展示265.2.1 首页265.2.2 Weather模块285.2.3 Entertainment模块305.2.4 Transportation模块305.2.5 Other模块315.3 前端与数据库的连接315.4 本章小结326总结与展望336.1 工作总结336.2 未来展望33参考文献34致谢36译文及原文371 绪论
13、1.1 研究背景时代的发展以及网络技术的进步带来的是互联网的全球化,全球化不仅包括信息的互通,还包括不同平台之间的交互。由于平台之间的互异性,应用程序之间的连接往往很复杂,这就造成了应用的维护和更新需要花费更高的代价,如何在各个平台之间进行互操作是开发人员面临的一个巨大的难题。因此,创建一个虚拟的全球互联网计算环境,使得在这种环境下不管在什么平台、用什么语言开发的程序都能够通信变得尤为迫切。在这样的背景下,Web服务应运而生。Web服务是被设计用来促进跨平台的程序之间的通信,实现程序间的无缝互操作性是Web服务最为显著的优势,任意两个能够读写XML的应用程序都能相互通信。在Web服务的环境中,
14、任何的客户端都可以调用Web服务提供的服务,Web服务本身也可以由任何语言和技术来编写开发。WSDL文档1是Web服务的描述语言,用户可以通过该文件来调用服务的接口。目前Web服务的数量在急速增加,然而网络上的Web服务大都分布在不同的服务器上,越来越多Web服务的出现使得用户在何如快速、获取和有效使用这些服务时仍面临着一定的困难。爬虫技术可以有效地解决上述问题。用户按照自身需求进行爬虫程序编码,然后利用该程序自动获取网页信息。它的工作原理如下:从给定的一个种子网页(通常是某个网站的首页)开始,读取页面的源代码,然后将代码中存在的全部链接地址抓取出来存储在队列中,再依次访问队列中的链接,抓取该
15、链接对应页面的所有链接,这样一直循环下去,通过不断访问网页的URL不断获取自己所需的信息,直到抓取完整个网站。整个互联网可以看作是一个大型网站,那么依照上述原理网络爬虫就可以抓取下来这个大网站上所有的网页2。同理,利用爬虫技术可以将互联网上分散在各个不同服务器上的Web服务抓取收集起来,然后存储在指定的数据库中,这样就可以使用户在搜索使用符合自身需求的Web服务时可以通过统一的入口进行访问。随着信息化大潮越涨越猛,可想而知在未来网络会成为人们许多活动执行的载体,人们对Web服务的需求也会越来越大。有了这样的Web服务爬虫程序,用户便可以有效发现所需的Web服务,无需花费大量的时间精力在网络上盲
16、目地搜寻,同时也使开发者避免了很多不必要的重复开发。1.2 研究现状1.2.1 Web服务搜索技术网络技术的发展速度超出人们的想象,自Web服务问世以来,它在网络上的数量也在急速增加,人们对如何有效地搜索获取互联网上Web服务的探索也从来没有停止过。就目前看来,针对Web服务的搜索主要通过以下四个方式: UDDI,提供Web服务的网站,专用的Web服务搜索引擎以及通用搜索引擎。其中最为主要的搜索方式是基于UDDI注册中心。UDDI:即“Universal Description, Discovery and Integration” 3,翻译过来就是“通用描述,发现及集成协议”。 UDDI注册
17、中心向用户提供一个开放的接口,用户可以通过该接口查找发现分散在网络上的Web服务,获取其WSDL文档,然后以SOAP4调用的方式在自己的程序中请求该服务。然而,通过UDDI搜索Web服务也存在大量不足,其中最为显著的就是它的查询能力有限,而且可能保留着大量过期的信息。尽管如此,UDDI注册中心不管是现在还是在可预见的未来都在Web搜索领域占据着重要位置。Web服务网站:目前网络上存在许多网站提供Web服务,如WebServiceList5、ProgrammableWeb6等,这些Web服务网站是用户搜索Web服务的重要方法之一。拿WebServiceList举例,这个网站支持目录分类和关键词查
18、询,用户也可以按照名字、日期和打分来对网站上的Web服务进行排序进而查找自己所需要的。通常这些网站都不使用原始的Web服务标准,所以它们也存在不少缺陷,例如来源不可信,容易断开网络,另外一些长期不更新的网站也会保存大量的过期信息。除此之外,有一个问题令人不得不重视,那就是在拥有庞大数据的互联网上找到这些提供服务的网站需要花费大量的时间和精力。专用搜索引擎:专用的搜索引擎,如SD2S7、Merobase8、支持 QoS 的用于语义 Web 服务发现的搜索引擎9等,在一定程度上弥补了UDDI注册中心查询能力有限的不足,相较于另外三种搜索方式,通过专用引擎对Web服务进行搜索显然准确率更高。然而,这
19、些专用引擎多数技术并不成熟,而且在实际应用中,使用这些专用引擎的成本太高。另外,因为不是抓取网络上所有的Web服务,所以大部分专用引擎找全率并不高。通用搜索引擎:一些通用搜索引擎,例如Google、Yahoo 等也提供了对Web服务的搜索,因而使用这些搜索引擎对服务进行搜索也是一种好方式。通常,通用的搜索引擎对Web服务的覆盖面比其他一些服务网站要大,但是覆盖面一广,准确率就有所降低,因为Web服务与普通网页之间有很大的不同,但它们并不会对Web 服务进行区别对待。1.2.2 搜索引擎与网络爬虫技术搜索引擎是一种按照特定的规则不断从网上获取页面信息并建立索引,然后从索引中查找结果并排序最后将结
20、果返回给用户的系统。其中获取页面信息是搜索引擎的核心部分,通常使用网络爬虫技术来实现。在一个搜索引擎中,一个或多个爬虫程序每隔一段时间便反复地进行爬取,从一些种子页面开始,不断通过其中包含的链接爬行到其它的页面,爬虫程序在爬取过程中也会相应的对页面进行存储。目前对于爬虫技术,国内外都是研究的热点,内容也从传统的爬虫逐渐转向了主题聚焦的爬虫。近几年人们关注的爬虫技术基本上有以下几类:聚焦爬虫、智能爬虫以及高性能爬虫。聚焦爬虫是为了克服通用爬虫不能面向主题的不足而提出来的,他会根据客户一定的要求,有选择的访问网络上相关的链接和网页并进行对主题相关信息的抓取。因为是面向主题,所以聚焦爬虫的网页覆盖面
21、没有通用爬虫那么大,它只抓取与主题内容相关的页面,自然抓取的网页质量就比传统的爬虫要高出许多。但是因为要对信息进行过滤,所以可能会在爬取过程中忽略很多相关网页。智能爬虫,顾名思义就是具有一定的人工智能。智能爬虫的出现,解决了传统爬虫在爬取动态网页和需要注册登录的网页方面的困难。智能爬虫可以自动检测要爬取的网页是否需要注册和登录,若需要,那便自动登录,然后便可以爬取这个页面上所有的信息。智能爬虫经常被用来检查聊天室、论坛等这些社交平台上的敏感信息,并可以结合其他工具直接定位敏感信息来源的ip地址。另外在今年的研究热点之一数据挖掘中也可以看到大量智能爬虫的身影。高性能爬虫即分布式爬虫,又包括基于p
22、2p技术的分布式爬虫、基于移动代理的爬虫以及基于其他网格技术的爬虫。分布式爬虫最重要的指标是性能,相较于其他爬虫,分布式爬虫可以在一定程度上降低资源占有率,分散网络流量10,提高抓取效率与质量。1.3 项目研究内容本项目的主要研究内容有:1. 设计一个URL爬虫程序。该程序使用Python编码,利用广度优先策略访问网络上的页面,将页面中所有链接抓取出来,判断其中是否存在符合要求的URL,若是存在,便将其存入指定列表,然后依次访问该列表,将对应的WSDL文档下载到本地;2. 对下载到本地的WSDL文档进行解析,解析出其中Web服务的信息并将解析结果存入数据库中,进行管理与更新;3. 使用HTML
23、5+CSS3+JQUERY+PHP设计前端,展示抓取到的Web服务及其相关信息;4. 系统的开发环境是JetBrains PyCharm 5.0.4、Dreamweaver8,数据库使用MySQL 5.5,服务器使用Apache2.2。1.4 论文章节安排本论文主要介绍Web服务爬虫程序的设计与实现。文章以项目的研究背景为着眼点,继而对关键技术进行介绍,接着阐述项目的需求,重点介绍程序的设计思想以及程序的实现。总的来说,文章有以下几个章节的安排:一,绪论,该章主要介绍项目的研究背景,同时也分析了对于该课题国内外研究的现状,接着从研究内容,论文章节安排这几个方面,详细说明了该论文的结构。二,核心
24、技术简介,该章主要从技术方面介绍程序开发所涉及到的核心技术与理论。三,WSDL文档的爬虫程序,从爬虫原理、爬取策略、多线程设计、种子站点等几个方面对该爬虫程序做了详细的介绍。四,WSDL文档的解析与存储,本章主要阐述WSDL文档的解析过程以及存储数据库的设计。五,前端设计,本章从整体框架、各部分实现与结果展示以及与数据库的连接等方面介绍了本项目的前端程序与界面。六,总结与展望,本章主要对目前整个工作及论文做了一个概要的总结,分析工作中的不足并计划与展望后期的完善。1.5 本章小结本章从项目的研究背景着手,对国内外的研究现状进行了详要的分析,同时重点介绍了项目的研究内容,最后介绍了本文的章节安排
25、。2 核心技术简介本章的主要内容是介绍实现本爬虫程序涉及到的核心技术与理论。包括Web服务与爬虫程序涉及到的理论知识以及编写程序过程中用到的库。2.1 Web服务为了解决跨平台的程序之间的通信,实现程序间的无缝互操作性的问题,Web服务应运而生。Web服务是一种轻量级的通讯技术,它可以接收从互联网上传递的请求,换句话说,就是它可以通过互联网,对其他网站的信息资源进行调用。在Web服务的环境下,任意两个能够读写XML的应用程序都能相互通信。Web服务具有松散耦合的特性,是可以复用的软件模块,可以被其他软件系统调用。它使用WSDL文档进行描述,在UDDI注册中心进行注册,通过SOAP调用来接收数据
26、。通常来说,Web服务的工作模式如下:服务商先在UDDI注册中心发布服务,客户再通过注册中心查找自己所需的服务,服务注册中心收到请求,便响应相应的服务显示给客户,客户便可以下载服务使用说明,然后同服务商绑定后就可以使用服务了。Web服务有以下优势:(1) 不管在什么平台上,都可以使用Web服务;(2) Web服务可以使用任意语言进行编写,这一特性增加了Web服务的实用性,同时对程序员的要求也降低了许多;(3) 部署和维护Web服务无需考虑客户端对它是否兼容;(4) 使用Web服务可以实现多种数据与服务的聚合。2.2 WSDL文档相关技术2.2.1 XMLXML,即EXtensibleMarku
27、pLanguage11可扩展标记语言,它同HTML超文本标记语言)一样是一种标记语言,HTML被设计用来描述网页,它的着重点在于数据的外观,而XML则是被设计用来传输和存储数据,着重点在于数据的内容,可以看作是对HTML的补充的补充。因为XML中的标签没有被预定义,所以开发人员需要自行定义XML标签。XML结合了SGML(标准通用标记语言)和HTML的优点,它简单可扩展、支持多种语言、与平台无关、具有统一的标准语法,因此被广泛采用。因为XML技术的产生,以XML为底层核心和构架基础的Web服务也相应地在产生与发展。Web服务中的协议规范、描述文档、注册中心,全都是基于XML,可以这样说,XML
28、是Web服务描述和交换信息的标准手段。2.2.2 WSDL文档WSDL(Web Services Description Language)1,即Web服务描述语言,是一种基于XML语言,用一种机器能阅读的方式提供的用来描述和定位Web服务的正式文档。WSDL文档通常定义了一个Web服务所使用的元素:,该元素用来定义服务的数据类型;,该元素定义服务中操作的输入和输出参数12;,该元素抽象地描述了服务中会用到的操作;,定义了Web服务中操作的抽象集合;,该元素用来描述特定服务接口的通信协议等属性12;,该元素定义了单个服务的具体Web访问地址;,该元素是若干个 Web服务的定义的集合。通过各个元
29、素的名字用户便可以获取到一些与这个Web服务相关的信息。WSDL文档中通常会有一些注释也可以帮助人们对这个Web服务有所了解。2.2.3 xml.etree.ElementTreeElementTree13是Python自带的用来解析和处理 XML文档的API,它可以使用纯Python实现,也可以C 语言实现,相较于前者,后者实现的时候有更快的速度,同时消耗的内存也更少。ElementTree库的作用是可以将XML文档解析为一棵结构化的树,在这棵树上可以用attrib方法获取元素的属性值,用text方法获取节点值,用tag方法获取节点名。因为WSDL文档是基于XML语言的,所以可以像解析XML
30、文档一样使用xml.etree.ElementTree来解析WSDL文档。2.3 网络爬虫网络爬虫是一个能够自动访问互联网上的页面,并将网站内容下载下来的程序。一个完整的爬虫一般分为三大板块:抓取网页,分析信息,将信息进行存储。网络爬虫一般主要包括通用爬虫和聚焦爬虫。目前,最常用的还是通用爬虫。通用爬虫,也叫传统爬虫,是从给定的种子网页开始,读取页面的内容,然后将页面中存在的链接地址全部抓取出来,通过不断访问新抽取的URL来不断获取自己所需的信息,直到抓取完整个网站。网络爬虫中最重要的部分是网页搜索策略。它包括深度优先爬取策略、广度优先爬取策略和最佳优先爬取策略三种。深度优先策略是从一个种子U
31、RL进入网页,抓取该页面中的全部URL放入队列,从队列中选择一个URL深入爬取下去,抓取完这一条链路之后再纵向抓取下一条链路。相对来说,深度优先策略的设计会比其他爬虫策略简单一些,然而深度优先策略却存在着一个不容忽视的缺陷,那就是一旦过度深入,抓取到的网页一般价值很低而且容易进到链接深处很难出来。这是因为通常有价值的网页距离门户网站最近,所以每深入一层网页的价值有所下降就在所难免了。与深度优先爬完一个链路再爬取另一条不同,广度优先(或者称为宽度优先),是一层一层进行爬取的,即先访问入口网页,抓取其中所有的链接,然后从抓取到的连接中依次访问,继续抓取链接对应页面中的所有链接,如此循环直至该网站中
32、所有链接都抓取完毕。广度优先策略是目前人们在爬取网页时广泛采用的策略,主要是因为:一方面,广度优先可以解决宽度优先策略会降低网页价值的缺陷,另一方面,若想要使多个爬虫并行爬取,最好的办法是采用广度优先策略,除了上述优点之外,广度优先策略也相对容易设计和实现。除了上述两种策略之外,还有一种常用的网页搜索策略叫最佳优先策略,不过它常被用于聚焦爬虫。最佳优先,顾名思义即在爬取过程中按照某种网页分析算法选取页面中与主题相关度高或最有价值的URL进行下一步的爬取。采用最佳优先策略,可能会在爬取过程中忽略很多相关网页,但爬取到的无关网页的数量也会相应地降低。2.4 MySQL数据库MySQL是一个受全球开
33、发人员青睐的开源关系型数据库管理系统,它高效灵活可靠性强。MySQL将众多数据保存在不同的数据表中,而不是将它们存放在一个大型数据仓库内14。具体来说,MySQL有以下几点优势:(1) 使用MySQL成本低,因为MySQL是开源数据库,因此用户不需要支付费用。(2) MySQL可以处理大型数据库,即使该数据库拥有成千上万条记录。(3) MySQL使用标准的结构化查询语言(SQL)。(4) MySQL支持多种系统与语言,包括C、Python、Java、PHP等。2.5 Apache服务器Apache是一种开放源代码的快速稳定的Web服务器软件15,它几乎可以在所有广泛使用的计算机系统(如Unix
34、、Windows、Linux)上运行。Apache简单、快速、可靠,并且可以做为代理服务器。它支持SSL加密技术,可以配置多个虚拟主机。跨平台性和安全性是它最突出的两个优点,因此,Apache是当今世界上最流行的Web服务器端软件其中之一。2.6 本章小结本章主要内容是介绍课题研究及实现过程中所设计到的相关理论与技术。包括Web服务的相关介绍,WSDL文档的相关技术(包括它的组成与解析),爬虫程序的原理以及存储信息的数据库MySQL和Apache服务器。3 Web服务的抓取本章主要对Web服务描述文档抓取程序的设计思想作详细介绍,包括程序运行环境的配置、多线程的设计、爬虫的爬取策略、正则表达式
35、的设计以及WSDL文档的下载。3.1 程序运行环境本程序的开发环境如下:处理器:Inter(R) Core(TM) i5-2450M CPU 2.50GHz内存(RAM):4.00GB系统类型:Window10专业版 64bit开发软件:JetBrains PyCharm 5.0.4、MySQL 5.5编程语言:Python语言3.2 程序总体设计本程序使用的开发语言是Python,和当前流行的其他各种程序设计语言相比,其优点是拥有强大丰富的标准库,同时可以花较少的代价实现想要的功能,并且编写的程序清晰易懂。在Python中,提供了多个标准库使得我们可以方便地读取Web页面数据,本程序采用的是
36、urllib库,该库是Python进行网页爬取的最重要的库,使用它可以方便地访问想要的页面内容,获得网页的源代码。在获取了整个页面的源代码之后,使用正则表达式可以很容易地抓取出页面中的所有链接,然后将这些链接依次存入列表中,继续访问新存入的链接,这样列表中就可以不断增加新的链接,不断访问新的页面。配合多线程,可以一次访问多个页面,提高程序的效率。对于获取到的链接,要逐个进行判断其是否符合规范,其中符合要求的链接便存入另外的列表中,全部进行访问并下载链接对应的页面便可以获得相应的wsdl文档。3.2.1 多线程因为要爬取的网页少则几千多则上万,所以本程序设计了多线程,来进行多个线程同时爬取,这样
37、,便可以极大地提高爬取的效率。Python提供了两种创建并控制线程的方法,thread和threading标准库。本项目中爬虫使用的新的线程类ClawerThread继承了Python中threading.Thread这个类。该线程类中,主线程负责爬取URL,在主线程中还管理着一个线程池,有多个线程存在于该线程池中,这些线程则负责访问存放在列表中的诸多页面。因为在爬取过程中涉及到待爬取列表的及时更新,为了避免发生冲突,实现多个线程对某个表同步读写,于是在设计线程时使用了线程锁,即使用了threading.Condition对象,在更新待解析页面列队g_pages和已经被爬取链接队列 g_exi
38、stURL后才继续下一轮的线程。调用threading.Condition中的acquire()和release()(获得/释放线程)方法可以保证每次对表进行操作的有且仅有一个线程。当然,一个表无法保证待爬取链接列表的更新能够实现,于是在设计程序时设计了多个表(见下节)。同时,在线程类的设计过程中必须重写其中的run方法,本线程类中的该方法可以实现访问网页、更新列表的功能。另外,本程序可以根据要爬取URL的数量设置线程数,这样就可以避免线程的浪费。多线程访问网页的关键代码如下图所示:图3-1 多线程关键代码3.2.2 爬取策略设计一个爬虫程序时,首先要考虑的便是爬取策略。常用的爬取策略有广度优
39、先和深度优先两种。广度优先策略就是对URL一层一层地进行访问,爬取完一层之后才开始对下一层的爬取。因为要爬取的有价值的网页往往都离种子站点比较近,为了避免爬取到很多无关网页,提高程序的效率,同时配合多线程进行分布式抓取,本程序采用广度优先爬取策略。在本程序中总共设计了5个队列:1)待解析页面列队g_pages,该队列中存放的是由多线程读取的多个页面的合集,从该列队中解析所有的URL。 2)等待爬取链接队列g_queueURL,在这个队列中存放的是所有等待被爬取的 URL。3)已经被爬取链接队列 g_existURL,所有被访问过的URL都被放入该列表中。4)访问失败链接列队g_failedUR
40、L,对于那些无法访问的页面则存入该列队中。5)符合要求的链接列队g_wantedURL,将符合要求(即以wsdl结尾)的链接都存放入本列队。整个程序的工作过程如下:1)用户在运行界面中输入url入口,爬虫类中会初始化种子URL,然后将该URL加入等待爬取链接队列g_queueURL中。2)等待爬取链接队列g_queueURL不为空时,多个线程同时访问列队中的链接,获取这些链接所对应的页面的内容,同时将这些已访问过的链接放入已经被爬取链接队列 g_existURL,标志链接已经被爬取。对于无法访问的链接,则跳过,将其URL存入访问失败链接列队g_failedURL。3)解析上述这些链接对应的页面
41、集合,使用正则表达式提取出页面集合中所有标签中的href属性,得到所有页面链接的一个队列linklist。4)在得到的新链接中逐个进行判断,检查其中是否存在符合要求(以wsdl结尾)的链接,若存在,便将其放入符合要求的链接列队g_wantedURL中,其余的链接再进行过滤,将其中以“jpg”“gif”“css”等结尾的无关链接舍去,余下的链接则放入队列urllist中,再将urllist与g_existURL作比较,将其中不存在于已经被爬取链接队列g_existURL中的链接存入等待爬取链接队列g_queueURL中。重复2),3),4)这三个过程,可以进行多层抓取,直到待爬取列队中的URL全
42、被访问完毕为止。 爬取过程如图3-2所示。图3-2 抓取流程3.2.3 种子站点的选择种子站点作为爬虫程序爬取信息的第一步,其选择得好坏对爬虫程序的效率起着至关重要的作用。一般来说,一个好的种子站点中总是包含着大量要获取的信息或者要爬取的其他URL,只有这样,爬虫程序才不会在众多的无关页面上浪费时间。本程序中选取的种子站点都是网络上提供Web服务的网站或者Web服务专用搜索网站,如、等。选择这样的网站作为种子站点的好处就是可以不用深入爬取很多层便可以得到大量高价值的网页,获得想要的WSDL文档所在的URL地址,如此一来,既提高了爬取效率,又节省了内存。3.2.4 正则表达式的设计使用正则表达式
43、可以快速检查某个字符串是否与某种模式匹配,从而获取自己想要的信息。Python提供的一个标准库re可以支持功能强大的正则表达式,因此本程序中,对网页中链接进行提取以及对符合Web服务要求的URL进行判断时都使用了正则表达式。re.findall可以对字符串进行搜索,然后将其中能与想要的模式匹配到的全部子串以列表的形式返回。在对网页中的所有链接进行抓取时,使用“re.findall(r(?=href=).+?(?=)|(?=href=).+?(?=), content)”可以查找网页集合中所有href中的内容,然后返回一个URL列表。返回的URL列表中,还会包含javascript和#XXX之类
44、的链接,对于这些特殊的URL要进行过滤或补全。代码实现如图3-3:图3-3 特殊URL的处理在对抓取到的URL进行判断其是否符合Web服务要求时,使用正则表达式“re.findall(r(.*?(?|.)(wsdl|WSDL), link)”对获取到的链接进行一个一个的匹配,判断其是否以wsdl结尾,若是,返回的结果是一个列表,其中包含了所有能匹配的子串,依次将列表中第一个子串添加到g_wantedURL便可以得到符合要求的URL列表。3.2.5 WSDL文档的下载该模块主要用来从符合要求的链接列队g_wantedURL中依次访问链接,并下载该链接对应的网页的wsdl文档,然后保存在指定的路径
45、下。Python中的urllib.request模块中有一个名为urlopen()的函数,可以打开一个网页,返回结果是一个对象,该对象类似于文件对象。传入urlopen()的参数要遵循特定的网络协议,也就是说传入该函数中的网址必须要有“http:/”这样的开头。在urlopen()函数中提供了read()方法,使用read()方法可以将urlopen()函数的返回结果的所有内容读取出来,但是必须定义另一个对象来对得到的数据进行存储,这样,数据才可以进行后续的操作。read()方法读取出的数据是字节数组bytes,这就需要我们将其解码为字符串。使用decode()方法可以转化为相应的字符串编码。
46、定义一个已下载页面列表downloadedpages,网页读取出来后,将其写入指定的文件夹,存储为wsdl格式,同时将网页的URL存入downloadedpages中,避免重复下载。对于无法访问的网页,则抛出异常,继续访问下一个URL。关键代码如图3-4:图3-4 下载WSDL文档图3-5为WSDL文档下载结果中的一部分:图3-5 WSDL文档抓取结果3.3 本章小结本章主要介绍了本项目中最关键的部分,WSDL文档的抓取。从程序的运行环境开始,对本程序做了详细的说明。本程序是基于Python的多线程爬虫程序,使用广度优先爬取策略,利用正则表达式提取网页中的链接并判断其是否符合要求,然后访问符合
47、要求的URL,同时将其对应的网页下载下来保存为WSDL文档。4 WSDL文档的解析与存储本章主要从WSDL文档的解析入手,介绍如何使用Python的ElementTree库对它进行解析,同时对如何将解析后的信息存入数据库进行详细地阐述,其中重点介绍数据库的设计与实现。4.1 WSDL文档的解析作为基于XML 语言来描述Web服务的标准文档,解析WSDL文档可以参考解析XML 文档的方法。 definitions元素是WSDL文档的根元素,通过对根元素进行解析,可以获得WSDL文档的名称、目标名字空间以及文档中应用的名字空间。在根元素之中包含着7个重要的元素:、 、 、 、 、 、 元素。 其中元素是整个WSDL文档中最重要的元素,它描述了该Wwb服务可以被执行的所有操作。在对WSDL文档进行解析时,只需将文档中所有的元素解析出