最近一段时间主要重心在Amazon电商数据分析上,这是一个偏数据分析和可视化的项目。具体来说就是先获取Amazon的商品数据,数据清洗和持久化存储后作为我们自己的数据源。分析模块和可视化模块基于数据进行一系列的操作。

  显然,整个项目中最基本,也是最重要的就是前期数据的获取,本篇文章就是针对数据获取和清洗过程进行一个简单的介绍和总结。

  整个项目我们采用了Python作为开发语言,其中可视化模块基于Django搭建,当然在数据获取,即爬虫模块,我们也是采用了Python作为我们的开发语言。

   对于爬虫模块,因为需求是确定的,并且爬取站点也是固定的——Amazon.com,因此在爬虫模块主要需要考虑的是调度问题、页面解析问题以及流程自动化的问题。

  首先说明一下爬虫的整体架构,一开始我们是采用单机器爬取,启动方式也很简单——命令行启动,但这样带来的问题是显著的,不稳定,需要手动启动任务。之后我们将爬虫部署成服务,对于进入的任务,可能是用户提交的,也可能是我们内部提交的,通过一个提交系统加入到服务队列中,之后爬虫服务检测并启动爬取任务。这样一定程度上解决了不稳定的问题,但随着数据增长,带宽等因素凸显出来,因此,我们又加入一些机器,构建一个小型的爬虫集群来分布式爬取。但这不算是真正意义上的分布式,并没有节点

  具体实现方面我们采用Python的一个开源爬虫框架——Scrapy,该框架提供了基本的调度、页面爬取等功能。我们需要做的是基于该框架设定DOM解析方案和后续数据的处理存储方案,同时基于该框架搭建一个小型的伪分布式爬取系统。

  下面来介绍一下我们在爬虫设计过程需要考虑的几个问题。

  首先页面解析问题,因为JS异步加载的原因,爬虫实际得到的页面DOM元素和我们在浏览器中打开页面得到的DOM元素有点区别,这就不能完全依靠浏览器来定位具体的DOM元素。其次,在访问达到一定次数,特别是并发访问请求达到一定次数后,Amazon会对请求进行封杀,返回Robot Check页面甚至是500 Server Error。针对这种情况,一种解决方案是减少并发请求的数目,根据我们实际测试发现,每秒钟发送的请求如果超过50条会被Amazon返回500 Server Error(可能现在Amazon会不断更新策略),因此我们设置了并发请求数为32,即一秒钟一台机器发送32个请求。对于可能会有Robot Check的情况,这个我们还在探索阶段,因为此类页面出现较少且集中出现在商品信息页面,而该页面由于信息比较固定可以较长时间不更新。目前是加入Proxy作为下载中间件(DownloadMiddleware)。另外考虑到可能因为国内访问过于频繁的话也会导致此类问题的出现,我们目前正在将爬虫迁移到Amazon EC2上,一来比较稳定,另外访问也会比在国内机器上快点。

  其次是调度问题。在单机器单任务的爬虫中不存在这样的问题。但是在多机器多任务中这是一个比较重要的问题,多个任务提交后怎么进行调度,如果有优先级的话是按照优先级来,否则是默认放在任务队列里依次进行。在我们的爬虫系统中,多台机器组成的爬虫系统是由一个调度控制,当一个爬取任务提交后,调度将任务拆分并分发到不同的爬虫机器上,在单个的爬虫机器上,会有一个爬取队列,队列中是分发到该机器上的所有爬取子任务,在目前是默认从队列中依次获取任务,一台机器上能同时启动六个爬取任务进行并行爬取。

  最后是流程的自动化问题。在我们的系统中,需要实现任务提交后,在网站上直接看到处理后的数据以可视化图表展现。这就需要将整个流程实现自动化,提交任务后开始爬取数据,爬取任务完成后对数据进行处理和归并,生成一些统计信息,最终得到规范化的数据并在前端可视化展示。这一系列过程主要分为两个阶段,爬取和处理,爬取阶段任务提交分发后爬虫会启动爬取任务,在爬取完成后,利用Scrapy的接口实现了对爬取任务状态的修改,例如对于一个任务T,启动时在数据库中加入状态,{‘name’: T, ‘jobid’: ‘Task_id’, ‘status’: ‘running’},在爬取完成后,修改状态为 finished,同时,会有定时脚本轮询看数据库中各任务是否完成。如果完成的话,启动数据处理的流程。数据处理完成后归并数据到正式的项目数据库中,完成数据的前端可视化展现。由于本项目部署在Linux服务器上,因此就直接采用了linux下的cronjob来实现了脚本的轮询和执行。简单来说,写入几个crontab后,启动cronjob,这几个脚本串接了上述说的每个流程,使其成为完整的一套流程。

  上述说的是数据爬取过程中的几个主要问题,也是比较重要的问题,说实话,即便是现在的系统,仍然没有完美解决这几个问题,解析依然会遇到Amazon的封杀,自动化的鲁棒性太弱等等。这可能是下一阶段需要考虑的问题,同时,数据爬取存储后依然有不少脏数据(Dirty Data),需要进一步的清洗。

