[个人项目]电商价格监控——项目介绍和架构演变

前言

文章介绍并整理了一直在维护的一个小项目:京东价格监控,并详细整理了该项目前前后后几次重构的技术选型,作为一篇总结。

网站介绍

在京东购物时,你是否遇到如下情况:

  • 心仪的商品降价了,你却一无所知,等发现后早已断货。
  • 你设置了京东自带的降价提醒,结果在降价后很久才收到邮件提醒或者干脆没有提醒,错失抢购良机。
  • 网上各种折扣信息,各种折扣网站,却总是不能选择关注指定商品
  • 想买手机/电脑/耳机等类别商品,想知道整个京东上手机/电脑/耳机类目实时折扣力度最大的商品。

现在,一个基于python爬虫的实时价格监控网站上线了,你要做的仅仅是打开浏览器,输入:

pricemonitor.online
image.png
image.png
image.png

网站功能

一:自定义商品监控

设置商品ID(京东商品编号)和您的预期价格,当商品价格【低于】设定的预期价格后自动发送邮件提醒用户。

二:品类商品订阅

用户订阅某品类后(例如数码大类),该类所有商品中降价幅度大于7折的【自营商品】会被选出并发送邮件提醒用户。

网站架构演变

小白期:Flask+HTML模板+Python脚本

2017年,我当时入门Python语言,学着一步步写网页爬虫,后来接触到了Python后台开发,之后便萌生了做一个与爬虫结合的前后端项目作为练手,最后想到的就是电商商品的爬取。

但是,就算在几年前,信息整合的网站就已经非常多了。国内的商品优惠信息整合网站大多是以什么值得买、惠惠购物助手等信息流推荐+商品历史价格查看这种方式运营。想要做到有自己的特色,就必须做点不一样的。

于是我决定将爬虫作为监控手段,监控商品的实时价格。

实际上,拿京东举例,京东在当时就已经有了自己的降价提醒,但实际效果并不好,主要问题出在时效性上。用自营商品设置价格提醒后,在京东秒杀时不提醒,在正常显示价格调整后往往在3.4个小时后才能收到提醒邮件。

于是,我从单个商品的监控下手,开始了这个小项目(与其说是项目,不如说仅仅是一个小脚本)。

网站需求很简单,整个一代目架构总结如下:

image

爬虫组件:就是个简单的Python脚本,加上了定时循环。

数据库:采用了最轻量的Sqlite,不需要客户端和服务,单文件保存。

Web端:后台我采用了网上推荐的Flask,前端只套用了HTML模板。
Flask中,涉及到使用Flask-Admin,Flask-Login,Flask-SQLAlchemy,Flask-WTF等组件,搭建了用户注册登录系统。

爬虫开源:https://github.com/qqxx6661/Price-monitor

Flask+HTML开源:https://github.com/qqxx6661/flask_yzd

从现在的眼光来看,相比于Python中的Django,我认为Flask对于新上手后台的小白来说,并不能称得上是很好的入门框架。至于我为什么这么认为,这就涉及到Flask和Django的区别了,我摘抄一段答案在这里:

Flask

  • Flask与关系型数据库的配合使用不弱于Django,而其与NoSQL数据库的配合远远优于Django
  • 自由、灵活,可扩展性强,开发时可以结合自己最喜欢用的第三方库
  • 适用于小型网站
  • 适用于开发web服务的API
  • 开发大型网站无压力,但代码架构需要自己设计
  • 各方面性能均等于或优于Django
  • Flask比Django更加Pythonic,与Python的philosophy更加吻合

Django

  • 太重了,灵活和自由度不够高
  • Django能开发小应用,但总会有“杀鸡焉用牛刀”的感觉
  • Django自带的Admin好评如潮
  • Django的自带ORM非常优秀
  • Django自带的模板引擎
  • Django自带ORM也使Django与关系型数据库耦合度过高,如果想使用MongoDB等NoSQL数据,需要选取合适的第三方库
  • Django非常适合企业级网站的开发:快速、靠谱、稳定
  • Django上手也比较容易,开发文档详细、完善,相关资料丰富
  • Django目前支持Jinja等非官方模板引擎

我认为对于小白来说,可以先熟悉Django,我觉得:

  • Flask其实和Spring(或者说Springboot)有异曲同工之妙,两者依靠官方的第一方库和网络上的第三方库,来构建一个完整的系统。对于新手来说,跟着教程上手,很容易在各种库的组装中迷失了自己,各种兼容冲突,各种版本匹配,都会让新手摸不到头脑。我也深受其害,两个月之后我再拾起代码,对于之前是如何将各个库进行整合的,忘得一干二净。
  • Django虽然重,但胜在能让小白对各个系统(管理后台,用户系统,登录注册,邮箱验证,数据库ORM等)都有直观且实际的概念,知道各个系统在一个web项目中应该发挥的作用。

