JAVA京东商城网络爬虫课程报告.docx

上传人:b****4 文档编号:5465441 上传时间:2022-12-16 格式:DOCX 页数:34 大小:1MB
下载 相关 举报
JAVA京东商城网络爬虫课程报告.docx_第1页
第1页 / 共34页
JAVA京东商城网络爬虫课程报告.docx_第2页
第2页 / 共34页
JAVA京东商城网络爬虫课程报告.docx_第3页
第3页 / 共34页
JAVA京东商城网络爬虫课程报告.docx_第4页
第4页 / 共34页
JAVA京东商城网络爬虫课程报告.docx_第5页
第5页 / 共34页
点击查看更多>>
下载资源
资源描述

JAVA京东商城网络爬虫课程报告.docx

《JAVA京东商城网络爬虫课程报告.docx》由会员分享,可在线阅读,更多相关《JAVA京东商城网络爬虫课程报告.docx(34页珍藏版)》请在冰豆网上搜索。

JAVA京东商城网络爬虫课程报告.docx

JAVA京东商城网络爬虫课程报告

 

重庆邮电大学研究生堂下考试答卷

 

2014-2015学年第1学期

考试科目面向对象程序设计

姓名

年级2014级

专业计算机科学与技术

 

2014年12月23日

 

《面向对象程序设计》课程报告

学号:

姓名:

学院:

计算机科学与技术学院

题目

京东商城商品信息爬虫程序

近年来,电子商务大热,在网上购物的用户越来越多,与此同时越来越多的问题表现出来,如何让用户不用花大量的时间找到最便宜的商品成为改善用户体验的关键点之一。

本文就实现了一个基于京东商城的商品信息爬虫程序,将京东商城上所有的商品的种类、名称、价格等信息爬取下来存储在文件系统中,并提供给数据分析部门进行进一步分析,挑选出不同购物网站上相同的商品之间谁的价格最低,从而提供给用户参考。

网络爬虫作为获取互联网数据的一个重要途径,在大数据时代发挥着越来越重要的作用,大到搜索引擎的实现,小到单个网站的数据收集都离不开网络爬虫。

当前主流的搜索企业主要采用分布式爬虫架构,通过服务器集群同时运行多个爬虫程序,并将爬到的数据放到DFS上,再使用批处理的Map-reduce、基于内存计算的Spark或者流处理的Storm等分布式计算模型对数据处理,从而对用户提供延时或实时的数据处理服务。

本系统使用JAVA语言设计了一个基于广度优先和最佳优先结合算法的京东商城商品信息垂直抓取的多线程爬虫程序,对url队列进行优先级排序,去重,并将之存储在基于内存可持久化的日志型、Key-Value数据库redis中,然后通过url解析网页获取商品的分类、名称、价格信息,并将爬虫运行的产生的数据和日志信息保存在文件中,大大提高了爬虫的效率。

系统代码结构通过Maven进行构造,使用Junit通过测试驱动开发的模式进行系统开发。

1.系统说明

网络爬虫所采用的主流的网页搜索策略主要有3种,即:

深度优先、广度优先、最佳优先。

深度优先搜索是在网络爬虫开发使用中比较多的方法。

深度优先搜索沿着网页文件上的超级链接走到底为止,形成一条完整的访问链,然后返回到开始网页文件,再继续选择此文件中的其他超级链接。

当不再有其他超级链接可选择时,说明搜索已经结束。

深度优先搜索方式的优点是能遍历完全Web站点深层嵌套的文档集合。

缺点是假如Web结构相当深,有可能造成爬虫程序深陷在某一Web站点。

广度优先搜索策略的基本思想是:

与初始URL在一定距离内的网页重要性较高,因此可以从起始网页开始,先搜索完一个Web页面中所有的超级链接,然后再继续搜索下一层,直到底层为止。

这样做的优点是保证了对浅层Web页面的优先处理。

但是缺点是如果要遍历一个指定的站点的页面集,用宽度优先搜索策略则需要花费较长时间。

最佳优先搜索策略按照一定的网页估值算法,预测候选URL与目标网页的相似度权值,选取其中权值最高的一个或几个URL进行抓取。

在Web页面抓取方面,本系统采用了开源的HtmlCleaner和HtmlParser包对商品页面进行解析获取需求数据。

2.1功能需求

本系统具有以下功能:

爬虫能通过一个种子URL地址,爬取一个Web页面下的所有超链接,并将这些URL依次入对列,采用广度优先的方式解析所有页面。

