《数据采集与预处理(第2版)》全套教学课件_第1页
《数据采集与预处理(第2版)》全套教学课件_第2页
《数据采集与预处理(第2版)》全套教学课件_第3页
《数据采集与预处理(第2版)》全套教学课件_第4页
《数据采集与预处理(第2版)》全套教学课件_第5页
已阅读5页,还剩361页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

项目一数据采集与预处理准备Project1Datacollectionandpre-processingpreparation《数据采集与预处理(第二版)》数据采集与预处理准备网络爬虫实践日志数据采集实践使用Sqoop进行数据迁移数据预处理实践全套可编辑PPT课件任务一Task1认识数据采集技术,熟悉数据采集平台任务描述(1)学习数据采集等相关知识内容,熟悉大数据的定义、大数据的基本

特征及数据采集的相关技术、工具和产品等(2)熟悉数据采集的来源和方法。(3)完成Scrapy平台的搭建。(4)完成ApacheFlume平台的搭建。

任务目标(1)掌握数据采集的来源和采集的方法。(2)学会搭建数据采集平台。知识准备1.数据采集的概念数据采集是大数据价值挖掘中重要的一环,其后的分析挖掘都建立在数据采集的基础上。数据的采集有基于物联网传感器的采集,也有基于网络信息的采集。数据采集过程中涉及数据的抽取(Extract)、数据的清洗转换(Transform)、数据的加载(Load)3个过程,其英文缩写为ETL。数据采集的ETL工具负责将分布的、异构数据源中的不同种类和结构的数据,抽取到临时中间层,然后进行清洗、转换、分类、集成,最后加载到对应的数据存储系统(如数据仓库)中,成为联机分析处理、数据挖掘的基础。针对大数据的ETL处理过程有别于传统的ETL处理过程,在ETL的架构和工具选择上,会采用如分布式内存数据库、实时流处理系统等现代信息技术。知识准备2.数据采集的来源根据MapReduce产生数据的应用系统分类,大数据的采集主要有4种来源:管理信息系统、Web信息系统、物理信息系统、科学实验系统。3.数据采集的方法(1)数据采集的新方法:

①系统日志采集方法

②网络数据采集方法:对非结构化数据的采集

③其他数据采集方法

知识准备3.数据采集的方法(2)网页数据采集的方法

①网页数据采集的基本流程互联网网页数据采集就是获取互联网中相关网页内容的过程,并从中抽取出用户所需要的属性内容。网络爬虫是一个自动提取网页的程序,从一个或若干初始网页的URL开始,获得初始网页的URL,在抓取网页的过程中,不断从当前页面中抽取新的URL放入队列,直到满足系统的一定停止条件。上图:网络爬虫自动提取网页的过程知识准备3.数据采集的方法(2)网页数据采集的方法

②网页数据采集的工作过程a.将需要抓取数据网站的URL信息写入URL队列。b.爬虫从URL队列中获取需要抓取数据网站的URL信息。c.获取某个具体网站的网页内容。d.从网页内容中抽取该网站正文页内容的链接地址。e.从数据库中读取已经抓取过内容的网页地址。f.过滤URL。对当前的URL和已经抓取过的URL进行比较。g.若该网页地址没有被抓取过,则将该地址写入数据库。

已经被抓取过,则放弃对这个地址的抓取操作。h.获取该地址的网页内容,并抽取出所需属性的内容值。i.将抽取的网页内容写入数据库。知识准备3.数据采集的方法(2)网页数据采集的方法

③Web信息数据自动采

Web数据自动采集涉及Web数据挖掘、信息检索、信息提取

、搜索引擎等概念和技术④链接过滤

链接过滤是数据采集的关键技术,实质就是判断一个链接是不是在一个链接集合中。在对网页大数据的采集中,可以采用布隆过滤器来实现对链接的过滤。⑤Web引擎和通用搜索引擎的差别

Web引擎更多地关注“结构化信息”的抽取,搜索引擎更多关注搜索条件,信息一般不进行结构化处理。⑥结构化信息抽取的方式

Web结构化信息抽取就是将网页中的非结构化数据按照一定的需求抽取成结构化数据,属于垂直搜索。任务实施1.Scrapy系统环境搭建(1).安装所需要的环境右键单击Ubuntu操作系统桌面,在弹出的快捷菜单中选择“OpenTerminal”命令,打开命令行窗口,在其中输入命令“sudoapt-getinstallpython-pip”如下图所示。pip是一个现代的、通用的Python包管理工具,提供了对Python包的查找、下载、安装、卸载的功能。需要将pip更新到最新版本,即在命令行窗口中执行命令“pipinstall--upgradepip”如下图所示。pip更新完成后,即可安装Scrapy。在命令行窗口中执行命令“pipinstallscrapy”,如下图所示。任务实施1.Scrapy系统环境搭建(2)验证Scrapy框架安装是否成功在命令行窗口中输入命令“scrapy”,若显示下图所示的内容,即表示成功安装Scrapy框架。任务实施2.日志系统环境搭建(1).安装FlumeFlume需要JDK环境的支持,可以使用“java–version”命令查看系统是否配置了JDK环境,若显示如下图所示的结果,即表示配置了JDK环境。否则,需要先下载并安装JDK环境①

到官方网站下载执行以下命令,完成压缩包的解压与安装。任务实施2.日志系统环境搭建(1).安装Flume②

修改权限和命名首先,使用“id”命令确定本机的用户和组,如下图所示。其次,使用以下命令更改用户和组修改文件的权限修改文件名称,如下图所示。任务实施2.日志系统环境搭建(2).配置环境变量①

配置环境变量执行“sudogedit/etc/profile”命令,在profile文件中配置环境变量,如下图所示。配置完成并保存后,需要使用以下命令使环境变量生效②

