常用数据采集手段
埋点——用户行为数据采集 埋点方式 埋点采集数据的过程 常规埋点示例 埋点方案应具备四个要素 常用埋点APP数据分析工具 ETL——系统业务数据整合 常用的ETL工具 网络爬虫——互联网数据采集 网络爬虫工作流程 网络爬虫抓取策略 网络爬虫系统架构 网络爬虫定期更新策略 Apache Flume——日志数据采集 Apache Kafka——数据分发中间件 其他埋点——用户行为数据采集
埋点技术:收集用户在产品上面的点击和浏览情况,用于运营分析。隐性的信息收集。 埋点:在正常的业务逻辑中,嵌入数据采集的代码。 弊端:可能会被用户认为侵犯隐私。 埋点优势:数据是手动编码产生的,易于收集,灵活性大,扩展性强。 埋点劣势:必须十分清楚目标,需要什么样的数据必须提前确定;容易发生漏埋现象;产品迭代过程中 ,忽略了埋点逻辑的更改。埋点方式
全埋点/无埋点:“全部采集,按需选取”;在产品中嵌入SDK,做统一埋点,一般用于采集APP的用户行为。(百度统计——基于无埋点技术的第三方统计工具) 可视化埋点:在全埋点部署成功、可以获得全量数据的基础上,以可视化的方式,在对应页面上定义想要的页面数据,或者控制数据。 代码埋点:前端代码埋点和后端代码埋点。更适合精细化分析的场景,采集各种细粒度数据。(适合技术人员,前两种适合市场和运营人员)埋点采集数据的过程
#mermaid-svg-bCu1ljv89Oz1rg54 .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-bCu1ljv89Oz1rg54 .label text{fill:#333}#mermaid-svg-bCu1ljv89Oz1rg54 .node rect,#mermaid-svg-bCu1ljv89Oz1rg54 .node circle,#mermaid-svg-bCu1ljv89Oz1rg54 .node ellipse,#mermaid-svg-bCu1ljv89Oz1rg54 .node polygon,#mermaid-svg-bCu1ljv89Oz1rg54 .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-bCu1ljv89Oz1rg54 .node .label{text-align:center;fill:#333}#mermaid-svg-bCu1ljv89Oz1rg54 .node.clickable{cursor:pointer}#mermaid-svg-bCu1ljv89Oz1rg54 .arrowheadPath{fill:#333}#mermaid-svg-bCu1ljv89Oz1rg54 .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-bCu1ljv89Oz1rg54 .flowchart-link{stroke:#333;fill:none}#mermaid-svg-bCu1ljv89Oz1rg54 .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-bCu1ljv89Oz1rg54 .edgeLabel rect{opacity:0.9}#mermaid-svg-bCu1ljv89Oz1rg54 .edgeLabel span{color:#333}#mermaid-svg-bCu1ljv89Oz1rg54 .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-bCu1ljv89Oz1rg54 .cluster text{fill:#333}#mermaid-svg-bCu1ljv89Oz1rg54 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-bCu1ljv89Oz1rg54 .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-bCu1ljv89Oz1rg54 text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-bCu1ljv89Oz1rg54 .actor-line{stroke:grey}#mermaid-svg-bCu1ljv89Oz1rg54 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-bCu1ljv89Oz1rg54 .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-bCu1ljv89Oz1rg54 #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-bCu1ljv89Oz1rg54 .sequenceNumber{fill:#fff}#mermaid-svg-bCu1ljv89Oz1rg54 #sequencenumber{fill:#333}#mermaid-svg-bCu1ljv89Oz1rg54 #crosshead path{fill:#333;stroke:#333}#mermaid-svg-bCu1ljv89Oz1rg54 .messageText{fill:#333;stroke:#333}#mermaid-svg-bCu1ljv89Oz1rg54 .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-bCu1ljv89Oz1rg54 .labelText,#mermaid-svg-bCu1ljv89Oz1rg54 .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-bCu1ljv89Oz1rg54 .loopText,#mermaid-svg-bCu1ljv89Oz1rg54 .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-bCu1ljv89Oz1rg54 .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-bCu1ljv89Oz1rg54 .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-bCu1ljv89Oz1rg54 .noteText,#mermaid-svg-bCu1ljv89Oz1rg54 .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-bCu1ljv89Oz1rg54 .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-bCu1ljv89Oz1rg54 .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-bCu1ljv89Oz1rg54 .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-bCu1ljv89Oz1rg54 .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-bCu1ljv89Oz1rg54 .section{stroke:none;opacity:0.2}#mermaid-svg-bCu1ljv89Oz1rg54 .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-bCu1ljv89Oz1rg54 .section2{fill:#fff400}#mermaid-svg-bCu1ljv89Oz1rg54 .section1,#mermaid-svg-bCu1ljv89Oz1rg54 .section3{fill:#fff;opacity:0.2}#mermaid-svg-bCu1ljv89Oz1rg54 .sectionTitle0{fill:#333}#mermaid-svg-bCu1ljv89Oz1rg54 .sectionTitle1{fill:#333}#mermaid-svg-bCu1ljv89Oz1rg54 .sectionTitle2{fill:#333}#mermaid-svg-bCu1ljv89Oz1rg54 .sectionTitle3{fill:#333}#mermaid-svg-bCu1ljv89Oz1rg54 .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-bCu1ljv89Oz1rg54 .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-bCu1ljv89Oz1rg54 .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-bCu1ljv89Oz1rg54 .grid path{stroke-width:0}#mermaid-svg-bCu1ljv89Oz1rg54 .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-bCu1ljv89Oz1rg54 .task{stroke-width:2}#mermaid-svg-bCu1ljv89Oz1rg54 .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-bCu1ljv89Oz1rg54 .taskText:not([font-size]){font-size:11px}#mermaid-svg-bCu1ljv89Oz1rg54 .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-bCu1ljv89Oz1rg54 .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-bCu1ljv89Oz1rg54 .task.clickable{cursor:pointer}#mermaid-svg-bCu1ljv89Oz1rg54 .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-bCu1ljv89Oz1rg54 .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-bCu1ljv89Oz1rg54 .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-bCu1ljv89Oz1rg54 .taskText0,#mermaid-svg-bCu1ljv89Oz1rg54 .taskText1,#mermaid-svg-bCu1ljv89Oz1rg54 .taskText2,#mermaid-svg-bCu1ljv89Oz1rg54 .taskText3{fill:#fff}#mermaid-svg-bCu1ljv89Oz1rg54 .task0,#mermaid-svg-bCu1ljv89Oz1rg54 .task1,#mermaid-svg-bCu1ljv89Oz1rg54 .task2,#mermaid-svg-bCu1ljv89Oz1rg54 .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-bCu1ljv89Oz1rg54 .taskTextOutside0,#mermaid-svg-bCu1ljv89Oz1rg54 .taskTextOutside2{fill:#000}#mermaid-svg-bCu1ljv89Oz1rg54 .taskTextOutside1,#mermaid-svg-bCu1ljv89Oz1rg54 .taskTextOutside3{fill:#000}#mermaid-svg-bCu1ljv89Oz1rg54 .active0,#mermaid-svg-bCu1ljv89Oz1rg54 .active1,#mermaid-svg-bCu1ljv89Oz1rg54 .active2,#mermaid-svg-bCu1ljv89Oz1rg54 .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-bCu1ljv89Oz1rg54 .activeText0,#mermaid-svg-bCu1ljv89Oz1rg54 .activeText1,#mermaid-svg-bCu1ljv89Oz1rg54 .activeText2,#mermaid-svg-bCu1ljv89Oz1rg54 .activeText3{fill:#000 !important}#mermaid-svg-bCu1ljv89Oz1rg54 .done0,#mermaid-svg-bCu1ljv89Oz1rg54 .done1,#mermaid-svg-bCu1ljv89Oz1rg54 .done2,#mermaid-svg-bCu1ljv89Oz1rg54 .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-bCu1ljv89Oz1rg54 .doneText0,#mermaid-svg-bCu1ljv89Oz1rg54 .doneText1,#mermaid-svg-bCu1ljv89Oz1rg54 .doneText2,#mermaid-svg-bCu1ljv89Oz1rg54 .doneText3{fill:#000 !important}#mermaid-svg-bCu1ljv89Oz1rg54 .crit0,#mermaid-svg-bCu1ljv89Oz1rg54 .crit1,#mermaid-svg-bCu1ljv89Oz1rg54 .crit2,#mermaid-svg-bCu1ljv89Oz1rg54 .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-bCu1ljv89Oz1rg54 .activeCrit0,#mermaid-svg-bCu1ljv89Oz1rg54 .activeCrit1,#mermaid-svg-bCu1ljv89Oz1rg54 .activeCrit2,#mermaid-svg-bCu1ljv89Oz1rg54 .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-bCu1ljv89Oz1rg54 .doneCrit0,#mermaid-svg-bCu1ljv89Oz1rg54 .doneCrit1,#mermaid-svg-bCu1ljv89Oz1rg54 .doneCrit2,#mermaid-svg-bCu1ljv89Oz1rg54 .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-bCu1ljv89Oz1rg54 .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-bCu1ljv89Oz1rg54 .milestoneText{font-style:italic}#mermaid-svg-bCu1ljv89Oz1rg54 .doneCritText0,#mermaid-svg-bCu1ljv89Oz1rg54 .doneCritText1,#mermaid-svg-bCu1ljv89Oz1rg54 .doneCritText2,#mermaid-svg-bCu1ljv89Oz1rg54 .doneCritText3{fill:#000 !important}#mermaid-svg-bCu1ljv89Oz1rg54 .activeCritText0,#mermaid-svg-bCu1ljv89Oz1rg54 .activeCritText1,#mermaid-svg-bCu1ljv89Oz1rg54 .activeCritText2,#mermaid-svg-bCu1ljv89Oz1rg54 .activeCritText3{fill:#000 !important}#mermaid-svg-bCu1ljv89Oz1rg54 .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-bCu1ljv89Oz1rg54 g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-bCu1ljv89Oz1rg54 g.classGroup text .title{font-weight:bolder}#mermaid-svg-bCu1ljv89Oz1rg54 g.clickable{cursor:pointer}#mermaid-svg-bCu1ljv89Oz1rg54 g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-bCu1ljv89Oz1rg54 g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-bCu1ljv89Oz1rg54 .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-bCu1ljv89Oz1rg54 .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-bCu1ljv89Oz1rg54 .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-bCu1ljv89Oz1rg54 .dashed-line{stroke-dasharray:3}#mermaid-svg-bCu1ljv89Oz1rg54 #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-bCu1ljv89Oz1rg54 #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-bCu1ljv89Oz1rg54 #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-bCu1ljv89Oz1rg54 #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-bCu1ljv89Oz1rg54 #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-bCu1ljv89Oz1rg54 #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-bCu1ljv89Oz1rg54 #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-bCu1ljv89Oz1rg54 #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-bCu1ljv89Oz1rg54 .commit-id,#mermaid-svg-bCu1ljv89Oz1rg54 .commit-msg,#mermaid-svg-bCu1ljv89Oz1rg54 .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-bCu1ljv89Oz1rg54 .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-bCu1ljv89Oz1rg54 .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-bCu1ljv89Oz1rg54 g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-bCu1ljv89Oz1rg54 g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-bCu1ljv89Oz1rg54 g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-bCu1ljv89Oz1rg54 g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-bCu1ljv89Oz1rg54 g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-bCu1ljv89Oz1rg54 g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-bCu1ljv89Oz1rg54 .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-bCu1ljv89Oz1rg54 .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-bCu1ljv89Oz1rg54 .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-bCu1ljv89Oz1rg54 .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-bCu1ljv89Oz1rg54 .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-bCu1ljv89Oz1rg54 .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-bCu1ljv89Oz1rg54 .edgeLabel text{fill:#333}#mermaid-svg-bCu1ljv89Oz1rg54 .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-bCu1ljv89Oz1rg54 .node circle.state-start{fill:black;stroke:black}#mermaid-svg-bCu1ljv89Oz1rg54 .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-bCu1ljv89Oz1rg54 #statediagram-barbEnd{fill:#9370db}#mermaid-svg-bCu1ljv89Oz1rg54 .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-bCu1ljv89Oz1rg54 .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-bCu1ljv89Oz1rg54 .statediagram-state .divider{stroke:#9370db}#mermaid-svg-bCu1ljv89Oz1rg54 .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-bCu1ljv89Oz1rg54 .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-bCu1ljv89Oz1rg54 .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-bCu1ljv89Oz1rg54 .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-bCu1ljv89Oz1rg54 .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-bCu1ljv89Oz1rg54 .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-bCu1ljv89Oz1rg54 .note-edge{stroke-dasharray:5}#mermaid-svg-bCu1ljv89Oz1rg54 .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-bCu1ljv89Oz1rg54 .error-icon{fill:#522}#mermaid-svg-bCu1ljv89Oz1rg54 .error-text{fill:#522;stroke:#522}#mermaid-svg-bCu1ljv89Oz1rg54 .edge-thickness-normal{stroke-width:2px}#mermaid-svg-bCu1ljv89Oz1rg54 .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-bCu1ljv89Oz1rg54 .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-bCu1ljv89Oz1rg54 .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-bCu1ljv89Oz1rg54 .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-bCu1ljv89Oz1rg54 .marker{fill:#333}#mermaid-svg-bCu1ljv89Oz1rg54 .marker.cross{stroke:#333} :root { --mermaid-font-family: "trebuchet ms", verdana, arial;} #mermaid-svg-bCu1ljv89Oz1rg54 { color: rgba(0, 0, 0, 0.75); font: ; }
评估解决方案的
效果
需求收集和分析
确定场景和目标
针对需求制定数
据采集规划方案
埋点采集数据的
具体措施
数据质量的评估
及数据分析
设计优化方案
实施优化方案
常规埋点示例
埋点方案应具备四个要素
确认事件与变量:事件指产品中的操作,变量指描述事件的属性。按照产品流程来设计关键事件。 明确事件的触发时机:不同触发时机代表不同的数据统计口径,要尽量选择最贴近业务的统计口径,然后再与开发沟通。 规范命名:对事件进行规范统一的命名,有助于提高数据的实用性及数据管理效率。 明确优先级:在设计埋点方案时,一定要对埋点事件有明确的优先级排布。常用埋点APP数据分析工具
Growinglo 百度移动统计 神策分析 腾讯移动分析 谷歌GAETL——系统业务数据整合
ETL的概念:用来描述将数据从来源端经过抽取(extract)、(清洗)转换(transform——按照数据规则进行清洗转换,花费时间最长一般是整个ETL的2/3)、加载(load——加载至数据仓库或进行可视化展示)至目的端的过程。 常用的三种实现方式----借助ETL工具、SQL方式实现、ETL工具和SQL相结合。 ETL工具解决的问题:数据来自不同的物理主机、数据来自不同的数据库或者文件、异构数据处理等。常用的ETL工具
Kettle:一款国外开源的ETL工具,纯java编写,数据抽取高效稳定(数据迁移工具)。 Apatar:开源ETL项目,模块化架构,支持所有主流数据源,提供灵活的基于GUI、服务器和嵌入式的部署选项。 Scriptella:一个开源的ETL工具和一个脚本执行工具,支持跨数据库的ETL脚本。 ETLAutomation:提供了一套ETL框架,重点是提供对ETL流程的支持。网络爬虫——互联网数据采集
网络爬虫:是一种按照一定的规则,自动抓取万维网信息(网页)的程序或者脚本。为搜索引擎从万维网上抓取网页,是搜索引擎的重要组成部分。
网络爬虫工作流程
网络爬虫可分为通用网络爬虫和聚焦网络爬虫
通用网络爬虫基本工作流程 聚焦网络爬虫基本工作流程(通过增加新模块实现有目的的爬取)相比通用网络爬虫新增目标定义、无关链接过滤、下一步要爬取的连接三个模块。
网络爬虫抓取策略
深度优先遍历策略:从起始页开始,一个个链接跟踪下去。 宽度优先遍历策略:抓取当前网页中链接的所有网页,再从待抓取队列中选取下一个URL。 反向连接数策略:反向链接数是指一个网页被其他网页链接指向的数量。使用这个指标评价网页的重要程度,从而决定抓取先后顺序。 ** 基于优先级计算的策略**:针对待抓取网页计算优先级值,通过排序来确定抓取顺序。 大站优先策略:对于待抓取队列中的所有网页,根据所属的网站进行分类,对于待下载页面数多的网站优先下载。网络爬虫系统架构
往往是一个分布式系统
主从式系统架构(若master不工作可能会造成 整个系统瘫痪) 对等式系统架构(扩展性不好)改进:基于一致性哈希运算(1997年由麻省理工学院提出,一般用来解决分布式系统中负载均衡问题),将URL的主域名映射为一个指定范围内的某个数,根据 事先的分配策略,判断由哪台服务器来进行抓取该URL。网络爬虫定期更新策略
历时参考策略:在网页的的历时更新数据基础上,利用建模等手段,预测网页下一次更新的时间,确定爬取周期。 用户体验策略:依据网页多个历史版本的内容更新,搜索质量影响、用户体验等信息,来确定爬取周期。 聚类分析策略:首先对海量的网页进行聚类分析,每个类中的网页一般有类似的更新频率。通过抽样计算,确定针对每个聚类的爬取频率。简单代码示例:
# 第一个爬虫示例,爬取百度页面
import requests #导入爬虫库
response = requests.get("https://www.baidu.com") #生成一个response对象
response.encoding = response.apparent_encoding #设置编码格式
print("状态码:"+ str(response.status_code)) #打印状态码
print(response.text) #输出爬取信息
#抓取图片保存到本地
import requests #导入爬虫库
response = requests.get(https://www.baidu.com/ing/baidu_jgylogo3.gif) #用get得到图片
file = open("baidu_logo.gif","wb") #打开一个文件,wb表示以二进制格式打开一个文件只用于写入
file.write(response.content) #写入文件
file.close() #关闭操作
Apache Flume——日志数据采集
分布式、可靠、和高可用的海量日志采集、聚合和传输的日志收集系统。
初始版本Flume—OG基本结构
第二代Flume—NG基本架构
- Event:Flume数传输的基本单元,由可选的header和载有数据的byte array勾陈,byte array可以携带日志数据。
- Source:负责接收Event或通过特殊机制产生Event,并将Events批量的放到一个或多个Channel。
- Channel:连接Source和Sink,类似event的缓存队列。
- Sink:接收Event,进行下一步转发。
Apache Kafka——数据分发中间件
前端数据采集后,需要送到后端进行分析处理。前端采集与后端处理往往是多对多的关系。之间需要分发中间件负责消息转发、保障消息可靠性、匹配前后端速度差。 消息队列是在消息传输过程中保存消息的容器或中间件,主要目的是提供消息路由并保障消息可靠传递。目前常见的消息队列中间件产品包括:ActiveMQ、ZeroMQ、RabbitMQ和Kafka。一般消息中间件支持两种模式:消息队列模式及Pub-Sub(发布订阅)模式。 Kafka:分布式发布-订阅消息系统,最初由Linkedln公司开发,之后成五日Apache项目的一部分。具有极高的消息吞吐量,较强的可扩展性和高可用性,消息传递低延迟,能够对消息队列进行持久化保存,且支持消息传递的“至少送达一次”语义。Topics是消息的分类名(或Feed的名称),一个Topic可以认为是一类消息,每个Topic将被分成多个Partition(区)。Partition是以log文件的形式存储在文件系统中,任何发布到Partition的消息都会被直接追加到log文件的尾部。Logs文件根据配置要求保留一定时间后删除来释放磁盘空间。 Partition:Topic物理上的分分组,一个topic可以分为多个partition,每个partition是一个有序的队列。partition中的每条消息都会被分配一个有序的id(offset)。
Producer将消息发布到制定的Topic中,同时Producer也能决定将此消息归属于哪个Partition。消息和数据生产者,向Kafka的一个topic发布信息的过程称为producer。 consumer:消息和数据的消费者,订阅相关topics,并处理Producer发布的消息。运行consumer group(包含多个consumer)对一个topic进行消费,不同的consumer group 之间独立订阅。每个consumer属于一个consumer group,发布的消息,只会被订阅此topic的每个group中的一个consumer消费。同一个group中不能有多于partitions个数的consumer同时消费,否则将意味着某些consumer将无法得到消息。 Broker:缓存代理,Kafka集群中的一台或多台服务器统称为broker。 Message消息:是通信的基本单位,每个producer可以向一个topic(主题)发布一些消息。
其他
探针——网络流量数据捕获、传感器——环境数据捕获、RFID Reader——标签数据捕获……