在使用广度优先算法的同时可以根据网页URL的特点进行优先级分类,如果一个URL是以

爬虫支持多线程并发运行,提高爬行效率。

爬虫有URL去重功能,在URL入队时,判断是否重复,如果重复则拒绝入队。

爬虫能够规避由于爬取过于频繁而被京东封IP禁止访问的问题。

爬虫能够解析Web页面,得到商品分类、名称、价格等信息。

能将爬取下来的商品信息保存在文件中。

⑧能将爬取过程中的一些信息,如爬取时间,爬取URL,爬取耗时,爬取是否成功等信息保存在日志文件中。

2.2非功能需求

2.2.1性能需求

一方面,爬虫系统需要采集大量商品数据,由于有大量的IO操作,所以对数据采集和数据存取性能要求较高。

主要表现在爬虫的爬行效率和对URL队列的存取上,本文使用了多线程的方式在IO操作的同时能够爬取和解析Web页面,从而提高爬行效率,并选取了相对mysql存取速度更快的基于内存的key-value类数据库redis对大量的url进行存取。

另一方面,由于京东商城对访问过于频繁的ip地址会封其ip禁止访问,本文利用了线程sleep的方式解决了这个问题。

2.2.2安全性需求

由于爬虫系统的记录的数据会非常大,而且存放时间周期会比较长,所以在对这些数据导入和查询时要保证速度。

在数据导入过程中又要保证事务的完整性。

对于整个系统,需要完整的权限控制,防止某些人恶意的攻击系统,修改原始记录。

同时对于数据库中的数据需要定时备份,防止系统数据丢失。

3.1系统概要设计

3.1.1系统功能描述

该系统的主要功能有:

解析一个Web页面中的所有超链接URL并存放至队列;解析商品页面中的商品分类、名称、价格;将商品信息和爬取日志保存在文件系统中。

3.1.2系统层次模块图

图3-1系统层次模块图

3.1.3总体时序图

图3-2总体时序图

3.2系统详细设计

3.2.1系统功能模块设计

表3.1系统模块设计

模块名称

输入项

输出项

功能描述

download

页面url

Page对象

获取页面html代码

duplicatable

页面url

判断队列中的url是否重复

process

Page对象

解析页面的所有url和商品信息

repository

页面url

url队列

存储要处理的所有url

store

商品信息字符串

将商品信息保存在文件中

utils

工具类,用于解析Web页面的超链接url和商品页面的商品信息

spider

统筹程序运行

3.2.2各子功能模块分析

(1)download模块:

根据url通过http请求下载页面html代码,并初始化一个Page对象,将html赋值给Page对象的rawHtml属性。

模块类图:

图3-3download模块类图

重要类和接口描述:

Downloadable接口

表3.2Downloadable接口

接口或类名

Downloadableinterface

功能描述

定义了一个用于获取指定url页面的html代码接口

主要方法描述

download:

抽象方法,获取指定url页面的html代码。

涉及数据

url:

需要下载的url地址。

备注

②HttpClientDownload类

表3.3HttpClientDownload类

接口或类名

HttpClientDownloadclass

功能描述

继承于Downloadable接口,实现了download方法。

用于获取指定url页面的html代码。

主要方法描述

1.download:

调用excute方法获取指定url页面的html代码,并初始化一个Page对象,将html赋值给Page对象的rawHtml属性。

2.excute:

利用httpclient类,通过指定的url返回该页面的html代码。

涉及数据

url:

需要下载的url地址。

Logger:

日志类。

备注

(2)duplicatable模块:

判重模块,用于在url入队时判断是否原来解析过这个url。

模块类图:

图3-4duplicatable模块类图

重要类和接口描述:

Duplicatable接口

表3.4Duplicatable接口

接口或类名

Downloadableinterface

功能描述

定义了一个判重,用于在url入队时判断是否原来解析过这个url的接口。

主要方法描述

1.add:

抽象方法,将url压入判重存储结构。

2.is:

抽象方法,判断即将压入的url是否和原先的某一个url重复。

涉及数据

url:

url地址。

备注

②BloomFilterDuplicatable实现类

表3.5BloomFilterDuplicatable类

接口或类名

BloomFilterDuplicatableclass

功能描述

实现了Duplicatable的类,使用google的布隆过滤器来对url进行存储和判重,布隆过滤器占用内存小,且查找速度快。

主要方法描述

1.add:

将url压入bloomfilter。

2.is:

判断即将压入的url是否和bloomfilter中的某一个url重复。