如果让我推荐纯小白开始学Python后台开发,我会建议他从Django开始,在深入去了解Flask。

说回我的网站,网站初步上线后,我在自己的博客上还有Github上做了些宣传。陆续每天都有几个人来访问我的网站,也有在Github上提Issue提建议的。不得不说,正是这些小事让我看到了项目的活力,让我也拥有了更大的编码热情。

[图片上传失败...(image-1a2f0b-1545911281129)]

但由于学校的科研任务紧,这个项目在搭建好后,就进入了漫长的维护阶段,在这个阶段中,除了几次爬虫规则的重新设计外,并没有其他业务上的改进。

过渡期:Django+Bootstrap+Scrapy爬虫框架+代理池

大概半年后,我重新拾了起来,此时已经有一百多个注册用户了,虽然每天的使用率并不高,但是也足够让我满足了。本着学习技术的想法,我开始重构网站。

当时流行的比价插件(购物党/惠惠比价)已经开始做商品的价格监控了,并且他们做的是浏览器插件,完美嵌入浏览器,更方便用户使用,我的价格监控还需要独立的网站进行商品登记,显然已经out了。在这期间,我也萌生了品类监控的想法。

这一时期的主要改动有:

  • 从Flask转为Django,前端使用Bootstrap代替原生HTML模板
  • 采用Scrapy分布式爬虫框架爬取整个品类的商品
  • 采用代理池提高整体采集效率

整个二代目架构总结如下:

image

爬虫组件:从单一的Python脚本改为Scrapy框架爬取。

数据库:使用Mysql作为商品和用户数据库

Web端:Django,Django大而全,使用到了Django自带的后台管理,数据库ORM,登录验证,Session,邮件等子模块

image.png
image.png

稳定期:Springboot+React+Scrapy爬虫框架+代理池+任务队列

18年的秋招,对我来说试一次一场难忘的经历,详情可以看我的秋招文章。秋招我主要是寻找Java后台开发的工作,所以钻研了一段时间的Spring,加之之前的实习经历,开发过实际的SSM项目,对于后台开发,尤其是web后台开发有了更加深刻和广阔的认识,。于是,我打算对电商监控网站进行第三次重构,当然,这次的重点主要是用Spring全家桶替代Django。

此外,为了应用前后台分离思想,我找了一个帅哥同学帮我写React前端,整个项目一下子就有模有样起来。

这一时期的主要改动有:

  • 使用Springboot代替Django作为后台,向前端提供API
  • 使用React作为前端,接受JSON数据
  • 改用任务队列发送邮件
  • 代理池支持免费代理,收费代理
  • 免费代理使用Github明星开源项目:https://github.com/jhao104/proxy_pool

整个三代目架构总结如下:

image
  • web网站:Springboot提供接口+React前端页面

    • Springboot(Api)+ Mysql(用户数据)+ React(前端)
    • 表结构设计、Mybaits、Swagger2、Spring Security + JWT、Spring Cache、跨域、数据库定时备份
  • 爬虫:Scrapy分布式爬虫框架

    • Requests/Selenium(爬取)、Mysql(商品信息)、Scrapy + Redis(分布式爬虫)
    • 反爬策略、IP代理、Scrapy自定义中间件、Headless Chrome网页渲染
  • 监控:Python脚本+Celery任务队列

    • Supervisor(守护进程)、Crontab(定时监控脚本)、Celery任务队列(提醒邮件)

未来

这个项目有很多的不足,我也一边编码一边总结。

现在我的TODO List:

  • Docker化各个模块
    -全局搜索
  • QQ微信登录
  • 价格曲线
  • 推广链接
  • 添加更多商品
  • ...

时至今日,这个项目的两个功能可能都能找到更好的替代产品,毕竟一个人的精力有限,无法将所有想法都体现在程序上。但是这个项目我还会坚持下去,它已经成为了我技术的试验田,也成为了我继续学习的动力。

关注我

我的Csdn:

http://blog.csdn.net/qqxx6661

我的知乎:

https://www.zhihu.com/people/yang-zhen-dong-1/

我的简书:

https://www.jianshu.com/u/b5f225ca2376

我的个人公众号:Rude3Knife

image
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容