JAVA京东商城网络爬虫课程报告Word格式.docx
- 文档编号:18452940
- 上传时间:2022-12-16
- 格式:DOCX
- 页数:34
- 大小:1MB
JAVA京东商城网络爬虫课程报告Word格式.docx
《JAVA京东商城网络爬虫课程报告Word格式.docx》由会员分享,可在线阅读,更多相关《JAVA京东商城网络爬虫课程报告Word格式.docx(34页珍藏版)》请在冰豆网上搜索。
广度优先搜索策略的基本思想是:
与初始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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JAVA 商城 网络 爬虫 课程 报告