已阅读5页,还剩25页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
在线产品即时比价系统设计方案1.1 课题研究的意义1.1.1 课题的现实意义当用户需要购买一件商品时他需要面临一个选择,即在哪个网站购买自己想要的商品,在这个时候用户会在各大电商网站中逐一搜索自己想要购买的商品,哪个网站提供的商品性价比最高,用户就会选择这个网站进行交易。用户在各大网站搜索和比较商品无疑是一件费时费力的事情,频繁得在各大电商网站之间切换,不能很直观的看到这些商品之间的差异。此外,用户多会在一些较大的电商网站比如淘宝、京东等搜索自己想要购买的商品,却忽略了其它规模较小的电商网站,用户在不知不觉间就丢失了一些重要的信息。为了应对以上问题,开发一个比价系统是很有必要的。当用户需要购买一件商品时,只需要在比价网站搜索自己想要的商品,比价网站会将各大电商网站的商品信息在同一个页面呈现给用户,用户可以直观的看到各大电商网站的商品价格差异,同时也能获取其它不知名购物网站的商品信息,有助于用户完成交易。比价系统对于用户和卖家都是有利的,非常有价值去实现这么一个具有比价功能的系统。1.1.2 课题的学习意义Web系统开发在当前是一个非常热门的领域,越来越多的程序员都在涌向Web开发领域。因此,熟悉一些Web开发中常用的技术是非常有意义的事情。Java、PHP和.net是当今Web开发中最常用的技术。本系统将采用Java来开发,同时了解Java开发Web系统的流程,熟悉Java开发的一些常用技术,对自己以后的发展是很有帮助的,因此开发一个这样的基于Web的网络购物比价系统能够提高自己的竞争力,也可以为将来从事此行业铺好道路。1.2 国内外概况1.2.1 比价系统国内外发展概况互联网技术的出现和发展极大方便了人们对信息的获取,国外互联网出现的较早,对价格比较系统的研究和开发也比较早。目前国外的比较购物行业已经处于较为成熟的阶段。比较购物已经成为国外网购用户必须借助的网购工具,也成为B2C 商家不可或缺的合作伙伴。国内比较购物网站起步的比较晚,一直到2004 年,随着互联网的普及,比较购物网站才开始兴起,但是发展到现在,国内也已经出现了不少的比较购物网站和应用。1.2.2 HTML解析国内外发展概况比价系统的核心在于HTML文本的解析,当前用以HTML解析的工具非常多,这些工具由各种语言开发,很多工具都有多语言版本。国内外可用以HTML解析的库相当多,主要如下:HTML Parser 。该库是一个对HTML进行分析的快速实时的解析器,最新的发行版本是2.0。Jsoup。Jsoup 是一款 Java 的HTML 解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于JQuery的操作方法来取出和操作数据。jsoup的主要功能如下:从一个URL,文件或字符串中解析HTML;使用DOM或CSS选择器来查找、取出数据;可操作HTML元素、属性、文本;jsoup是基于MIT协议发布的,可放心使用于商业项目。NekoHTML。NekoHTML是一个Java语言的 HTML扫描器和标签补全器(tag balancer) ,使得程序能解析HTML文档并用标准的XML接口来访问其中的信息。这个解析器能够扫描HTML文件并“修正”许多作者(人或机器)在编写HTML文档 过程中常犯的错误。NekoHTML能增补缺失的父元素、自动用结束标签关闭相应的元素,以及不匹配的内嵌元素标签。NekoHTML的开发使用了 Xerces Native Interface (XNI),后者是Xerces2的实现基础。JTidy。JTidy 是 HTML Tidy 用Java语言实现的版本,提供了一个HTML的语法检查器和很好的打印功能。JTidy可以用来清除格式不好和不对的 HTML。此外,JTidy提供了对整个HTML的DOM分析器。程序员可以将JTidy当作一个处理HTML文件的DOM解析器来使用。HTMLCleaner。HTMLCleaner是一个开源的Java语言的HTML文档解析器。HTMLCleaner能够重新整理HTML文档的每个元素并生成结构良好(Well-Formed)的 HTML 文档。默认它遵循的规则是类似于大部份web浏览器为创文档对象模型所使用的规则。然而,用户可以提供自定义tag和规则组来进行过滤和匹配。MozillaParser。MozillaParser 是一个 Java 的HTML 解析类库,基于 mozilla 的HTML 解析器,提供了Java类到 Mozilla类的一个桥接,输入一个HTML文本,输出一个 Java 的 Document 对象。Jerry 。Jerry是 Jodd 工具包中的一个HTML解析工具。它有点像是用Java实现的jQuery。Jerry是一个高效简洁的Java库,用来简化HTML的解析,遍历和操作。Jerry的API在设计的时候完全向jQuery靠拢,几乎和jQuery一样,所以有时候你可以直接copy jQuery的代码来用。当然,也有些代码做不到一样,毕竟执行的环境差了很多。Jerry是一个静态的HTML解析工具,所以jQuery的动态功能Jerry是没有的,例如Ajax,动画等等。Scrender。Scrender是一个用来生成网页缩略图的Java类库,基于SWT开发。它实质上是调用本地浏览器引擎对要进行截图的网站进行渲染,然后保存该网页的缩略图。在本系统中采用Jsoup来进行HTML文本解析,灵活、高效地使用Jsoup也是整个系统的关键所在。1.3 课题主要内容1.3.1 课题任务本课题将实现一个简单的网络购物比价系统,系统需达到如下要求:本系统主要是对在淘宝网、京东网和亚马逊网三大购物网站中的相同产品的信息进行抽取。本系统的重点是实现使用HTML页面爬取功能获取产品数据,对获取到的网页数据进行抽取分析,最后以Web页面形式呈现出来。本系统的难点是使用HTML页面爬取功能获取产品数据,对获取到的网页数据进行抽取分析,结构化抽取的数据和信息。1.3.2 毕设主要内容毕设根据课题任务实现了一个实时爬取淘宝网、京东网和亚马逊网的商品信息的比价系统。系统具有如下特点:(1) 系统能够分别从淘宝、京东和亚马逊三个网站爬取相关商品信息,商品的信息包括商品链接、商品图片链接、商品价格、商品名(也指商品简介)。系统可以在同一个页面中同时显示三大电商网站的相关商品信息,用户可以从页面中看到不同电商网站的商品价格差异;(2) 商品的关键字匹配是在电商网站完成,电商网站的搜索结果是比较准确的,系统将搜索结果直接拿来使用,保证了商品关键字的较高匹配度;(3) 系统设计为实时爬取。系统的这个特性保证了系统爬取到的信息的准确度,能够很好应对两大电商网站的价格浮动和商品的新旧更替;(4) 系统的默认排序为三个电商网站商品的交替排序,并且这些排序是经过相似度算法处理的;(5) 系统可以选择不同的电商(这里只做了三个)的商品;(6) 系统没有较明显的大BUG,不影响用户的使用体验;(7) 系统主要分为3个层级:业务逻辑层、数据爬取层、视图层。三个层级协调工作,共同实现整个系统的功能。302 系统设计方案2.1 两种系统设计方案比价系统要做的事情主要是:爬取多个电商网站的商品信息,将这些商品的信息同时呈现给用户。然而商品数目繁多,系统需要在众多的商品中搜索出符合用户要求的商品。关于在何时何地进行商品的搜索产生了2种不同的方案 - 数据库法和即时爬取法。数据库法需要经常更新数据库数据,而即时爬取法则更适合本系统的设计目的。在2.1.1和2.1.2小节将会详述2种方案的细节,以及两种方案的优缺点。2.1.1 方案1 数据库法在该方案中,系统已经事先爬取了各大电商网站几乎所有的商品信息,然后将每种商品的主要信息(商品价格、商品主页链接、商品图片链接、商品简介)存储在服务器的数据库当中,并将每种商品在数据库的索引和其关键字信息通过检索/索引工具(比如:Lucene)在磁盘建立索引文件。当用户在比价系统的搜索栏中输入关键字并点击搜索按钮时,系统获取了这一关键字,然后通过检索/索引工具的检索功能获取一系列符合要求的商品的索引,然后将这些商品的信息从数据库取出,通过jsp技术动态生成网页提交给用户的客户端浏览器。方案1的系统流程见图2.1。(1) 方案优点爬取模块和响应客户端的模块相对较独立,爬取模块可在空闲时爬取商品信息。商品检索在服务器端执行,响应速度较快。(2) 方案缺点每个电商网站的商品数量都是非常大的,再加上多个电商网站,总的商品量就相当大,然而电商网站的数据库不可能开放给外界直接进行访问,系统需要通过电商网站的商品页面来获取商品信息。假设每个商品都对应一个页面,那么就是海量的数据要进行处理。每爬取一次都要耗费大量的资源,带来一定的开销,然而这些商品的数据并不是一成不变的,需要经常更新来确保数据的准确性。客户端浏览器视图层数据库数据爬取模块业务逻辑层数据持久化亚马逊商城京东商城图2.1 方案1数据库法2.1.2 方案2 即时爬取法方案1的实现类似于搜索引擎,方案2则与方案1大不相同。方案2中商品的信息并不存储在系统服务器端的数据库中。当用户提交关键字时,服务器端将关键字提交给各大电商网站,然后将各大电商网站的搜索结果页中爬取商品信息,将爬取到的信息经过处理再动态生成网页提交给用户。方案2的系统流程见图2.2.(1) 方案优点较灵活,可良好应对商品信息经常变更的情况。在服务器不需要数据库来存储数据,消除了数据的维护成本。(2) 方案缺点用户在客户端每提交一次关键字服务器就要在各大电商网站再提交一次关键字,然后实时爬取商品信息再反馈给用户的客户端浏览器,需要花费时间等待系统把产品页面数据下载下来,而且每次面向用户服务都要对各大电商网站商品页面信息页面进行解析,耗时耗资源,特别是在数据源很多的情况下。客户端浏览器比价系统业务逻辑层视图层数据爬取层京东商城亚马逊商城图2.2 方案2 即时爬取法2.2 方案选择最终实现方案:方案2 即时爬取法。在方案1(见图2.1)当中,一次性抓取所有电商网站的所有信息要耗费大量的时间,而且在此期间对于大量网页的解析需要进行大量的运算,在此抓取周期内还可能发生各种不可预知的因素,而且整个抓取模块还受限于PC机的性能和网络环境等因素,综合以上因素方案1并不适合作为毕业设计的最终方案。而方案2较容易实现,虽然用户每次访问都要做较大量的运算,并行服务性能定然不强,但并不用事先抓取海量的商品信息,相对于方案1较容易实现。综合以上分析的情况,选定方案2作为系统的最终实现方案。2.3 开发技术与开发环境2.3.1 JSP技术Web领域开发技术众多,像.NET、JSP、PHP等。本系统主要使用JSP技术来实现。JSP是由SUN公司倡导、其它公司参与一起建立的一种动态技术标准。在传统的网页HTML文件中加入JAVA程序片段和JSP标签,就构成了JSP网页。JAVA程序片段可以操作数据库、重新定向网页等,实现建立动态网站所需的功能,所有程序操作都在服务器端执行,并将动态建立的HTML网页发送给客户端浏览器。而浏览器与开发技术无关,浏览器只负责解析渲染HTML页面。JSP技术优势。由于JAVA跨平台的特性,可以一次编写处处运行。代码在跨平台时不用做大量的修改。JAVA具有强大的可伸缩性,由多台服务器进行集群和负载均衡再到多态Application进行事务处理,消息处理,一台服务器到无数台服务器,JAVA显示了一个巨大的生命力。JAVA还有功能强大的和多样化的开发工具支持。很多开发工具免费提供给开发者和学习者。此外JAVA还有很多服务器端组件的支持JSP技术劣势。JAVA的跨平台特性源于其特殊的运行方式。JAVA编译成字节码后要在JVM中运行。这样大大降低了执行效率。同时JAVA庞大繁多的框架与组件支持也加大了其系统的复杂性以及学习者的压力。2.3.2 HTML解析技术Jsoup介绍系统使用HTML解析库Jsoup来对网页进行解析。jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。jsoup的主要功能如下:(1) 从一个URL,文件或字符串中解析HTML;(2) 使用DOM或CSS选择器来查找、取出数据;(3) 可操作HTML元素、属性、文本;jsoup是基于MIT协议发布的,可放心使用于商业项目。jsoup 的主要类层次结构如下图所示:图 2.3 Jsoup类层次结构图2.3.3 系统开发环境JAVA是一个跨平台的语言,相应的JSP技术也可以在多平台下做开发。本系统在Windows7 64bit下搭建开发与运行环境。(1) JDK1.6JDK(Java Development Kit)是Sun Microsystems针对Java开发人员的产品。JDK是整个Java的核心,包括了Java运行环境、Java工具和Java基础类库。(2) Intellij IDEA 13IDEA全称是Intellij IDEA,是java语言开发的集成环境,IntelliJ在业界被公认为最好的java开发工具之一,尤其在智能代码助手、代码自动提示、重构、J2EE支持、Ant、JUnit、CVS整合、代码审查、 创新的GUI设计等方面的功能可以说是超常的。IDEA是JetBrains公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。(3) TomcatTomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5 支持最新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。目前最新版本是8.0,而本系统采用的是版本Tomcat 6.0。3 系统总体设计3.1 系统总体架构系统采用JAVA EE技术开发。系统主要分为3个层次:业务逻辑模层、数据爬取层块、视图层。该系统虽不是严格的MVC模式,却与MVC模式具有很大的相似性。业务逻辑层。该层负责将浏览器提交的参数进行简单的处理,通过相关逻辑功能,分别生成三大电商网站的URL,将URL作为参数提交给数据爬取层。该层相当于MVC里面的C。数据爬取层。数据爬取层以业务逻辑层提交的URL作为参数,对该URL对应的商品页面进行解析,获取页面的商品列表,针对商品列表中的每一件商品逐个解析,最后把爬取到的商品数据封装在对象数组中,返回给业务逻辑层。该层相当于MVC里面的M。视图层。视图层是直接面向用户的一个层,该层包含了一个静态的HTML页面和一个动态的JSP页面。静态的HTML页面是系统的主页,主要负责向系统提交用户的搜索关键字。动态页面主要用来显示搜索的结果,同时也提供同静态HTML页面相同的功能。系统总体架构图如图3.1所示。视图层业务逻辑层数据爬取层发送搜索关键字与分页信息请求发送url请求返回爬取到的数据返回处理过的数据图 3.1 系统总体架构图3.2 每层简要设计接口是软件开发领域内的一个重要的概念。接口可以用来定义软件体系中不同层次之间的通信规则。在软件开发的过程中,开发者将系统分为多个层次,每个层次实现特定的功能,并为各个层次之间的通信建立接口标准,这样只要每个层次的满足了接口标准,在某一层需要改动的时候其它层不需要进行改变。接口屏蔽了每一层的实现细节,同时保证了程序模块的重用性。本系统分为三个层次:业务逻辑层、数据爬取层、视图层。业务逻辑层根据用户的请求生成三大电商网站的URL,将URL提交给数据爬取层;同时业务逻辑层还将数据爬取层返回的商品数据进行简单的处理,将其返回给视图层。数据爬取层根据业务逻辑层提交的URL爬取该页面的商品数据,将数据封装在对象数组中并返回给业务逻辑层。视图层根据业务逻辑层返回的商品数据,动态生成HTML页面,将其提交给用户端的浏览器。业务逻辑层。在该层创建时,其构造方法需要以request对象作为参数,该层可以根据request对象获取用户的请求。在该层消亡时,该层需要返回商品数据给调用层,因此该层需要有一个方法用来获取商品信息并将其返回。可以对该层进行如下框架设计:(1) 类:GetItemFromWeb,该类为该层的功能实现类。(2) 方法:GetItemFromWeb ( HttpServletRequest request ),该方法为构造方法,创建对象时以request对象作为参数,该类可以通过request对象来获取用户的请求信息。(3) 方法:public List getItemInfoList (),该方法用以获取通过请求获得的商品项信息列表结果集。数据爬取层。该层以页面URL作为参数获取该页面的商品信息。在该层创建时,该层需要获取页面的URL,其构造方法需要以URL作为参数。在该层消亡时,该层需要将爬取到的商品数据返回给调用层。可以对该层进行如下框架设计:(1) 接口ItemInfoListInterface,该接口用于规范获取商品项信息列表的类。(2) 方法 public List getItemInfoList (),该方法爬取URL对应的页面的商品信息,并将其作为返回值返回。视图层。该层可以用两个页面实现。使用静态的HTML网页做系统的主页,该页面的搜索框模仿一淘网的主页搜索框样式。动态的页面使用的是JSP技术实现,该页面负责显示商品的信息,该页面模仿了京东加一淘的搜索结果页的布局。浏览器业务逻辑层数据爬取层视图层电商网站请求request对象URLURLHTML文本商品数据商品数据HTML文本系统的数据流向图见图3.2 。图3.2 系统数据流向图4 系统详细设计与实现4.1 系统功能简介本系统只对淘宝网、京东网和亚马逊网3个购物网站的商品信息进行爬取。系统可以根据用户提交的关键字在淘宝网、京东网和亚马逊网抓取相关商品信息,并将抓取到的信息通过JSP技术动态生成网页提交给浏览器。用户可以在搜索结果页中看到来自三大电商网站的商品,可以直观地察觉到两大商城的商品价格差异,并不用分别从两大电商的网站搜索商品,这样节省了用户的时间和精力。在上文中介绍到系统主要由三层构成,下文将详细介绍这三个功能层的设计与实现。4.2 数据爬取层设计与实现数据爬取层的功能:以页面的URL作为参数获取该页面的商品信息,并将商品信息封装在对象数组中。本小节将着重于介绍系统如何从页面的URL获取每件商品的各项基本信息。4.2.1 爬取商品列表(1) 京东商品列表爬取算法的设计与实现京东搜索得到商品的搜索结果页面见图4.1。在图4.1中,红色方框中的商品才是系统需要爬取的商品。数据爬取层需要将搜索到的结果从大量的商品中分离出来,得到一个列表,然后再对列表中的商品逐一解析。本小节将详细介绍系统如何获取这个列表。图4.1 京东商品搜索结果页面在搜索结果中,京东的的图书和非图书的搜索结果页面结构是不同的,图书和非图书商品在搜索结果页面中的HTML代码对比如下:图书商品1非图书商品1图书商品2非图书商品2图书商品3非图书商品3图书商品N非图书商品N标签中存放搜索得到的所有商品。获取商品的列表就是将标签中的所有子标签对应的Node结点过滤出来。系统中实现获取搜索结果页面商品列表算法的为类JDItemInfoList的GetItemInfoList方法,类JDItemInfoList同时也是实现数据爬取层的顶层类,该类的成员及简介见表4.1.表4.1 类JDItemInfoList成员简介PageInfoData pagedata存储用户请求的页面信息对象pageurl当前需要解析的页面URLpublic JDItemInfoList ( PageInfoData pagedata1,String url)构造方法private List getItemInfoList ( )通过页面URL获取商品列表getItemInfoList方法可以采取两种方法来获取商品搜索结果的列表。其中一种方法对图书和非图书的HTML结构敏感,另外一种方法对两者的HTML结构不敏感。下文将详细介绍这两种方法。1 方法1:对两者的HTML结构不敏感方法1是一种对于两种商品的HTML结构不敏感的方法。图书商品和非图书商品都存放在标签中,系统可以过滤出该标签对应的节点标签对象,并执行该对象的getChildren方法即可获取商品的列表。方法1的优点:简洁、高效、出错机率小。方法1的缺点: getChildren方法获取的列表中会存在大量的空结点,在下一小层对列表中的商品进行解析时会花费额外的开销去处理这些空结点。2 方法2:对两者的HTML结构敏感方法2对于两种商品的HTML结构敏感,该方法直接从整棵树中过滤出商品的结点并得到一个列表。然而系统预先并不知晓该页面是图书商品页还是非图书商品页,系统需要同时用两种过滤规则过滤出商品的结点列表。(2) 亚马逊商品列表爬取算法设计与实现针对亚马逊网站的页面商品列表提取算法与京东的基本一样。亚马逊对所有商品的搜索结果页中商品局部HTML结构都是一样的,比京东的更简单。亚马逊搜索结果页的商品信息放在 中,每件商品的信息放在中,可以依据上诉规律来设定过滤条件。亚马逊的搜索结果页面结构较统一,并不需要像京东那样需要采用多线程技术针对两种页面进行爬取,除此之外其它的流程和京东模块基本一致,不再赘诉。4.2.2 爬取商品基本信息商品的基本信息包括:商品链接、商品图片链接、商品价格、商品简介。这些信息全部用字符串来表示,在java中用String来表示。系统用一个类ItemInfoData来存储单件商品的基本信息。该类有5个数据成员,其定义如下:public class ItemInfoData public String itemUrl;public String itemIntro;public String itemImage;public String itemPrice;public String jdid;其中itemUrl是商品的链接,itemIntro是商品的简介,ItemImage是商品的图片链接,itemPrice是商品的价格。系统中所有的商品都需要抓取前4个信息,并且每件商品的信息都存储在ItemInfoData类型的对象中。对于京东还需要抓取商品的ID存储在jdid中。(1) 京东商城商品基本信息抓取算法在京东的搜索栏中提交关键字后,京东根据关键字搜索到符合要求的商品,并将商品按符合度排序。京东在每一页面最多显示36件商品。在上文中讲到,每件商品的信息都放在标签中的每一个标签中。标签中的结构如下:1 2 3 4 5 6 7 8 9 10 诺基亚(NOKIA)商品简介及关键词11 12 13 14 15 16 17 商品的HTML文本中第1行为该商品的ID号,第4行的标签中存放了商品的图片链接,第9行的标签中存放了商品的主页链接,第10行是商品的简介。类JDItemInfoList用来从商品列表爬取商品的基本信息,其核心方法为getItemInfoList。类JDItemInfoGet各成员简介见表4.3。表4.3 类JDItemInfoList方法简介PageInfoData pagedata存储当前搜索分页信息public JDItemInfoList (PageInfoData pagedata)构造方法public List getItemInfoList()解析商品列表中的每件商品得到其基本信息private void UpdatePrice(List itemlist)当爬取商品价格失败时调用此方法重新爬取商品价格private JSONArray getPriceJSONArray(String url)爬取商品价格信息,返回JSONArray对象HTML文本中的每个Node结点都存在于一棵Node书中。京东的每件商品在Node树中的局部结构见图4.3。类JDItemInfoGet中有一个私有的方法OneItemInfoGet用来获取单件商品的基本信息。GetArrayFromList方法中会调用该方法来对每件商品进行解析。下文将从4个方面对OneItemInfoGet获取商品基本信息的详细实现进行讲诉。. 结点:div sku=”ID” 结点:div class=p-img 结点:div class=p-name 结点:div class=p-price 图4.3 单件商品在Node树中的结构对于京东的抓取模块在抓取商品基本信息前需要抓取商品的ID,商品的ID在图4.3中顶层父结点中即属性sku的值。A. 获取商品链接与商品简介在4.3.1节中,京东每件商品的信息放在中,而中又有许多子标签,标签及其子标签中存放了商品的链接,以京东中的某一件商品为例,其HTML结构如下:【销售冠军】圣优 新款休闲男鞋韩版潮流时尚板鞋驾车鞋男士英伦防滑鞋子透气网鞋 深兰 42码标准运动鞋码在标签及其子标签中存有商品的主页链接和商品的简介。其在Node树中的结构见图4.4。图4.4中第二层的结点存有商品的主页链接信息,第三层所有的结点存有商品的所有简介信息。可以把第三层的所有子结点全部转换为字符串,用来在视图层中显示商品的简介。结点:a target=结点:div class=p-namea标签中的文本:【销售冠军】图4.4 p-name局部结构B. 获取商品图片链接商品的图片链接信息存储在标签的子标签中,以某件商品为例,其该部分的HTML结构如下:在爬取到的HTML文档中的标签中有一个属性名为data-lazyload的属性,其原本应该为src。C. 获取商品价格商品的价格信息一般存储在的子标签中,京东的商品价格有时候直接显示在其HTML文本中,然而在更多情况下HTML文本中并没有价格信息,这种情况是因为京东使用了AJAX技术以根据商品的ID动态获取商品的价格,因此对于京东爬取模块需要额外爬取商品的ID。以某件商品为例,其HTML结构如下:¥28.00(然而在更多情况下此处并没有价格信息)由于在很多情况下在上述HTML文本中的标签后边并没有商品的价格信息,此时就需要其它的方法来获取商品的价格。类JDItemInfoList提供了UpdatePrice方法来获取商品的价格。京东的页面使用JS通过get提交的方式来获取商品的价格。以某页面为例,其get提交的URL格式如下:/prices/mgets?skuids=J_1022922287,J_1024062417,J_1003051849,J_1037942546,J_1013716538,J_1021340651,J_1028845284,J_1015133627,J_1142446514,J_1030576907,J_1016888940,J_1028486310,J_1084204783,J_1084635574,J_1086756717,J_1026458375,J_1097307848,J_1098459771,J_1018016043,J_1033241146,J_1012201655,J_1023331713,J_1076685891,J_1091407098,J_1028480515,J_1038858497,J_1029117866,J_1100676577,J_1114744029,J_1097950947,&type=1在以上URL中,每个”J_”后边的数字就是商品的ID,将以上URL通过浏览器打开会在浏览器看到上述所有ID对应的商品的价格,见图4.5。图4.5 商品价格UpdatePrice方法将对如图4.5中的长字符串进行分析,得到其中商品的价格,并将价格存储在每件商品对应的ItemInfoData类型对象的数据成员itemPrice中。(2) 亚马逊商城商品基本信息抓取算法亚马逊网站相对于京东的网站要显得更统一,而且在商品列表页中,商品链接、商品价格、商品简介和商品图片都直观地显示在页面中,可以直接进行抓取,不需要绕弯子,其过程与京东的抓取方法基本一致,不再进行赘诉。亚马逊每件商品的HTML结构见图4.6,图中黑框部分就是商品的四大基本信息所在的标签。对于亚马逊商品基本的爬取基本上京东模块的实现是一样的,甚至比京东模块的要更简单。图4.6 亚马逊商品4.2.3 爬取分页相关信息当对一个商品进行搜索时,往往会匹配出多件商品,有时候商品的数目过多需要进行分页显示。于是本系统对分页的情况进行了处理。系统的分页功能需要靠一个类来实现:public class PageInfoData public int page; public int jdpage; public int azpage;public int tbpage;public String key; public String key_gbk; public String key_utf8;类PageInfoData封装了一些关键信息。page表示用户当前向系统请求的页码,当用户使用搜索时该变量的值为1或者用户通过第2页的“上一页”链接请求第1页时该变量的值也为1.jdpage表示系统在一次响应用户的请求时,京东商城对于该商品的搜索结果的分页数。azpage表示系统在一次响应用户的请求时,亚马逊商城对于该商品的搜索结果的分页数。tbpage表示系统在一次响应用户的请求时,网对于该商品的搜索结果的分页数。key为搜索关键字。key_gbk和key_utf8表示用户向系统提交的关键字。两者的编码格式不同,第一个为gbk编码第二个为utf-8编码。系统在一次响应用户的请求中只会实例化一个PagaInfoData的对象,该对象在系统的整个流程的开始和结尾部分都起到重要的作用。该对象在系统中几乎是全局的,绝大多数核心的功能类都有专门的数据成员来存储该对象的引用。在业务逻辑层、数据爬取层、视图层,都有涉及到该对象的操作,以该对象为基础的分页机制是不可分割的,所以单独把该对象拿出来结合分页机制进行叙述,在其它部分就不再对该对象及其相关的逻辑进行讲诉。(1) 在逻辑业务层用户访问系统的URL格式一般为:http:/localhost:8080/OPPCS/search.jsp?key=商品名&page=当前页码&JD =京东总页数&AZ=京东总页数&TB=淘宝总页数或: http:/localhost:8080/OPPCS / search.jsp?key=商品名对于第一种格式(方式1)是用户点击“上一页”或“下一页”的邻页请求,第二种格式(方式2)是由表单提交给系统的搜索请求。对于方式1,一定有page参数大于1。在此方式下,业务逻辑层实例化一个PagaInfoData类型的对象pagedata,将参数page的值赋值给对象的成员page,将参数JD、AZ和TB的值分别赋值给对象的成员jdpage、azpage和tbpage,将参数key的值以utf-8和gbk两种编码格式分别赋值给key_utf8和key_gbk。业务逻辑层在生成URL的过程中会判断pagedata的成员page分别与jdpage、azpage和tbpage的大小关系,用以生成URL,当jdpage、azpage和tbpage分别小于page时,不对该网站生成URL。(2) 在数据爬取层在数据爬取层,要把三大网站的商品的总页数爬取出来分别保存到pagedata中的jdpage、azpage和tbpage中(3) 在视图层在视图层,系统根据pagedata的成员page与totalnum和1的关系来确定当前页面是否放置“上一页”和“下一页”的链接,详细请见4.3.2小节。4.3 业务逻辑层和视图层设计与实现4.3.1 业务逻辑层在4.3节的概要中介绍到用户主要向服务器提交2种信息:搜索关键字和邻页请求。业务逻辑层的关键在于将用户提交的信息处理并生成电商网站的URL,将URL提交给数据爬取层进行数据爬取。系统中负责业务逻辑的类叫做GetItemFromWeb,其成员及简介见表4.4.表4.4 类GetItemFromWeb的成员及简介成员简介HttpServletRequest request存储JSP页面的request对象引用PageInfoData pagedata存储用户请求的页面相关状态信息Public GetItemFromWeb(HttpServletRe quest request1)构造函数private List getFirstPageItemInfoList( )当加载第一页时则调用该方法private List getItemInfoListFromNeighbor ( )用户提交的是邻页请求则调用该方法public List getItemInfoList ( )获取商品项信息列表类GetItemFromWeb的核心是getItemInfoList()方法 ,该方法也是除构造函数外的唯一一个public方法。该方法用来响应用户的请求。它需要分辨出用户的请求是搜索一件商品还是请求某一页面的邻页,具体实现见4.2.3小节。当用户向服务器提交的是邻页请求时,会调用getItemInfoListFromNeighbor ()方法,否则调用getFirstPageItemInfoList()方法。这两个方法分别以搜索和邻页的特定URL结构生成URL然后调用数据爬取层。为了达到相似或相同名称的产品的比较目的,本系统在业务逻辑层使用了字符串相似度计算算法,关于该算法的详细介绍见附录。4.3.2 视图层系统的视图部分由直接面向用户的Web页面实现。系统中一共有两个Web页面:系统主页面和搜索结果页面。下文将从这个方面来详细介绍系统的视图层。(1) 系统主页用户首次访问系统需要先经过主页。主页的效果见图4.7。主页采用了一淘网主页的CSS布局。主页上主要由3部分组成:电商链接、文本框、搜索按钮。搜索框上方有各大电商网站的链接,便于用户快速进入自己想要访问的电商网站。系统主页的功能很简单,页面的核心是一个form表单,该表单在用户点击搜索按钮时负责将用户输入的关键字提交给系统。图4.7 系统主页图4.8 搜索结果页(2) 搜索结果页搜索结果页面由JSP技术生成。页面的效果见图4.8,该页面使用了京东商城加一淘网的CSS布局,所以看起来有京东的风格,也有一淘网的风格。下文将从两方面来详细介绍搜索结果页中的视图生成及其功能逻辑。A. 生成商品视图业务逻辑层将搜索到的信息封装在一个List中,而JSP页面则负责将List中的商品信息遍历出来生成相关视图。JSP页面将每件商品放在一个中。每个中有3个同级的容器,这些容器分别用来显示:商品图片、商品名(商品简介)、商品价格。以某件商品为例,其页面结构见图4.9。系统实现比价的关键在于将京东和亚马逊的商品交替展示,见图4.10。京东、亚马逊和淘宝的商品交替排列是在业务逻辑层获取数据爬取层的信息后处理而成并非JSP页面实现之。系统在抓取到两大商城的商品信息后,会在每件商品的简介(字符串)加一个前缀(京东或亚马逊)表示其出处。可以在图4.10看到,每件商品的文字信息的前部都有其网站出处,并且JSP页面在生成这些文字视图时将其颜色变为红色,这样可以使用户能够一目了然,此外每件商品的价格的视图效果也进行了特殊处理,使其更显眼。图4.9 单件商品HTML结构图4.10 京东亚马逊淘宝商品对比图4.11 分页相关视图在用户提交空的关键字时,JSP页面还要负责处理简单的逻辑操作。系统不可能通过一个空的关键字生成URL并交给数据爬取层进行爬取,所以系统在响应用户的请求时会先判断用户提交的关键字是否为空,为空则提示用户重新输入。B. 生成分页相关视图系统分页机制需要一个对象的支持。在该对象中存储了关键字以及京东、亚马逊和淘宝对于关键字搜索得到的页面数目,以及系统需要响应用户的当前页面的页码。public class PageInfoData public int page; public int jdpage; public int azpage; public int tbpage;public String key; public String key_gbk; public String key_utf8;JSP页面需要做如下步骤:1 声明一个局部变量totalnum用来存储jdpage,azpage和tbpage的总和,totalnum表示商品分页的总数。2 声明一个字符串对象prepage,表示上一页的URL字符串,其
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026及未来5年中国冲压转向卡数据监测研究报告
- 2026事业单位工勤技能-广东-广东护理员二级(技师)历年参考题库含答案详解3套试卷
- 2026事业单位工勤技能-广东-广东仓库管理员三级(高级工)历年参考题库含答案详解3套试卷
- 2026事业单位工勤技能-山西-山西有线广播电视机务员一级(高级技师)历年参考题库含答案详解3套试卷
- 2026事业单位工勤技能-山西-山西仓库管理员三级(高级工)历年参考题库含答案详解3套试卷
- 2026事业单位工勤技能-山东-山东仓库管理员三级(高级工)历年参考题库含答案详解3套试卷
- 2026事业单位工勤技能-宁夏-宁夏不动产测绘员四级(中级工)历年参考题库含答案详解3套试卷
- 2026事业单位工勤技能-四川-四川计量检定工五级(初级工)历年参考题库含答案详解3套试卷
- 2026事业单位工勤技能-吉林-吉林计量检定工二级(技师)历年参考题库含答案详解3套试卷
- 2026事业单位工勤技能-吉林-吉林中式面点师一级(高级技师)历年参考题库含答案详解3套试卷
- 2025高考历史全国I卷真题试卷(含答案)
- 摄影用光基础知识培训课件
- 2025年网格员知识题库及参考答案
- 废旧料存放管理办法
- 东航管理竞聘笔试题及答案
- 学校安保八大件使用培训
- 北师大七年级上册数学各章节知识点总结
- 《研学旅行基地运营与管理》课件-研学基地1.3 现状
- 鼻咽癌护理查房课件
- 项目档案工作交底会记录表
- 《伤寒论》历代名家集注
评论
0/150
提交评论