基于JAVA的京东商品分布式爬虫系统的设计与实现
2018-02-26曹根源董斌智
曹根源 董斌智
摘要
数据科学正在改变着人们的生活从百度搜索推荐到今天网上的推荐资讯。对数据科学的构建,数据来源则是千里行之始。本文介绍用JAVA结合分布式技术实现的一个高效爬虫系统,希望能为数据研究者垒好数据高楼的基石。
【关键词】数据分析 爬虫 分布式
1 引言
京东是一家电商平台,本文通过爬虫技术获取相关商品信息。JAVA是一门具备数据处理能力和并发多线程机制的成熟語言。本文通过爬虫系统获取商品信息,将数据保存到本地数据库,最后进行数据分析。本系统可快速获取商品信息,使用户快速寻找心仪商品。分布式的技术也可供企业进行大规模数据爬取使用。
2 分布式爬虫系统设计
2.1 设计需求
主要解决问题:
2.1.1 数据获取和异常处理
通过URL爬取商品ID;分析页面源码,提取所需信息;建立数据字典并将数据存入数据库。当某ID没有爬取到时使用查错机制。
2.1.2 分布式通信和多线程技术
前者用Socket实现;后者使用Java线程池。
2.1.3 可复用技术和内存优化
前者用心跳检查机制,释放失效主机;后者采用数据库去重。
2.1.4 负载均衡
检测每台主机的性能,分发合适的任务。
2.1.5 反爬应对和数据库优化
前者使用cookies替换、IP代理等手段。后者采用水平划分将ID独立成表,为数据库添加索引等。
2.2 相关JAVA模块
2.2.1 网址管理
实现网址管理的方法有以下2类;
(1)JAVA内存:分析网站结构,减少重复URL的爬取。采用排队机制,减少内存开销。
(2)数据库存储和URL去重:前者采用数据库去重。后者使用HashSet等进行去重。
2.2.2 分布式通信
分布式通信是爬虫的主要模块。
(1)Socket:采用JAVA的Socket包,让客户机在同一局域网内基于TCP进行通信。
(2)负载均衡:每次通信时检测客户机状态,根据LoadBalance算法计算出分配任务月巨。
(3)连接池和线程池:前者使用HttpClient连接池;后者用线程池管理线程,重用已完成任务的线程资源。
2.2.3 网页信息解析
(1)手动解析:使用正则进行字符串提取。
(2)自动解析:XPath、BeautifulSoup。
2.2.4 反爬解决
查看网站是否需要验证码登录,在爬取过程中检测是否出现超时爬取等问题,制定相应解决反爬方案。
2.2.5 数据导出
将数据存储于MySQL数据库,在BDP平台上进行数据分析。
3 实验设计
通过对京东商品分类页面进行抓取。代码由1个主函数和4个功能函数构成。
3.1 总商品数据URL请求函数(requestUrl)
分析网站结构,用requestUrl函数请求商品数据页面并将其存入Hash队列进行去重处理。
3.2 负载均衡函数(LoadingBalance)
由客户机向任务分发服务器提出请求,负载均衡函数检测客户机性能,并将结果反馈给分发任务服务器,分发任务服务器根据反馈信息将任务合理分配给请求任务的客户机。
3.3 分析函数(Analying)和插入数据库函数(InsertSQL)
客户机获取任务后根据商品网页结构用分析函数(Analying)创建线程池和连接池向目标URL获取数据后,通过插入数据库函数(LnsertSQL)将数据插入数据库。
3.4 主函数
设置任务服务器和客户机的端口号以及IP地址,先启动任务服务器,再启动客户机。
4 实验结果
实验中,共使用了分发任务服务器(PC机)一台,客户机(PC机)3台,1小时内爬取商品数据80余万条。运行结果如图1所示。
5 结语
文章分析了分布式爬虫获取商品数据的细节实现,对京东商城实现了高效爬取。同时介绍了解决反爬策略的基本思路。分布式技术的运用,使得爬虫系统性能得到飞速提升。总的来说,分布式爬虫具有较高的应用价值,对后期的数据分析具有重要意义。
参考文献
[1]王桂梅.主题网络爬虫关键技术研究[D].哈尔滨工业大学,2009.