修改配置文件flume-env.sh进入/usr/local/flume/conf目录,进行下图所示的操作。在flume-env.sh文件开头加入下图所示的语句任务实施2.日志系统环境搭建(3)验证Flume框架安装是否成功执行以下语句。若显示下图所示的信息,则表示Flume安装成功。任务实施3.MongoDB的安装(1)下载MongoDB的安装包到MongoDB官网下载MongoDB的安装包(mongodb-win32-x86_64-2012plus-4.2.24.zip),注意选择与自己电脑系统版本匹配的软件安装包,下载完成后解压至任意一个目录即可(D:\mongodb)。(2)添加MongoDB的环境变量将解压后的MongoDB安装包所在目录,添加至环境变量中,方便在命令行中使用。具体方法如下:在Windows系统中,按下Win+R键打开运行窗口,输入sysdm.cpl进入系统属性界面,单击“高级”选项卡,单击“环境变量”按钮,然后在“系统环境变量”中将bin所在目录(D:\mongodb\bin)添加至“Path”环境变量中即可,注意,在添加环境变量前,必须保证MongoDB安装包已经在电脑上进行了解压,否则环境变量添加无效任务实施3.MongoDB的安装(4)启动MongoDB服务使用管理员权限打开命令行窗口,进入MongoDB的安装目录,然后输入以下命令来启动MongoDB服务:其中“dbpath”参数表示MongoDB的数据存储路径,“logpath”参数表示日志文件存储的路径,“install”参数表示将MongoDB服务安装在系统中,“serviceName”参数指定MongoDB服务的名称(可以自定义名称)。(5)创建MongoDB数据库以及集合在MongoDB服务启动后,打开命令行窗口,在任意路径下输入命令“mongo”,运行后进入mongodb的命令行中,即可使用命令进行数据库的创建以及集合的操作。执行命令如下此处的数据库名和集合名可以依据实际情况进行设定,其中use命令用来选择要操作的数据库,db.createCollection用来创建集合。任务二Task2认识数据预处理技术任务描述(1)学习数据预处理技术等相关知识内容,如数据清洗的主要任务和常用方法,数据集成的

主要任务和常用方法,数据转换的主要任务和常用方法,数据归约的主要任务和常用方法。(2)完成Kettle系统环境的搭建。(3)完成Python开发环境的搭建

任务目标(1)了解原始数据存在的主要问题。(2)明白数据预处理的作用和工作任务。(3)学会数据处理工具平台的搭建。知识准备1.数据预处理的概念数据预处理是指在对数据进行数据挖掘的主要处理以前,先对原始数据进行必要的清理、集成、转换、离散、归约、特征选择和提取等一系列处理工作,达到挖掘算法进行知识获取、研究所要求的最低规范和标准。数据挖掘的对象是从现实世界采集到的大量的、各种各样的数据,这些数据主要具有以下特征。

①不完整性;

②含噪声;

③杂乱性(不一致性);知识准备2.数据预处理常见的问题(1)数据采样:

数据采样技术分为加权采样、随机采样和分层采样3类,其目的是从数据集中采集部分样本进行处理。(2)数据清理:

数据清理技术通常包括填补遗漏的数据值、平滑有噪声数据、识别或除去异常值,以及解决不一致

问题。填补遗漏的数据值,处理不完备数据集的方法主要有以下三大类。

①删除元组;

②数据补齐;

③平滑有噪声数据;(3)数据集成:

数据集成指将来自多个数据源的数据合并,形成一致的数据存储,如将不同数据库中的数据集成

一个数据仓库中存储。在数据集成时需要考虑很多问题。(如实体识别问题、冗余和相关分析、元

组重复、数据值冲突的检测与处理、数据转换、特征选择、特征提取等问题)任务实施1.Kettle环境的搭建(1).下载Kettle在官方网站下载pdi-ce--25.zip,并解压到/usr/local目录,解压操作如图所示。任务实施1.Kettle环境的搭建(1).下载Kettle解压完成后进入/usr/local,将文件“data-integration”重命名为“kettle”,以方便后续使用,如图所示。任务实施1.Kettle环境的搭建(2).配置环境变量打开命令行窗口,输入“sudovim~/.bashrc”,配置环境变量,如图所示。环境变量配置完成并保存后,执行“Source~/.bashrc”命令,使配置的环境变量生效。任务实施1.Kettle环境的搭建(3).验证Kettle是否安装成功打开命令行窗口,切换到/usr/local/kettle路径,执行“./spoon.sh”命令,若显示信息如下两图所示,则表示安装成功。课后习题简答题通过网络收集资料,了解常用的ETL工具。通过网络收集资料,了解日志采集系统的种类,以及爬虫框架的种类。简述布隆过滤器(BloomFilter)的基本思想。简述现实世界采集到的各种各样的数据所具有的特征。简述数据采样技术的种类。简述填补遗漏的数据值,处理不完备数据集的几种。感谢聆听THANKYOUFORLISTEN项目二网络爬虫实践工业和信息化精品系列教材——大数据技术Project2WebCrawlerPractice《数据采集与预处理(第二版)》任务一Task1使用urllib爬取北京公交线路的信息任务描述(1)学习网络爬虫相关技术,熟悉爬虫基本库urllib的使用。(2)熟悉网络爬虫相关基础知识。(3)使用urllib基本库获取北京公交线路信息的HTML源代码。(4)使用BeautifulSoup解析库完成北京公交线路相关信息的获取。

任务目标(1)知道urllib基本库和BeautifulSoup解析库的使用方法。(2)学会使用urllib基本库和BeautifulSoup解析库进行北京公交线路相关信息的爬取。知识准备1.HTTP的理解(1)URL和URI

统一资源定位符(UniformResourceLocator,URL)和统一资源标识符(UniformResourceIdentifier,URI)用于精确地说明某资源的位置以及如何去访问它。URI有两种表现形式——URL和统一资

源名称(UniformResourceName,URN)。URL描述了一台特定服务器上某资源的特定位置;URN仅命名资源而不指定如何定位资源,在目前的互联网中使用得很少。因此,几乎所有的URI都是URL。(2)HTTP和HTTPS

爬虫常用的协议类型就是HTTP和HTTPS。超文本传输协议(HyperTextTransferProtocol,HTTP)是一个客户端和服务器端请求和应答的标准,是互联网中应用最为广泛的一种网络协议,所有的WWW文件都要遵守这个协议,目前广泛使用的是HTTP1.1。HTTPS是以安全为目标的HTTP通道,可以理解为HTTP的安全版,即HTTP中加入SSL层,其传输的内容都是经过SSL加密的,它的主要作用如下:建立一个信息安全通道,来保证数据的传输安全;确认网站的真实性,凡是使用了HTTPS的网站,用户都可以通过单击浏览器地址栏中的锁头标志来查看网站认证之后的真实信息,也可以通过证书颁发机构颁发的安全签章来查询。知识准备1.HTTP的理解(3)HTTP请求流程