涉及数据

url:

url地址。

Bloomfilter:

布隆过滤器。

备注

③HashSetDuplicatable实现类

表3.6HashSetDuplicatable类

接口或类名

HashSetDuplicatableclass

功能描述

实现了Duplicatable的类,使用hashset作为url的存储结构

主要方法描述

1.add:

将url压入判重hashset

2.is:

判断即将压入hashset的url是否和原先的某一个url重复

涉及数据

duplicatable:

用于存储解析过的url的集合

url:

url地址。

备注

④RedisDuplicatable实现类

表3.7RedisDuplicatable类

接口或类名

RedisDuplicatableclass

功能描述

实现了Duplicatable的类,使用基于内存的key-value数据库redis作为url的存储。

主要方法描述

1.add:

将url压入redis

2.is:

判断即将压入redis的url是否和原先的某一个url重复

涉及数据

redisUtil:

对redis进行操作的工具类

url:

url地址。

备注

(3)Process模块:

解析Web页面模块,解析一个Web页面中所有超链接url以及商品页面中商品的分类、名称、价格信息。

模块类图:

图3-5process模块类图

重要类和接口描述:

Processable接口

表3.8Processable接口

接口或类名

Processableinterface

功能描述

定义了一个解析Web页面中所有超链接url以及商品页面中商品的信息的接口。

主要方法描述

process:

抽象方法,解析一个页面中所有超链接url以及商品页面中商品的信息

涉及数据

Page:

Page类

备注

②Jdprocess实现类

表3.9Jdprocess类

接口或类名

Jdprocessclass

功能描述

Processable的实现类,用于解析一个京东商城页面中所有超链接url以及商品页面中商品的信息。

主要方法描述

1.parseProduct:

解析商品页面该商品的分类、名称、价格。

2.process:

解析一个页面中所有超链接url,并调用本类的parseProduct方法解析商品的信息

涉及数据

Page:

Page类

备注

(4)Repository模块:

用于将process模块中获取的urls根据url特点判断是否是以

模块类图:

图3-6respository模块类图

重要类和接口描述:

Repository接口

表3.10Repository接口

接口或类名

Repositoryinterface

功能描述

定义了用于分析url,并根据分析结果将url压入高优先级链表或低优先级队列的接口

主要方法描述

1.poll:

抽象方法,调用add方法和addHigh将url压入队列

2.add:

抽象方法,将url压入低优先级队列

3.addHigh:

抽象方法,将url压入高优先级队列

涉及数据

nextUrl:

下一个要压入的url

备注

②RedisRepository实现类

表3.11RedisRepository类

接口或类名

RedisRepositoryclass

功能描述

实现了接口Repository,通过key-value数据库redis保存需要解析的url

主要方法描述

1.poll:

调用add方法和addHigh将url存入键值为highPriority或lowPriority的map中

2.add:

将url存入lowPriority

3.addHigh:

将url存入highPriorit

涉及数据

highKey:

高优先级key键

lowKey:

低优先级键

nextUrl:

下一个要压入的url

备注

③MemoryRepository实现类

表3.12MemoryRepository类

接口或类名

MemoryRepositoryclass

功能描述

实现了接口Repository,通过内存保存需要解析的url

主要方法描述

1.poll:

调用add方法和addHigh将url存入highPriority或lowPriority的内存链表中中

2.add:

抽象方法,将url存入lowPriority链表

3.addHigh:

抽象方法,将url存入highPriorit链表

涉及数据

highPriority:

高优先级队列

lowPriority:

低优先级队列

nextUrl:

下一个要压入的url

备注

(5)Store模块:

将解析Web页面得到的商品信息持久化。

模块类图:

图3-7store模块类图

重要类和接口描述:

Storable接口

表3.13Storable接口

接口或类名

Storableinterface

功能描述

定义了一个用于将解析页面得到的商品信息进行持久化的接口

主要方法描述

store:

抽象方法,存储商品信息

涉及数据

Page:

Page类

备注

②FileStore实现类

表3.14FileStore类

接口或类名

FileStoreclass

功能描述

Storable的实现类,将商品信息持久化到文件中

主要方法描述

1.store:

存储商品信息到指定文件中

2.FileStore:

FileStore的构造方法,根据basePath参数调用checkExist方法判断该文件是否存在,创建文件

3.CheckExsit:

判断一个文件路径是否存在

4.fileName:

用当前日期为文件命名,在store方法中被调用

涉及数据

Page:

Page类

basePath:

文件路径参数,默认为当前路径

备注

(6)utils模块:

构造了一些用于解析html页面、构造json、操作redis、通过js获取商品价格、线程配置的工具类。

重要类和接口描述:

HtmlXParser类

表3.15HtmlXParser类

接口或类名

HtmlXParserclass

功能描述

解析Web页面

主要方法描述

select:

解析页面中含有指定标签的值,在process模块中被调用

getAttributeByName:

解析页面中含有指定属性的标签的值,在process模块中被调用

涉及数据

htmlCleaner:

引入第三方jar包,定义了一个htmlCleaner对象

tagNodes:

用于保存标签数组

rawHtml:

解析页面的html代码

备注

②JSONUtils类

表3.15JSONUtils类

接口或类名

JSONUtilsclass

功能描述

用于json类型和string类型进行互转的类。

由于商品价格是通过js动态生成的,在商品页面中解析不到,必须再另外访问商品的价格url,该页面是json格式的,所有使用此类将json类型转换成String类型

主要方法描述

1.parseFromUrl:

获取指定url的json代码,并返回String类型

2.parseJSONArrayIndex0:

获取json类型字符串中键为key的值

3.parseMap:

将map的键值对封装成json类的字符串

涉及数据

Mapvalues:

存储商品信息的map类键值对

备注

③RedisUtil类

表3.16RedisUtil类

接口或类名

RedisUtilclass

功能描述

用于对redis进行存储操作的类

主要方法描述

1.getResult

2.Rpush

3.Lpop

4.Llen

5.Sismember

6.sadd

涉及数据

Key,value

备注

(7)其他重要类:

Spider类

表3.17Spider类

接口或类名

Spiderclass

功能描述

该系统最重要的类,调用其他类方法完成商品信息的爬取和存储

主要方法描述

1.download:

调用downloadable接口的download方法进行页面html代码下载

2.process:

调用processable的process方法解析html

4.store:

调用storable的store方法存储解析后的商品信息

5.initComponent:

初始化运行环境

6.检查运行时环境是否齐备

7.start:

启动线程池,程序运行入口

涉及数据

logger、config、downloadable、processable、storable、repository、duplicatable、threadPool

备注

②FixedThreadPool类

表3.18FixedThreadPool类

接口或类名

FixThreadPoolclass

功能描述

用于实现多线程的类

主要方法描述

1.run:

定义每个线程的入口

涉及数据

newFixedThreadPool

runanble

备注

③Page类

表3.19Page类

接口或类名

Pageclass

功能描述

Web页面类,成员变量包括该页面的html、url、所有超链接url以及该页面上所包含的商品信息

主要方法描述

ValueToJSON:

调用了JSONUtils的parseMap方法将商品信息转换为Json类的字符串

涉及数据

url、rawHtml、values、targetUrls

4.1spider类实现

publicclassSpider{

finalLoggerlogger=LoggerFactory.getLogger(getClass());

privateConfigconfig=newConfig();

privateDownloadabledownloadable=newHttpClientDownload();

privateProcessableprocessable;

privateStorablestorable=newConsoleStore();

privateRepositoryrepository=newMemoryRepository();

privateDuplicatableduplicatable=newHashSetDuplicatable();

privateThreadPoolthreadPool;

/**

*启动爬虫

*/

publicvoidstart(){

check();

initComponent();

while(!

Thread.currentThread().isInterrupted()){

//取出目标url

finalStringurl=repository.poll();

if(url==null){

//TODO如果为空,则等待

}else{

threadPool.run(

newRunnable(){

publicvoidrun(){

//下载

finalPagepage=Spider.this.download(url);

//解析

Spider.this.process(page);

//把目标url放到队列中

for(StringnextUrl:

page.getTargetUrls()){

if(duplicatable.is(nextUrl)){

continue;

}

duplicatable.add(nextUrl);

//if(nextUrl.startsWith("{

if(nextUrl.startsWith("{

repository.addHigh(nextUrl);

}else{

repository.add(nextUrl);

}

}

//导出

Spider.this.store(page);

}

});

SleepUtil.sleep(config.getExecuteSleep());

}

}

}

privatevoidinitComponent(){

threadPool=newFixedThreadPool(this.getConfig().getThreadPoolSize());

logger.info("=====================================================");

logger.info("downloadable是{}",getDownloadable().getClass().getName());

logger.info("processable是{}",getProcessable().getClass().getName());

logger.info("storable是{}",getProcessable().getClass().getName());

lo

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1