基于电商平台的商品历史价格查询系统的设计
2019-02-11欧阳瀚
樊 闯,欧阳瀚,黄 薇,李 燕
(武昌理工学院,湖北 武汉430223)
1 系统设计背景
目前网上购物是一种极其普及的消费模式,然而由于网上购物平台的价格具有临时性与变动的不透明性,导致商家与消费者处于信息不对称的位置。商品价格具有时效性,运用爬虫技术可以爬取的特定时间的特定数据并图表化,因此可以借助网络爬虫技术让消费者能够对所购商品的价格变化信息有较好的知情权,并针对爬取的不同时段的价格信息,为客户生成一个方便观察的价格波动走势图,有助于指导用户养成理性消费习惯,该系统同时也节约了用盲目搜索比对商品信息所浪费的大量时间。
1.1 爬虫稳定性需求
一个高可用的代理是爬虫稳定性的保障,因此爬虫的调度程序需要周期性保持稳定更新IP 代理池。为了保证爬虫的可用性,需要合理的监控程序,才能保证爬虫有效运行。文本结构信息是一个不太稳定随时在更改的结构,导致爬虫稳定需要高度依赖人进行维护。人工对程序进行问题排查效率偏低且耗费大量人力,因此良好的模块化异常捕获和及时地发现程序运行的异常是维护爬虫稳定性的关键。
Web 服务大体分为三个模块。分别为用户模块,负责用户的登陆管理、注册;个人信息的管理模块;价格查询模块。在主体的价格查询模块中,可以查询京东商城书籍信息,并且可以对其进行订阅和收藏,订阅的用户可以收到商品价格变动的通知。管理员模块可以实现用户管理及监控爬虫系统。
1.2 网络爬虫模块
网络爬虫系统是为了有效率的获取价格数据,减少人工手动收集的繁琐过程而实现的。其主要模块分为三个模块,一个是主要的对京东数据的爬取模块,包括数据下载和解析功能。二是为京东爬虫进行支持的代理IP 池模块,它负责动态的维护一个可用的IP 池。最后一个是负责对整个爬虫进行调度的调度模块,负责分发任务,定时增量更新数据等调度任务。
1.3 数据库模块
本系统的数据库设计中针对爬取出来的商品的历史价格,将其序列化到一个字段进行存储;用户与商品信息有两个多对多的关系,任意用户可以收藏任意个商品,某个商品也可以被任意多个用户关注收藏,用户和商品是多对多的表关系。
2 系统的设计和实现
系统采用Django 框架进行爬虫模块的设计,通过WSGI(Web Server Gateway Interface)与Web 服务器通信。框架中的ORM 建立起数据模型到关系型数据库的映射,将每个表都映射到一个Python 类对象,每条数据则被映射为一个模型类的实例对象。Template 模块用来输出页面响应,将来自model数据渲染成为网页。当接受到一个URL,控制器根据正则表达式去匹配URLconfs。根据规则将请求分配给对应的视图函数,如果需要调度数据库,视图函数不会直接操作数据库,而是会去操作对应数据模型,数据模型通过ORM 与真实的数据库保持映射关系,数据经过数据模型层处理后,得到的信息经过Template,Template 对数据进行渲染最终生成完整的HTML 页面。
在商品信息相关模块中使用轻量级的Bootstrap 做为前端框架,Django 做为后端框架。搜索关键字通过使用ElasticSearch 倒排索引的数据结构来存储数据,对所有商品名进行中文分词,建立快速搜索索引,可以远快于直接对关系型数据库like 操作符的搜索效率。商品信息图的绘制采用了后台的Plotly 绘图库来渲染绘制HTML 形式的统计图表,再由Django 的Template 将图标并入到网页模版中返回给用户。此方式虽然加大了服务器的压力,但浏览器的加载过程用户体验好。
后端管理员模块使用的是Django 原生的admin APP。该工具简洁快速的实现了对网站数据的修改查阅和更新,同时也能对用户本身的信息进行更新,Django 基于其本身的model 来快速的构建后端管理模块,通过简单的配置就可以自动的生成后端页面,既能方便对数据进行修改,同时也能做到用户级别的后台权限管理。
3 系统的工作流程
网络爬虫的工作流程由代理IP 池模块、商品信息抓取模块、商品价格抓取模块组成。
代理IP 池模块有两类独立的周期性任务,一类爬虫负责周期性的从多个提供免费代理IP 的网站抓取有效的代理IP。爬虫将IP 信息从网页中进行提取,并且对代理IP 进行验证是否生效,将无效的代理IP废弃掉,有效的代理IP 存入Redis 中,并设置时间为一天的生命周期,这些爬虫在每天固定时间进行代理IP 采集。另一类程序则以更频繁的频率对代理IP 池中的代理IP 进行测试,筛掉无效或延迟太久的代理IP,避免主爬虫因为这些无效或者抵消的代理IP 影响爬取速度,同时根据代理IP 的延迟信息对代理IP进行评分,评分信息也会储存在Redis 中,主爬虫可以根据IP 的评分,优先采用优质的代理IP。
商品信息抓取模块的爬虫主要负责增量的抓取商品信息。在避免爬取重复的数据同时也要保证尽可能实时同步到京东商城的商品数据。程序将每次发出HTTP request 的信息保存成为指纹,指纹使用Redis 中的set 类型进行存储,每次爬取网页之前都会进行指纹的计算,如果指纹已经存在于Redis中了,那么该次请求将会直接丢弃,每次请求处理成功会将指纹存于Redis 中。从而实现了商品信息的增量更新。
商品价格抓取模块会周期性的监控数据库中的商品价格信息。由于价格接口有严格的反爬虫策略,需要依赖大量的代理IP 来对价格接口进行访问,该模块的爬虫从商品信息表中获得商品ID,不断添加商品在某个时间点的固定价格。
4 结 语
网络爬虫技术保障了数据来源的稳定可靠,多个爬虫分布式协同工作,爬虫之间使用Redis 作为通信中间件,在Celery 的调度之下,爬虫有序的周期性的被调度。整个系统保持了一个松散的结构,保证了架构设计上的低耦合,同时在Celery 的管理之下整个爬虫系统又保证了爬虫的协同调度。