一次HTTP操作称为一个事务,其工作过程可分为以下4步。首先,在浏览器地址栏中输入一个地址(或单击一个超链接),HTTP的工作就开始了。其次,建立连接后,客户端发送一个HTTP请求到服务器,请求消息由请求行、请求头部、空行和请求数据4部分组成。再次,服务器接收到请求后,给出响应,HTTP响应也由4部分组成,分别是状态行、消息报头、空行和响应正文。最后,客户端浏览器接收响应之后,在用户的浏览器上渲染显示,客户端和服务器端断开连接。图2-1请求报文的一般格式知识准备2.网页基础知识(1)网页的组成网页的组成可分为三大部分:超文本标记语言(HyperTextMarkupLanguage,HTML)、层叠样式表(CascadingStyleSheets,CSS)和Java脚本(JavaScript,JS)。HTML负责语义,CSS负责样式,JavaScript负责交互和行为。HTML:用来描述网页的一种语言。可以通过Chrome浏览器打开一个网址,右键单击检查或按F12键,打开“开发者工具”,选择“Elements”选项卡,即可看到网页的源代码。CSS:“层叠”是指当在HTML中引用了数个样式文件,并且样式发生冲突时,浏览器能依据层叠顺序处理;“样式”指网页中文字大小、颜色、元素间距、排列等格式。JavaScript:一种脚本语言。HTML和CSS配合使用,提供给用户的只是一种静态的信息,缺少交互性。有时在网页中可能会看到一些交互和动画效果,如下载进度条、提示框、轮播图等,这通常需要使用JavaScript来实现。网页的基本格式如图知识准备2.网页基础知识(2)节点树及节点间的关系在网页中,组织页面的对象被渲染成一个树形结构,用来表示文档中对象的标准模型,称为文档对象模型(DocumentObjectModel,DOM)。DOM实际上是以面向对象方式描述的文档模型。DOM定义了表示和修改文档所需的对象、对象的行为和属性,以及对象之间的关系。可以把DOM看作页面上数据和结构的一个树形表示,只是页面可能并不是以这种树的方式具体实现的。节点树示意如图2-2所示。图2-2节点树示意知识准备2.网页基础知识①在节点树中,顶端节点被称为根。②每个节点都有父节点,除了根(即根节点,没有父节点)。③一个节点可拥有任意数量的子节点。④兄弟是拥有相同父节点的节点。DOM规定:整个文档是一个文档节点,每个HTML标签是一个元素节点,包含在HTML元素中的文本是文本节点,每一个HTML属性是一个属性节点,注释属于注释节点。节点树中的节点彼此拥有层级关系。父(Parent)、子(Child)和兄弟(Sibling)等术语用于描述这些关系。父节点拥有子节点。同级的子节点被称为兄弟(同胞或姐妹)。如图

节点树的一部分及节点之间的关系知识准备3.爬虫的基本原理网络爬虫(又被称为网页蜘蛛)本质上就是获取网页并提取和保存信息的自动化程序。(1)获取网页爬虫的首要工作就是获取网页源代码,再从中提取想要的数据。在Python中提供了许多库来帮助实现这个操作,如urllib、requests等,使用这些库可以帮助实现HTTP请求操作,Request和Response都可以用类库提供的数据结构来表示,得到Response之后只需要解析数据结构中的body部分,即可得到网页的源代码,这样便可以用程序来实现获取网页的过程。(2)提取信息获取网页源代码后,接下来的工作就是分析网页源代码,从中提取想要的数据。最通用的方法就是使用正则表达式,但是使用正则表达式比较复杂。在Python中,使用BeautifulSoup、PyQuery、LXML等库,可以帮助用户高效地从源代码中提取网页信息。(3)保存数据提取信息之后,可以将数据保存到本地,以便后续使用。保存方式有很多种,如TXT、JSON,也可以保存到数据库中,如MySQL、MongoDB等。知识准备4.基本库的使用(1)urllib库的使用urllib库是Python中的一个功能强大、用于操作URL,并在制作爬虫的时候经常要用到的库。同样的库还有requests、httplib2。在Python2中,分别有urllib和urllib2,但在Python3中,其统一合并到urllib中。相对来说,Python3对中文的支持比Python2友好,urllib是Python3内置的HTTP请求库,它包含4个模块:request:最基本的HTTP请求模块,可以用来模拟发送请求。error:异常处理模块,如果出现请求错误,可以捕获异常,然后进行重试或其他操作。parse:工具模块,提供了许多URL处理方法,如拆分、解析、合并等。robotparser:主要用于识别网站的rebots.txt文件,然后判断哪些网页可以爬,哪些网页不可以爬。①

发送请求其先导入urllib.request模块,使用urlopen()对参数中的URL发送请求,返回一个HTTP.client.HTTPResponse对象。知识准备4.基本库的使用

在urlopen()中,使用timeout字段,可设定相应的秒数时间之后停止等待响应。除此之外,还可使用()、r.getcode()、r.geturl()获取相应的当前环境信息、状态码、当前网页URL。②读取响应内容HTTP.client.HTTPResponse对象包含了read()、readinto()、getheader(name)、getheaders()等方法,以及msg、version、status、reason、debuglevel等属性。

使用r.read()读取响应内容到内存中,该内容为网页的源代码(可用相应浏览器的“查看网页源代码”功能查看),并可对返回的字符串进行相应解码,即decode()。知识准备4.基本库的使用以字符串字典的形式,通过urlencode()编码,为URL的查询字符串传递数据,编码后的params为字符串,字典每项键值对以'&'连接,如'q=urllib&check_keywords=yes&area=default',构建后的URL为HTTPS:///3/search.html?q=urllib&check_keywords=yes&area=default。当然,urlopen()支持直接构建的URL,简单的GET请求可以不通过urlencode()编码,手动构建后直接请求即可。③传递URL参数知识准备4.基本库的使用该URL利用“baidu”图片接口,查询关键字“word”的图片。如果直接将中文传入URL进行请求,会导致编码错误。因此需要使用quote()对该中文关键字进行URL编码,相应的,可以使用unquote()进行解码。⑤定制请求头③传递中文参数知识准备4.基本库的使用有时爬取一些网页时,会出现403错误(Forbidden),即禁止访问。这是因为网站服务器会对访问者的headers属性进行身份验证。例如,通过urllib库发送的请求,默认以“Python-urllib/X.Y”作为User-Agent,其中,X为Python的主版本号,Y为副版本号。所以,需要通过urllib.request.Request()构建Request对象,传入字典形式的headers属性,模拟浏览器。相应的headers信息,可通过浏览器的开发者调试工具,即“检查”功能的“Network”标签查看“标头”得到,或使用抓包分析软件Fiddler、Wireshark得到。除上述方法外,还可以使用urllib.request.build_opener()或req.add_header()定制请求头。在Python2中,urllib模块和urllib2模块通常一起使用,因为urllib.urlencode()可以对URL参数进行编码,而urllib2.Request()可以构建Request对象,定制请求头,并统一使用urllib2.urlopen()发送请求。知识准备4.基本库的使用⑥传递POST请求

