最近一段时间主要重心在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. Several ports (8005, 8080, 8009) required by Tomcat

    转载:http://blog.csdn.net/tomoto_zh/article/details/51931945 先找到Java项目中  Servers找到Server.xml然后 把8005, ...

  2. 【CXF】- 拦截器 Interceptor

    CXF拦截器 拦截动态操作请求和响应数据 拦截器分类 位置:服务器端拦截器,客户端拦截器 消息方向:入拦截器 出拦截器 定义者:系统拦截器 自定义拦截器:LoggingInInteceptor ①:创 ...

  3. 【转】安全加密(一):这些MCU加密方法你都知道吗?

    本文导读 随着物联网和边缘计算的出现,五花八门的MCU也被应用其中,如何保证我们的程序安全和知识产权不受侵犯呢,本文我们将对主流MCU的程序加密进行讲解,希望能够帮助你选择最适合自己应用的微处理器. ...

  4. java Integer.valueOf 和 Integer.parseInt 和 new Integer区别及注意事项

    先看一下下面的结果 1.System.out.println(127==127); //true , int type compare 2.System.out.println(128==128); ...

  5. 伤不起:File.toPath() & Paths.get()

    java.nio.file.Path这个类应该是从java7才开始有的. 通过File类有两个方法可以转换成Path. 1. Path p = Paths.get(file.toURI());  // ...

  6. 在Linux中将脚本做成系统服务

    有一些情况下,我们需要将某些脚本作为系统服务来运行.比如,在我使用workerman框架开发php程序时,需要使用管理员权限来运行,而且需要开机自行启动程序提供服务.这个时候将启动程序写成服务就可以很 ...

  7. SSM搭建Spring单元测试环境

    原文链接:https://jingyan.baidu.com/article/93f9803f5a97a4e0e46f55c8.html SSM搭建Spring单元测试环境

  8. Excel:公式中的这些特殊数字

    19E+307 9E+307是科学计数法表示的一个数字,就简单理解成是Excel支持的一个很大的数字就可以了. 用法示例: =LOOKUP(9E+307,A:A) 根据LOOKUP函数的性质,提取A列 ...

  9. xgboost入门与实战(原理篇)

    sklearn实战-乳腺癌细胞数据挖掘 https://study.163.com/course/introduction.htm?courseId=1005269003&utm_campai ...

  10. 一些常见修改命令(针对ubuntu 14.04 持续更新中...)

    1.PS1 在哪: echo $PS1    vi /etc/bash.bashrc      /W输出最后一个目录    /w输出完整目录 2.设置静态IP地址:vim /etc/network/i ...