Amazon电商数据分析——数据获取的更多相关文章

  1. [原创]如何利用BI搭建电商数据分析平台

    某电商是某大型服装集团下的重要销售平台.2015 年,该集团品牌价值达数百亿元,产品质量.市场占有率.出口创汇.销售收入连年居全国绒纺行业第一,在中国有终端店3000多家,零售额80 亿.其羊绒制品年 ...

  2. 如何利用BI搭建电商数据分析平台

    某电商是某大型服装集团下的重要销售平台.2015 年,该集团品牌价值达数百亿元,产品质量.市场占有率.出口创汇.销售收入连年居全国绒纺行业第一,在中国有终端店3000多家,零售额80 亿.其羊绒制品年 ...

  3. 基于spark和flink的电商数据分析项目

    目录 业务需求 业务数据源 用户访问Session分析 Session聚合统计 Session分层抽样 Top10热门品类 Top10活跃Session 页面单跳转化率分析 各区域热门商品统计分析 广 ...

  4. 电商打折套路分析 —— Python数据分析练习

    电商打折套路分析 ——2016天猫双十一美妆数据分析 数据简介 此次分析的数据来自于城市数据团对2016年双11天猫数据的采集和整理,原始数据为.xlsx格式 包括update_time/id/tit ...

  5. CRMEB系统就是集客户关系管理+营销电商系统,能够真正帮助企业基于微信公众号、小程序实现会员管理、数据分析,精准营销的电子商务管理系统。可满足企业新零售、批发、分销、等各种业务需求。

    **可以快速二次开发的开源小程序商城系统源码**源码开源地址:https://github.crmeb.net/u/LXT 项目介绍: CRMEB系统就是集客户关系管理+营销电商系统,能够真正帮助企业 ...

  6. mysql-kettle-superset电商可视化数据分析

    1.项目概述 需求 对电商业务中的用户.商品.订单的数据进行分析,观察运营的情况 架构 业务数据库:Mysql:存储最原始的数据 ETL:Kettle 数据仓库:Mysql:存储需要进行分析处理的数据 ...

  7. 谈B2B电商平台与大数据

    数据为王,服务为本——谈B2B电商平台与大数据 2013-06-27 11:10:41 作者:B2B行业资讯 标签:                             大数据           ...

  8. 【Tableau】电商广告投放的地域分析

    分析师的职责是利用处理数据获取信息,提炼规律,帮助企业正确决策业务方向. 所以,一个好的分析师绝不能被数据所困,既要深入业务,理解业务,也要高瞻远瞩,以领导者的思维借助数据分析的辅助做出判断. [结构 ...

  9. 如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成

    阅读目录 前言 建模 实现 结语 一.前言 前面几篇已经实现了一个基本的购买+售价计算的过程,这次再让售价丰满一些,增加一个会员价的概念.会员价在现在的主流电商中,是一个不大常见的模式,其带来的问题是 ...

随机推荐

  1. hdu 4747 Mex (2013 ACM/ICPC Asia Regional Hangzhou Online)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4747 思路: 比赛打得太菜了,不想写....线段树莽一下 实现代码: #include<iost ...

  2. 学习Spring Boot:(十八)Spring Boot 中session共享

    前言 前面我们将 Redis 集成到工程中来了,现在需要用它来做点实事了.这次为了解决分布式系统中的 session 共享的问题,将 session 托管到 Redis. 正文 引入依赖 除了上篇文章 ...

  3. 2019.3.16 noiac的原题模拟赛

    RT,这太谔谔了,我不承认这是模拟赛 但是虽然是搬了三道题,题目本身也还能看,就这么着吧 (怎么机房里就我一道原题都没做过啊 T1 CF24D Broken Robot 比较简单地列出式子之后,我们发 ...

  4. IIS应用程序池相关问题及连接池已满的解决方法

            关于应用程序池 在 IIS 6.0 中,引入了应用程序池,应用程序池是将一个或多个应用程序链接到一个或多个工作进程集合的配置.因为应用程序池中的应用程序与其他应用程序被工作进程边界分隔 ...

  5. Oracle表字段类型更改的一个经验

    先前表中ID字段类型是用序列,由于安全问题,需要处理水平权限的漏洞,虽然使用加密也可以处理,为了更方便,需要将字段类型改为Guid,如果表中已经有数据,更改起来不是很方便,对于基础数据表,这里提供一个 ...

  6. mes平台的一些方法

    1.打开的一个缓存的页面的代码 $.openPane({ "width":"1500px",     "height":"1000 ...

  7. 14.会场安排问题(L4)

    时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 学校的小礼堂每天都会有许多活动,有时间这些活动的计划时间会发生冲突,需要选择出一些活动进行举办.小刘的工作就是安排学校 ...

  8. RabbitMQ之集群搭建

    1.RabbitMQ集群模式RabbitMQ集群中节点包括内存节点(RAM).磁盘节点(Disk,消息持久化),集群中至少有一个Disk节点. 2.普通模式(默认)        对于普通模式,集群中 ...

  9. 使用Python的turtle(海龟)模块画图

    第一步:让Python引入turtle模块,引入模块就是告诉Python你想要用它. import turtle 第二步:创建画布.调用turtle中的Pen函数 t = turtle.Pen() 第 ...

  10. saltstack主机管理项目【day39】:主机管理项目开发

    项目目标 salt state.apply -h "ubuntu,centos" -g "ubuntu,centos" -f "ubuntu,cent ...