在进行注册、登录等操作时,会通过POST表单传递信息。此时,首先,需要分析页面结构,构建表单数据post,使用urlencode()进行编码处理,返回字符串;其次,需要指定“UTF-8”的编码格式,这是因为postdata只能是bytes或者fileobject;最后,通过Request()传递postdata,使用urlopen()发送请求。知识准备4.基本库的使用⑦下载远程数据到本地

爬取图片、视频等远程数据时,可使用urlretrieve()将其下载到本地(不指定路径,默认存放到项目根目录)。其第一个参数为要下载的URL,第二个参数为下载后的存放路径。例如,下载Python官网Logo到当前目录中,返回元组(filename,http.client.HTTPMessage)。知识准备4.基本库的使用⑧设置代理IP地址

有时,频繁地爬取一个网页会被网站服务器屏蔽IP地址。此时,可通过上述方法设置代理IP地址。首先,通过网上代理IP地址的网站找一个可以用的IP地址,构建ProxyHandler()

对象,将HTTP和代理IP地址以字典形式作为参数传入,设置代理服务器的信息。再构建opener对象,将proxy和HTTPHandler类传入。通过install_opener()

将opener设置成全局对象,当使用urlopen()发送请求时,会使用之前设置的信息发送相应的请求。知识准备4.基本库的使用⑨异常处理URLError类来自urllib库的error模块,request模块产生的异常可以通过捕获这个类来处理。HTTPError是URLError的子类,用来处理HTTP请求错误,比如认证请求失败等。它有如下3个属性:

code:HTTP状态码。

reason:同父类一样,表示错误的原因。

headers:请求头因为URLError类是HTTPError的父类,所以在捕获异常时应先选择捕获子类的异常,再去捕获父类的异常。如果捕获到了HTTPError,则不会再处理URLError异常。如果发生的不是HTTPError,则会去捕获URLError异常。知识准备4.基本库的使用⑩Cookie的使用获取网站的Cookie。首先,必须声明一个CookieJar对象,然后利用HTTPCookieProcessor来构建一个Handler,最后利用build_opener()方法构建Opener。获取网站的Cookie并保存为文件。知识准备4.基本库的使用MozillaCookieJar是CookieJar的子类,可以用来处理Cookies和文件相关的事件(读取或保存Cookies等),将Cookies保存成Mozilla型浏览器的Cookies格式,运行之后将在当前目录下生成了一个cookies.txt文件。生成Cookies文件后,后续过程中会读取Cookies文件并进行利用。通过无状态协议HTTP访问网页时,Cookie会维持会话间的状态。例如,有些网站需要登录操作,第一次操作时可通过提交POST表单来登录,当爬取该网站中的其他站点时,可以使用Cookie来保持登录状态,而不用每次都通过提交表单来登录。知识准备4.基本库的使用(2)BeautifulSoupBeautifulSoup提供一些简单的、Python式的函数来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据。BeautifulSoup自动将输入文档转换为Unicode编码,将输出文档转换为UTF-8编码。一般而言,在处理时不需要考虑编码方式,除非文档没有指定一个编码方式。此时,BeautifulSoup无法自动识别编码方式,需要说明原始的编码方式。①

创建BeautifulSoup对象必须先导入bs4库,代码如下。创建一个字符串,代码如下。知识准备4.基本库的使用创建BeautifulSoup对象,代码如下。下面来输出soup对象的内容,使用格式化输出方式,代码如下。输出结果如下。知识准备4.基本库的使用②

四大对象种类BeautifulSoup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象都可以归纳为4种:Tag、NavigableString、BeautifulSoup、Comment。a.Tag它就是HTML中的一个个标签,代码如下。这里的title和a标签加上其中包括的内容就是Tag。下面尝试用BeautifulSoup方便地获取Tag。以下每一段代码的注释部分即为运行结果。知识准备4.基本库的使用可以利用soup加标签名轻松地获取这些标签的内容,这里需要注意,其查找的是所有内容中的第一个符合要求的标签(查询所有标签的方法稍后会进行介绍)。下面来验证一下这些对象的类型,代码如下。对于Tag,它有两个重要的属性,分别是name和attrs。知识准备4.基本库的使用soup对象本身比较特殊,它的name即为[document],对于其他内部标签,其输出的值便为标签本身的名称。这里,输出了p标签的所有属性,得到的类型是一个字典。如果想要单独获取某个属性,则可以按以下方法来做,如获取对象的class属性。还可以利用get方法,传入属性的名称来获取属性的值,其类型为列表。此外,可以对这些属性和内容等进行修改,代码如下。知识准备4.基本库的使用b.NavigableString不仅可以得到标签的内容,还可以通过“.string”获取标签内部的文字,代码如下。这样可以轻松地获取标签中的内容,下面来检查其类型。c.BeautifulSoupBeautifulSoup对象表示的是一个文档的全部内容,大部分时候,可以将其当作一个特殊的Tag对象,可以分别获取它的类型、名称和属性。知识准备4.基本库的使用d.CommentComment对象是一个特殊类型的NavigableString对象,其输出的内容仍然不包括注释符号,但是如果不妥善地对其进行处理,则可能会给文本处理带来意想不到的麻烦。下面来查找一个带注释的标签。其运行结果如下。a标签中的内容实际上是注释,但是如果利用.string来输出其内容,将会发现它已经把注释符号去掉了,这样做可能会带来严重的问题。另外,输出其类型时,会发现它是Comment类型,所以,在使用前最好进行判断,代码如下。知识准备4.基本库的使用在上面的代码中,先判断了它的类型是否为Comment,再进行其他操作,如输出。③

