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