JAVA京东商城网络爬虫课程报告文档格式.docx

上传人:b****6 文档编号:8327640 上传时间:2023-05-11 格式: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_第6页
第6页 / 共34页
JAVA京东商城网络爬虫课程报告文档格式.docx_第7页
第7页 / 共34页
JAVA京东商城网络爬虫课程报告文档格式.docx_第8页
第8页 / 共34页
JAVA京东商城网络爬虫课程报告文档格式.docx_第9页
第9页 / 共34页
JAVA京东商城网络爬虫课程报告文档格式.docx_第10页
第10页 / 共34页
JAVA京东商城网络爬虫课程报告文档格式.docx_第11页
第11页 / 共34页
JAVA京东商城网络爬虫课程报告文档格式.docx_第12页
第12页 / 共34页
JAVA京东商城网络爬虫课程报告文档格式.docx_第13页
第13页 / 共34页
JAVA京东商城网络爬虫课程报告文档格式.docx_第14页
第14页 / 共34页
JAVA京东商城网络爬虫课程报告文档格式.docx_第15页
第15页 / 共34页
JAVA京东商城网络爬虫课程报告文档格式.docx_第16页
第16页 / 共34页
JAVA京东商城网络爬虫课程报告文档格式.docx_第17页
第17页 / 共34页
JAVA京东商城网络爬虫课程报告文档格式.docx_第18页
第18页 / 共34页
JAVA京东商城网络爬虫课程报告文档格式.docx_第19页
第19页 / 共34页
JAVA京东商城网络爬虫课程报告文档格式.docx_第20页
第20页 / 共34页
亲,该文档总共34页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

JAVA京东商城网络爬虫课程报告文档格式.docx

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

JAVA京东商城网络爬虫课程报告文档格式.docx

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

与初始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是否重复

process

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

repository

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代码。

Logger:

日志类。

(2)duplicatable模块:

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

图3-4duplicatable模块类图

Duplicatable接口

表3.4Duplicatable接口

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

1.add:

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

2.is:

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

url地址。

②BloomFilterDuplicatable实现类

表3.5BloomFilterDuplicatable类

BloomFilterDuplicatableclass

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

将url压入bloomfilter。

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

Bloomfilter:

布隆过滤器。

③HashSetDuplicatable实现类

表3.6HashSetDuplicatable类

HashSetDuplicatableclass

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

将url压入判重hashset

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

duplicatable:

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

④RedisDuplicatable实现类

表3.7RedisDuplicatable类

RedisDuplicatableclass

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

将url压入redis

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

redisUtil:

对redis进行操作的工具类

(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方法解析商品的信息

(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

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

将url存入lowPriority

将url存入highPriorit

highKey:

高优先级key键

lowKey:

低优先级键

③MemoryRepository实现类

表3.12MemoryRepository类

MemoryRepositoryclass

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

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

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

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

highPriority:

高优先级队列

lowPriority:

低优先级队列

(5)Store模块:

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

图3-7store模块类图

Storable接口

表3.13Storable接口

Storableinterface

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

store:

抽象方法,存储商品信息

②FileStore实现类

表3.14FileStore类

FileStoreclass

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

1.store:

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

2.FileStore:

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

3.CheckExsit:

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

4.fileName:

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

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类的字符串

Map<

String,String>

values:

存储商品信息的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

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

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

调用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("

====================================================="

);

downloadable是{}"

getDownloadable().getClass().getName());

processable是{}"

getProcessable().getClass().getName());

storable是{}"

lo

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

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2