遍历文档树a.遍历直接子节点Tag的.contents属性可以使Tag的子节点以列表的方式输出。输出方式为列表,可以用列表索引来获取它的某一个元素。知识准备4.基本库的使用.children返回的不是一个list,而是一个list生成器对象,可以通过遍历获取所有子节点。b.遍历所有子孙节点.contents和.children属性仅包含Tag的直接子节点,.descendants属性可以对所有Tag的子孙节点进行递归循环,其和.children类似,需要遍历获取其中的内容。知识准备4.基本库的使用其运行结果如下。可以发现,所有的节点都被打印出来了,先是最外层的html标签,再从head中将标签一个个剥离出来,以此类推。c.遍历节点内容如果Tag只有一个NavigableString类型的子节点,那么这个Tag可以使用.string得到子节点。如果一个Tag仅有一个子节点,那么这个Tag也可以使用.string方法,其输出结果与当前唯一子节点的.string的输出结果相同。简单来讲,如果一个标签中没有标签了,那么.string会返回标签中的内容。如果标签中只有唯一的一个标签,那么.string会返回最里面的内容。知识准备4.基本库的使用如果Tag包含了多个子节点,则Tag无法确定.string方法应该调用哪个子节点的内容,.string的输出结果是None。d.遍历多个内容.string可以通过遍历来获取多个内容,代码如下。知识准备4.基本库的使用其输出的字符串中可能包含了很多空格或空行,使用.stripped_strings可以去除多余空白内容,代码如下。e.遍历父节点使用元素的

.parent属性可以获取父节点,代码如下。知识准备4.基本库的使用f.遍历全部父节点通过元素的.parents属性可以递归得到元素的所有父节点,代码如下g.遍历兄弟节点兄弟节点可以理解为和本节点处在同一级的节点,.next_sibling属性可获取该节点的下一个兄弟节点,.previous_sibling则与之相反,如果节点不存在,则返回None。知识准备4.基本库的使用h.遍历全部兄弟节点通过

.next_siblings和

.previous_siblings属性可以对当前节点的兄弟节点进行迭代输出。i.遍历前后节点与.next_sibling和.previous_sibling不同,.next_element并不是针对兄弟节点,而是针对所有节点,不分层次。那么head节点的下一个节点便是title,它是不分层次关系的。知识准备4.基本库的使用j.遍历所有前后节点通过.next_elements和.previous_elements的迭代器可以向前或向后访问文档的解析内容,就好像文档正在被解析一样。④

搜索文档树a.find_all(name,attrs,recursive,text,limit,**kwargs)find_all()方法用于搜索当前Tag的所有Tag子节点,并判断是否符合过滤器的条件。(a)name参数name参数可以查找所有名称为name的tag,字符串对象会被自动忽略。知识准备4.基本库的使用ⓐ传字符串:最简单的过滤器是字符串。在搜索方法中传入一个字符串参数,BeautifulSoup会查找与字符串完整匹配的内容。下面的例子用于查找文档中所有的b标签。ⓑ传正则表达式:如果传入正则表达式作为参数,则BeautifulSoup会通过正则表达式的match()

来匹配内容。下面例子用于找出所有以b开头的标签,这表示body和b标签都应该被找到。知识准备4.基本库的使用ⓒ传列表:如果传入列表参数,则BeautifulSoup会将与列表中任一元素匹配的内容返回。下面的例子用于找到文档中所有a标签和b标签。ⓓ传True:True可以匹配任何值。下面的例子用于查找到所有的Tag,但是不会返回字符串节点。知识准备4.基本库的使用ⓔ传方法:如果没有合适的过滤器,还可以定义一个方法,此方法只接收一个元素参数(HTML文档中的一个元素节点,不能是文本节点),如果这个方法返回True,则表示当前元素匹配并且被找到,否则返回False。下面的例子用于校验当前元素,如果包含class属性却不包含id属性,那么将返回True。将这个方法作为参数传入find_all()

方法,将得到所有p标签。(b)attrs参数有些Tag属性在搜索中无法使用,如HTML5中的data-*属性。知识准备4.基本库的使用

但是可以通过find_all()

方法的attrs参数定义一个字典参数来搜索包含特殊属性的Tag,表达式可以是字符串、布尔值、正则表达式。(c)recursive参数调用Tag的find_all()

方法时,BeautifulSoup会检索当前Tag的所有子孙节点,如果只想搜索Tag的直接子节点,则可以使用参数recursive=False。是否使用recursive参数的搜索结果对比如下。知识准备4.基本库的使用(d)text参数通过text参数可以搜索文档中的字符串内容。与name参数的可选值一样,text参数可以为字符串、正则表达式、列表和True。(e)limit参数find_all()

方法返回全部的搜索结果,如果文档树很大,搜索就会很慢。如果不需要全部结果,则可以使用limit参数限制返回结果的数量。当搜索到的结果数量达到limit的限制时,就停止搜索返回结果。文档树中有3个Tag符合搜索条件,但结果只返回了2个,因为limit=2限制了返回数量。知识准备4.基本库的使用(f)**kwargs参数如果传入href参数,则BeautifulSoup会搜索每个Tag的href属性。使用多个指定名称的参数可以同时过滤Tag的多个属性。知识准备4.基本库的使用如果想用class进行过滤,则由于class是Python的关键词,因此需要为其加一个下划线来解决冲突问题。b.find_parents()与find_parent()find_parents()

在当前节点的先辈节点中搜索,返回列表类型,参数同.find_all()参数。而find_parent()

在当前节点的先辈节点中搜索,则返回一个结果,参数同.find()参数。知识准备4.基本库的使用c.find_next_sibling()与find_next_sibling()find_next_siblings()方法在后续平行节点中搜索,返回列表类型,参数同.find_all()参数。find_next_sibling()方法在后续平行节点中搜索,返回第一个符合条件的结果,参数同.find()参数。d.find_previous_siblings()与find_previous_sibling()find_previous_siblings()方法在前序平行节点中搜索,返回列表类型,参数同.find_all()参数。find_previous_sibling()方法在前序平行节点中搜索,返回第一个符合条件的结果,参数同.find()参数。知识准备4.基本库的使用e.find_all_next()与find_next()find_all_next()方法在当前节点之后的节点中搜索,返回列表类型,参数同.find_all()参数。find_next()方法在当前节点之后的节点中搜索,返回第一个符合条件的节点,参数同.find()参数。f.find_all_previous()与find_previous()find_all_previous()方法在当前节点之前的节点中搜索,返回列表类型,参数同.find_all()参数。find_previous()方法在当前节点之前的节点中搜索,返回第一个符合条件的节点,参数同.find()参数。知识准备4.基本库的使用⑤CSS选择器编写CSS时,标签名不加任何修饰,类名前加点,id名前加#,在这里也可以利用类似的方法来筛选元素,使用的方法是soup.select(),返回类型是list。a.通过标签名查找b.通过类名查找c.通过id名查找知识准备4.基本库的使用d.组合查找组合查找编写class文件时,标签名与类名、id名进行组合的原理是一样的,例如,查找p标签时,id等于elephant1的内容,两者需要用空格分开。e.直接子标签查找f.属性查找进行查找时,还可以加入属性元素,属性需要用中括号括起来。注意,属性和标签属于同一节点,所以中间不能加空格,否则会无法匹配。知识准备4.基本库的使用同样,属性仍然可以与上述查找方式组合,不在同一节点的用空格隔开,在同一节点的不加空格。以上的select()方法返回的结果都是列表形式,可以遍历形式输出,并用get_text()方法来获取其内容。任务实施1.确定并分析目标网页架构(1)进入HTTP://beijing.8684.cn网页,即进入北京公交查询页面(2)单击“以数字开头”中的各数字,观察URL的变化,可发现网页URL变化规律为HTTP://beijing.8684.cn/list+数字。(3)单击数字“1”,进入HTTP:///list1页面,在右键单击页面弹出的快捷菜单中,选择“检查”命令,进入检查页面。(4)使用快捷键“Ctrl+Shift+C”,单击下面的“1路”超链接,以网页源码查询方式显示网页内容。(5)单击a标签中的href属性,进入详细信息页面此时仔细观察URL的变化,将会发现详细信息页面的URL变化规律为HTTP://

beijing.8684.cn/+(a标签中的href属性)。因此,在构建URL时,需要获取对应a标签的href属性的内容。现在,可以开始构建爬虫程序了。在PyCharm中新建一个PythonFile,将其命名为beijingbus,导入需要的urllib请求库,代码如下。任务实施2.编写代码(1)构造一个URL,以便获取所有一级页面的URL。可以使用Print打印结果以验证构造,代码如下。结果如下。任务实施2.编写代码(2)创建一个get_page_url方法,并在for循环中调用代码。任务实施2.编写代码结果如下。上面使用了urllib中request.urlopen请求方法获得网页的源代码,使用BeautifulSoup解析库解析网页源码,查找到需要的二级网页超链接,并将其拼接起来。先用find()方法查找源码div标签中class为'list'的数据,再在找到的数据中用find_all()方法获得要查找的URL片段,并用urllib.parse中的urljoin()模块拼接URL。可以使用Print打印结果以验证构造结果。(3)在获得了详细页面的URL后,即可开始进行详细页面解析。创建一个在get_page_url中调用的get_page_info方法,使用urllib.request.

urlopen请求网页源码,并声明使用BeautifulSoup解析源码,代码如下。任务实施2.编写代码在详细信息页面右键单击所弹出的快捷菜单中,选择“检查”命令,随后使用快捷键“Ctrl+Shift+C”选中要爬取的数据,如图2-8所示。

在要爬取的数据上右键单击,在弹出的快捷菜单中选择“Copy”中的“Copyselector”命令,如图2-9所示。通常情况下,使用“Copy”的“Selector”数据提取为空,此时需要手动修改查找路径,缩短路径查找长度。图2-8选中要爬取的数据图2-9选择“Copyselector”命令任务实施2.编写代码在get_page_info方法中,使用BeautifulSoup的select()方法获得需要的公交线路名称、类型、里程等数据,代码如下。任务实施2.编写代码运行结果如下所示。使用BeautifulSoup的find()、find_all()方法爬取更多的相关数据,如需要爬取对应每路公交对应的详细站点。所要爬取的数据如图2-10所示。图2-10爬取北京1路公交车路线结果任务实施2.编写代码在上述公交详细页面中使用快捷键“Ctrl+Shift+C”选中要爬取的数据,查看对应数据的页面代码,结果如图2-11所示。图2-11对应数据的页面代码展示任务实施2.编写代码

在get_page_info方法中,使用BeautifulSoup的select()方法首先定位到class="bus-lzlist"的div元素,然后使用find_all()方法进一步获取其后代元素中的所有a元素,进而使用get_text()方法获取相关站点名称代码如下。为了后面方便数据的存储,我们将获取的数据组织成list,并将其在最后输出中转换为<class'str'>类型的数据,代码如下。运行结果如下所示。任务实施2.编写代码(4)至此,已经获取了想要爬取的数据。下面需要将其保存起来(在本书中,演示了两种存储方式:文件存储方式和MySQL关系数据库存储方式)。①文件存储方式首先,导入必要的Python模块,要写入CSV文件,需要导入Python自带的csv模块;其次,定义CSV文件路径和写入模式,可以采用Python内置的open函数(第一个参数是文件存储地址,第二个参数是存储模式,w表示以覆盖的形式写入并且自动创建未存在的存储文件)。在打开文件时,需要指定文件路径和打开模式;再次,创建CSV文件写入器,在设置好文件路径和打开模式之后,需要创建一个CSV文件写入器。文件写入器可以通过csv模块的writer函数创建;最后,写入数据到CSV文件,writer对象有两种写入方法:writerow和writerows。其中,writerow用于写入一行数据,writerows用于写入多行数据,写入完数据后,需要关闭CSV文件。具体代码如下所示。任务实施2.编写代码在get_page_info方法中,添加代码如下所示。任务实施最后,定义main函数,Python中的main函数充当任何程序的执行点。main函数是启动程序执行的必要入口,因为它只在程序直接运行时执行,而不是在作为模块导入时执行。代码如下。2.编写代码②MySQL关系数据库存储方式首先,在Python中,下载MySQL数据库的驱动pymysql并导入项目,代码如下使用pymysql.connect声明数据库连接(host为数据所在地址,user为数据库用户名,passwd为数据库用户密码,db为所要使用的数据库)。使用cursor对象建立连接,代码如下。任务实施2.编写代码创建save_mysql函数,使用其execute方法对数据库进行操作,并使用commit()提交数据库操作,在数据表不存在的情况下首先实现数据表的创建后,再执行数据的插入操作,如果数据表存在就执行数据的插入操作,对于数据表是否存在,可以通过设计的table_exists函数进行判断,代码如下。最后,在get_page_info函数后添加如下语句,即可实现数据的存储。任务二Task2使用Selenium抓取淘宝网站信息任务描述(1)借助学习论坛、网络视频等网络资源和各种图书资源,学习网络爬虫相关技术,

熟悉爬虫基本库Selenium的使用。(2)使用Selenium基本库获取淘宝网站信息的HTML源代码。(3)使用PyQuery解析库实现淘宝网站信息的获取。

任务目标(1)知道Selenium基本库和PyQuery解析库的使用方法。(2)学会使用Selenium基本库和PyQuery解析库实现淘宝网站信息的爬取。知识准备1.XPATHXpath是一种用在XML文档中定位元素的语言,同样也支持HTML元素的解析。HTML的结构就是树形结构,HTML是根节点,所有的其他元素节点都是从根节点发出的。其他的元素都是这棵树上的节点Node,每个节点还可能有属性和文本。而路径就是指某个节点到另一个节点的路线。Xpath结构示意如图2-12所示。图2-12Xpath结构示意知识准备2.SeleniumSelenium主要是用来做自动化测试的,支持多种浏览器,在爬虫中主要用来解决JavaScript渲染问题。在模拟浏览器进行网页加载时,当使用requests.get(url)无法正常获取网页内容的时候,就可以尝试使用Selenium来爬取网页信息。使用Selenium前,首先需要获取对应浏览器的驱动:谷歌浏览器驱动(ChromeDriver,查看浏览器版本号,下载对应操作系统版本号最接近的驱动),火狐浏览器驱动(geckodriver,不需要先查看浏览器版本号,直接下载对应自己操作系统最新版的驱动即可)或者Edge浏览器驱动(edgedriver,查看浏览器版本号,下载对应操作系统版本号最接近的驱动)。知识准备3.PyQuery虽然XPATH和BeautifulSoup很强大,但语法还是略显不够精练。PyQuery是一个Python的第三方库,具有强大的HTML解析能力,它提供了更加简洁优雅的语法,可以像使用JQuery一样的简洁方便,利用它可以方便解析DOM节点的结构,并通过DOM节点的一些属性快速进行内容提取。任务实施(1).打开淘宝网网页面打开淘宝网页面,搜索商品显示搜索结果最多为100页,想获取每一页的内容,只要将页码从1到100顺序遍历即可。直接在页面跳转文本框中输入要跳转的页码并单击“确定”按钮,即可进入相应的页面,如图2-14所示。图2-14淘宝网页面任务实施(2).获取商品列表首先,导入相关的Selenium模块,代码如下其次,构建一个webdriver对象,使用的浏览器为Chrome。构建一个WebDriverWait对象,它指定了一个等待的最长时间,这里指定的最长时间为10s,指定一个关键字“HUAWEIMate60”,代码如下。定义一个index_page()方法,用于抓取商品列表页。构造一个抓取的URL:/search?initiative_id=staobaoz_20240904&localImgKey=&page={}&q={}'.format(page*44,quote(KEYWORD))。其中,参数q就是要搜索的关键字,在此将此关键字定义为一个变量。任务实施

在搜索获取的“HUAWEIMate60”页面中按“F12”键,进入开发者工具,查看相关节点信息。获取爬取内容的CSS选择器,按快捷键“Ctrl+Shift+C”,单击要爬取的内容,可发现要爬取的内容对应的HTML代码高亮显示,选中代码并右键单击,在弹出的快捷菜单中,选择“Copy”中的“Copyselector”命令,如图2-15所示。图2-15复制选择器(2).获取商品列表任务实施定义爬取的url,并获取该页面,注意对中文搜索关键字的支持,在该方法中调用了自定义get_products()方法用来获取商品的相关信息,代码如下。在get_products()方法的实现中,采用pyquery解析HTML网页,查看商品列表的源代码,如图2-16所示。图2-16商品列表源码(2).获取商品列表任务实施在get_products()方法中可以采用“pyquery对象('父节点子节点')”的方式定位元素,即data('#mainsrp-itemlist.items.item')用来获取<divclass="items">下的所有商品列表。使用pyquery选择得到的节点不管是单个还是多个,类型都是<class'pyquery.pyquery.PyQuery'>,如果得到的是多个节点的对象,则需要进行遍历来获取单个节点对象,这时要注意不能直接遍历多个节点对象,而是要调用多节点对象的items()方法。因遍历的节点对象中依然包含子元素,因此可以使用find()方法来进一步获取信息,此时定位元素传入的参数是CSS选择器。为了将所采集到的数据保存到MongoDB中,get_products()方法实现中调用了自定义save_to_mongo(product)方法,在代码如下。(2).获取商品列表任务实施(2).获取商品列表save_to_mongo(product)方法实现,需要注意,运行代码前需要在本地计算机中安装和启动MongoDB服务,并创建好命名为“taobao”的数据库和命名为“info”的数据集合,代码如下。最后,定义main函数,代码如下。任务实施(2).获取商品列表运行程序需要注意两点:(1)该爬虫程序运行时,淘宝会跳转到如图2-17所示的登录验证页面,要求进行登录验证。图2-17验证页面因此,为了避免该验证页面的跳出,需要配置Chrome启动属性类ChromeOptions,该配置类的参数如表2-5所示。任务实施(2).获取商品列表(2)运行该程序进行数据采集前,请关闭浏览器,否则如果前面有使用chrome浏览器打开的页面,则该程序运行将会报错,错误信息如下。任务三Task3使用Scrapy爬取北京公交信息任务描述(1)借助学习论坛、网络视频等网络资源和各种图书资源,学习网络爬虫相关技术,

熟悉Scrapy的使用。(2)使用Scrapy实现北京公交信息的获取。

任务目标(1)学会使用Scrapy爬取北京公交信息。知识准备(一).Scrapy操作流程如下1.选择一个网站2.创建一个Scrapy项目3.创建一个spider4.定义Item5.编写spider6.提取Item7.存储爬取的数据8.执行项目知识准备(二).应对反爬措施(1)封IP:因为爬虫是通过编写程序来自动化爬取网页信息的,因此在单位时间的请求量较大,且相邻请求时间间隔较为固定,这基本可以判断是爬虫程序,当网站运维人员在对日志进行分析发现同一时间段内某一个或某几个IP访问量特别大,就可以在服务器上对异常IP进行封锁。在Scrapy框架中,可以在settings.py文件中设置下载随机延迟DOWNLOAD_DELAY=random.randint(1,4),还可以在middlewares.py文件中进行IP代理设置,以躲避网站运维人员对IP的封锁。在settings.py文件中设置下载随机延迟,代码如下。下面在middlewares.py文件中,添加自定义类ProxyMiddleware进行IP代理设置,代码如下。知识准备(二).应对反爬措施最后在settings.py文件中启用中间件,代码如下。(2)封User-Agent:User-Agent是客户端的身份标识,而爬虫请求头就是默认的一些很明显的爬虫头python-requests,当爬虫程序运行时,服务器可以识别到这些爬虫请求头,根据事先策略会拒绝响应该请求。此时可以在middlewares.py中写一个user_agent列表并设置随机方法进行规避。在middlewares.py中,添加自定义类UserAgentMiddleware,代码如下。知识准备(二).应对反爬措施然后在settings.py中启用中间件,代码如下。(3)封Cookie:对于每一个访问网页的行为,服务器都会给一个Cookie,用于辨识身份,当某个Cookie访问超过服务器设定的阈值时,就对其进行封禁,过一段时间后再放开封禁。在setings.py文件中可以设置COOKIES_ENABLED=False,禁用Cookie,已进行规避。在setings.py文件中可以配置Cookie,代码如下。(4)验证码验证:常见的网站登录操作都需要验证码,或在爬取的过程中访问次数过多后,触发反爬机制就会自动让请求跳转到一个验证码页面,只有在输入正确的验证码之后才能继续访问网站。python可以通过一些第三方库如(pytesseract,PIL)来对验证码进行处理,还可以借助第三方打码平台提供的“打码”服务,如百度AI开放平台,超级鹰等。知识准备(二).应对反爬措施(5)AJAX异步传输:访问网页的时候服务器将网页框架返回给客户端,可以在不刷新网页的情况下,与服务器进行交互更新网页数据。这些数据在直接发送请求返回的结果中是没有的。AJAX一般是通过XMLHttpRequest对象接口发送请求的,XMLHttpRequest一般被缩写为XHR。点击网络面板上漏斗形的过滤按钮,过滤出XHR请求。通过查看每个请求的访问路径和预览,找到包含目标数据的请求。(6)JS加密请求参数:这是和验证码一样令人头疼的反爬措施,在请求中对部分参数进行加密,或引入新的加密参数,从而保障接口安全,增加接口破解难度。对其需要冷静的分析整个加密请求过程,遇到有加密的JS,先看看能否解密,再根据情况进行JS代码调试任务实施任务实施(1)在命令行窗口中新建一个名为beibus的Scrapy项目,代码及执行结果如下所示。(2)切换到beibus目录,并使用genspider创建一个名称为“bei_bus”的spider,代码及执行结果如下所示。任务实施任务实施(3)使用PyCharm打开beibus项目,其结构如图2-25所示。图2-25beibus项目的结构(4)进入settings,将ROBOTSTXT_OBEY的参数设为True,使爬虫遵守Robots协议,代码如下。(5)将DEFAULT_REQUEST_HEADERS方法的注释去掉,并在其中添加User-Agent属性,该属性的值可以在浏览器的开发者工具“NetWork->Headers”选项卡中复制“User-Agent”的内容,如图2-26所示。图2-26复制“User-Agent”的内容任务实施任务实施用复制的内容作为“值项”添加到“DEFAULT_REQUEST_HEADERS”的“User-Agent”项,代码如下。此配置操作的功能是使爬虫实现模拟浏览器访问的效果,可以作为一种简单的反反爬手段。(6)进入bei_bus.py文件,对start_urls进行修改,代码如下。任务实施任务实施(7)新建一个start_requests()方法(此方法名固定),获得并构建一级网页URL,代码如下。在命令行中执行“scrapycrawlbei_bus”命令进行测试,执行结果如图2-27所示。图2-27获得并构建一级网页URLstart_requests()方法使用format拼接URL,并用yield再次发起网页访问,callback后的方法为回调函数,可以在回调函数parse_index中对详细信息页面的URL进行拼接构建。任务实施任务实施(8)在parse_index()方法中,使用Xpath寻找详细信息页面的URL,并对网址进行拼接,代码如下。extract()方法将匹配到的所有元素提取出来,并以列表形式返回。如果没有找到任何匹配项,则返回一个空列表。urljoin()方法用来拼接URL。在回调函数parse_detail()中进一步对页面进行解析,代码如下。(9)在parse_detail()方法中对详细信息页面进行如下操作。任务实施任务实施(10)进入items.py文件,添加代码以便格式化数据,代码如下。(11)在bei_bus.py文件的parse_detail()方法的末尾添加如下语句,以格式化数据。任务实施任务实施(12)在MySQL的busdb数据库中创建一个businfo表,其格式如图2-28所示。图2-28stu_businfo表的格式(13)在settings.py文件末尾添加如下参数。(14)在pipelines.py文件中,修改class名称为MysqlPipeline,添加初始化方法,将host、user、password、db、charset从settings中读取出来,并通过添加一个connect()方法建立与数据库的连接,代码如下。任务实施任务实施(15)在pipelines.py文件中,添加一个close_spider()方法,用于关闭MySQL数据库连接,代码如下。任务实施任务实施(16)在pipelines.py文件中,实现process_item()方法,用于完成向数据库中插入数据的操作,代码如下。(17)在settings.py中将ITEM_PIPELINES方法的注释去掉,并将其中的内容改为“'beibus.pipelines.MysqlPipeline':300”,后面的数字代表优先级,数字越小,优先级越高,代码如下。任务四Task4创新与拓展任务描述使用Scrapy应用框架实现网络爬虫编程,爬取/网页中相应的信息。(1)爬取页面中新闻的标题名称及相应的详细文字和视频地址信息等。(2)实现多线程网络爬虫编程,爬取“图片”板块中的图片地址信息。

任务目标(1)知道urllib基本库和BeautifulSoup解析库的使用方法。(2)学会使用urllib基本库和BeautifulSoup解析库进行网页中相关信息的爬取。感谢聆听THANKYOUFORLISTEN工业和信息化精品系列教材——大数据技术项目三日志数据采集实践工业和信息化精品系列教材——大数据技术Project3Logdatac

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论