版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
项目一
初识动态网页数据采集与预处理认识大数据采集与预处理目录Content1搭建数据采集与预处理开发环境2数据来源较多项目导言零数据类型丰富数据存储数据处理学习目标零知识目标了解数据采集相关知识;熟悉大数据的来源;掌握大数据处理相关知识;精通PyCharm的安装步骤与掌握PyCharm的使用方法。技能目标具备掌握大数据采集方法的能力;具备大数据预处理方法的作用能力;具备安装和使用PyCharm的能力。技能目标具备精益求精、坚持不懈的精神;具备团队协作能力;具备灵活的思维和处理分析问题的能力;具备责任心。任务1-1:认识大数据采集与预处理壹认识数据来源任务技能信息管理系统、网络数据、机器和传感器数据、科学实验数据、交易数据、人为数据等认识大数据采集通过技术手段进行数据采集。目前,常用的大数据采集方式有网络爬虫采集、日志文件采集、商业工具采集认识大数据预处理修整不完整、含噪声、不一致(的数据,致使采集到的数据大多是不规则、非结构化的,易受到噪声(错误)、不完整、不一致等问题的影响。任务1-1:认识大数据采集与预处理壹1认识数据来源维克托和肯尼斯提出大数据为巨量资料,是一种海量的、飞速增长的、多样化的信息资产。(1)信息管理系统任务1-1:认识大数据采集与预处理壹(2)网络数据移动设备上的软件帮助储存和收集各种数据、互联网中通过社交系统、社交媒体以及搜索引擎等产生海量数据。非结构化数据01邮件文档图片音频视频半结构化数据02XMLJSON任务1-1:认识大数据采集与预处理壹(3)物联网数据
通过传感器技术获取外界的物理、化学和生物等数据信息,在互联网的基础上将网络延伸和扩展,使其在机器与机器之间进行信息交换和通信。0102任务1-1:认识大数据采集与预处理壹(4)科学实验数据实验数据仿真数据任务1-1:认识大数据采集与预处理壹(5)交易数据储蓄卡交易电子商务购物互联网交易数据电子商务购物数据任务1-1:认识大数据采集与预处理壹2认识大数据采集
早期,数据采集通过人工录入、调查问卷、电话随访等人工方式实现。目前,常用的大数据采集方式有网络爬虫采集、日志文件采集、商业工具采集。1.网络爬虫采集通过模拟客户端(浏览器)进行网络请求获取网页中文本数据、图片数据、音频文件、视频文件等数据。任务1-1:认识大数据采集与预处理壹网络爬虫类型通用网络爬虫
可以在整个互联网中进行目标资源的爬取,目标爬取数量巨大,对爬虫程序的性能有较高要求。增量式网络爬虫
用于对页面数据会不断变化的页面进行爬取操作,可以爬取网页中更新的新数据。聚焦网络爬虫可以选择性的在目标定位于主题相关的页面中爬取特定信息。深层页面爬虫深层网页是大部分内容不能通过静态链获取的,隐藏在搜索表单后,只有用户提交一些关键词才能获得的Web页面。例如,用户注册登录前不可见的页面即为深层页面。任务1-1:认识大数据采集与预处理壹网络爬虫用途利用网络爬虫获取网站页面,网站更新时获取页面信息。通过网络爬虫去其他平台获取信息实现业务数据的填充,之后即可根据业务需求对数据进行统计分析。电商平台中抓取同一商品的价格,之后即可提供给用户最实惠的商品价格任务1-1:认识大数据采集与预处理壹爬虫的基本流程任务1-1:认识大数据采集与预处理壹Urllib
Python内置的http网络爬虫库,包含了诸如URL内容抓取、HTTP请求发送、文件读取等多个操作URL的相关模块。Requests
基于Urllib使用Python语音编写的第三方http库,采用Apache2Licensed开源协议开发。Scrapy单击此处输入你的正文,文字是您思想的提炼,为了最终演示发布的良好效果BeautifulSoup
可以从HTML或XML文件中提取数据的Python库。能够通过转换器实现文档导航,查找,修改文档。Xpath
可以应用在包括数据挖掘、信息处理或存储历史数据等一系列的程序中。任务1-1:认识大数据采集与预处理壹2.日志数据采集(1)JS埋点技术采集日志JS埋点技术通过在页面中植入JS代码实现日志数据的收集,包括用户点了哪个按钮、页面之间的跳转次序、停留时长等。JS埋点可以在项目开发过程中手动植入。任务1-1:认识大数据采集与预处理壹(2)Flume组件采集日志可以将大批量的不同数据源的日志数据聚合、移动到数据中心(HDFS)进行存储。任务1-1:认识大数据采集与预处理壹3.商业工具采集
提供多场景数据计算和分析挖掘的科研基础环境,充分结合行业课题的相关数据,并利用大数据技术深入挖掘分析,满足行业大数据的科研工作需求。
日志管理工具,能够对日志数据进行集中采集和准时索引处理,以及简单易用的搜索方式。
简单直观的网页爬虫工具,无需编码即可从许多网站抓取数据。任务1-1:认识大数据采集与预处理壹3认识大数据预处理目前,常用的数据预处理方式有四种,分别是数据清洗、数据集成、数据变换、数据规约。(1)数据清洗通过删除有缺失数据的整行数据或删除有过多缺失数据的变量、以业务知识或经验推测并人工填写填充缺失、利用计算(均值、中位数、众数、随机数等)结果进行填充。任务1-1:认识大数据采集与预处理壹3认识大数据预处理目前,常用的数据预处理方式有四种,分别是数据清洗、数据集成、数据变换、数据规约。(1)数据清洗通过删除有缺失数据的整行数据或删除有过多缺失数据的变量、以业务知识或经验推测并人工填写填充缺失、利用计算(均值、中位数、众数、随机数等)结果进行填充。①缺失值清洗任务1-1:认识大数据采集与预处理壹②格式内容清洗问题处理方式书写格式问题内容修改,将格式统一出现不存在字符问题以半自动校验半人工方式来找出可能存在的问题的数据,并去除或修改数据中不符合格式的字符数据与字段不匹配问题不能直接删除,需要了解具体问题,再根据情况选择清洗方法任务1-1:认识大数据采集与预处理壹③逻辑错误清洗问题处理方式重复数据删除数值不合理选择删除数据或按缺失值对数据值进行处理数据冲突先判断字段与信息,之后在选择删除或修改该数据任务1-1:认识大数据采集与预处理壹④非需求数据清洗非需求数据就是在数据分析时没有可分析的意义或不会被分析的数据,在数据处理操作中,只需将其删除即可。但需要注意的是,不要把重要字段(如学生数据中的姓名、学号等)、不确定是否需要字段(如学生数据中的身高、体重等,在成绩分析时并不需要,但在学生健康情况分析中需要)等删除。任务1-1:认识大数据采集与预处理壹(2)数据集成将互联网中多种分布在不同位置的诸如各类XML文档、HTML文档、电子邮件、文本文件等结构化、半结构化信息等数据源中的数据综合存储在一个位置。任务1-1:认识大数据采集与预处理壹(3)数据规约方式描述维规约作用于多维数组,可以将不需要的整列数据删除实现数据维数的减少,提高计算效率数量规约通过在原数据中选择替代的、较少的数据来减少数据量数据压缩作用于存储空间,在不丢失有用信息的前提下,通过缩减数据量或重新组织结构减小数据的存储空间,高其传输、存储和处理效率任务1-1:认识大数据采集与预处理壹(4)数据转换方式描述光滑通过回归、分类等算法去掉数据中含有的噪声属性构造在指定结构的数据集中,添加新的属性,助提高准确率和对高维数据结构的理解规范化将数据集中的数据按一定比例进行缩放操作,使之落入特定的区间内,常用的数据规范化方法有零-均值标准化、归一化等任务1-1:认识大数据采集与预处理壹2.数据预处理工具Pig使用类似于SQL的面向数据流的语言PigLatin,可以在Hadoop中执行所有的数据处理操作PandasPython的一个数据处理模块,集成了大量的库和多个标准数据模型,主要用于实现数据的处理与分析ELKELK主要用于收集集群日志,从而对日志进行有效的处理,主要由ElasticSearch、Logstash和Kiabana三个开源工具组成。任务1-2:搭建数据采集与预处理开发环境贰1认识PyCharm编码协助;项目代码导航;代码分析;Python重构;支持Django;集成版本控制;图形页面调试器;集成的单元测试。优势任务1-2:搭建数据采集与预处理开发环境贰2安装PyCharm进入PyCharm的官网Step1下载安装包Step2打开安装包Step3激活软件Step6初始化设置Step5选择安装位置Step4任务1-2:搭建数据采集与预处理开发环境贰3使用PyCharm任务1-2:搭建数据采集与预处理开发环境贰快捷键描述Ctrl+/行注释/取消行注释Ctrl+Alt+L根据模板格式对代码格式化Ctrl+Alt+SPyCharm设置Ctrl+D复制当前行或者所选代码块Ctrl+Y删除光标所在位置行Ctrl+F当前文件内快速查找代码Ctrl+Shift+F指定文件内寻找路径Ctrl+R当前文件内代码替代Ctrl+Shift+R指定文件内代码批量替代Shift+F10运行Alt+Shift+F10运行指定文件Shift+F9调试程序Shift+F6重命名F11切换标记F5拷贝F6移动创建项目Step1在项目中创建py文件Step2编辑Pyhon代码Step3运行代码Step4配置Pycharm完成PyCharm中Python环境的配置并进行项目的创建。任务1-2:搭建数据采集与预处理开发环境贰与您共同成长项目二
动态网页数据采集目录Content1使用Requests库完成“浪潮云说”网页数据采集2使用Urllib模块完成“新闻动态”网页数据采集项目导言零
在实际的开发中,所需数据是各种各样的,虽然在网络上有许多开源的数据集,但开源的数据集不一定符合我们的项目需求,因此项目需要的数据集需要主动获取。数据采集是数据分析必不可少的一环,这个时候学会数据采集的方法就显得尤为重要,本项目将使用Python相关http请求库完成网页数据的采集。学习目标零知识目标了解Urllib和Requests库相关概念熟悉Urllib和Requests库的方法掌握Urllib库中request模块使用精通动态网页数据采集的方法技能目标具备Urllib库相关模块的使用能力具备安装Requests库的能力具备使用Requests库完成网页数据采集的能力具备精通网页数据采集的能力素养目标具备善于发现和总结问题能力具备较强的学习能力和适应能力具备较强的沟通表达能力任务2-1:使用Urllib模块完成“新闻动态”网页数据采集壹request模块任务技能urlopen()、Request()、urlretrieve()error模块URLError、HTTPErrorparse模块urlparse()、urljoin()、quote()、unquote()任务2-1:使用Urllib模块完成“新闻动态”网页数据采集壹1request模块在Urllib库中,request是一个用于实现http请求模拟的模块,能够完成页面抓取、Cookie设置等工作。目前,request模块包含多个http请求方法。方法描述urlopen()页面获取Request()设置请求的相关参数urlretrieve()文件下载任务2-1:使用Urllib模块完成“新闻动态”网页数据采集壹(1)urlopen()urlopen()是request模块中不可或缺的一种方法,主要用于实现页面获取,通过指定url地址即可向页面发送请求,并以HTTPResponse类型的对象作为响应将页面内容返回。0102urlopen()方法包含参数参数描述url指定目标网站的URLdata指定表单数据,该参数默认为None,此时urllib使用get方法发送请求,当给参数赋值后,urllib使用post发送请求,并在该参数中携带表单信息timeout用来指定请求的等待时间,若超过指定时间还没获得响应,则抛出一个异常任务2-1:使用Urllib模块完成“新闻动态”网页数据采集壹
HTTPResponse对象方法方法描述read()获取数据readline()按行获取数据readlines()获取数据,并以行列表形式返回getcode()获取状态码geturl()获取url路径decode()数据解码getheaders()获取http请求头信息,当接收属性后,会返回头部信息中属性对应的值任务2-1:使用Urllib模块完成“新闻动态”网页数据采集壹(2)Request()在使用urlopen()方法对页面进行访问时,并不能对请求方式、请求头信息等请求参数进行设置,这时为了提高urlopen()方法的全面性,request模块提供了一个Request()方法,能够通过请求参数创建Request对象,并将该对象作为urlopen()方法的参数完成页面请求。参数描述url指定目标网站的URLdata访问页面时携带的数据headers请求头origin_req_host请求方的host名称或者IP地址unverifiable请求方的请求无法验证method请求方式设置Request()方法包含参数任务2-1:使用Urllib模块完成“新闻动态”网页数据采集壹headers参数包含属性属性描述User-Agent操作系统和浏览器的名称和版本accept浏览器端可以接受的媒体类型Accept-Encoding编码方法Accept-Language支持语言method参数包含属性GET获取POST提交HEAD获取头部信息PUT提交信息,原信息被覆盖DELETE提交删除请求任务2-1:使用Urllib模块完成“新闻动态”网页数据采集壹(3)urlretrieve()通过urlopen()方法,只能获取页面中的文本信息,当面对图片文件、音视频文件、文本文件等内容时,request模块提供了一个urlretrieve()方法,能够实现文件的下载操作。urlretrieve()方法包含参数参数描述url文件路径filename文件名称reporthook文件访问的超时时间,单位为秒data文件访问时携带的数据任务2-1:使用Urllib模块完成“新闻动态”网页数据采集壹2error模块在Urllib中,为了避免发送请求时出现访问不到服务器、访问被禁止等错误,Urllib提供了一个用于定义异常的error模块。目前,error模块包含了两个常用方法。方法描述URLError网络地址异常HTTPErrorhttp错误异常任务2-1:使用Urllib模块完成“新闻动态”网页数据采集壹(1)URLError在error模块中,URLError提供了多个URL地址相关的异常,如URL地址错误、网络错误等,并且在触发异常后,可通过“reason”属性查看引发异常的原因。URLError的语法格式:from
urllib
import
errortry:......except
error.URLErrorase:e.reason......任务2-1:使用Urllib模块完成“新闻动态”网页数据采集壹(2)HTTPErrorHTTPError与URLError基本相同,不同之处在于HTTPError除了“reason”属性外,还存在一些其他属性。HTTPError属性属性描述code状态码reason错误原因headers响应头任务2-1:使用Urllib模块完成“新闻动态”网页数据采集壹3parse模块在Urllib中,parse模块主要用于对指定的URL进行操作,如解析URL、合并URL等。parse模块常用方法方法描述urlparse()URL的解析urljoin()URL的拼接quote()编码unquote()解码任务2-1:使用Urllib模块完成“新闻动态”网页数据采集壹(1)urlparse()urlparse()方法用于将接收的URL路径解析成协议、域名、路径、参数、查询条件以及锚点等六个部分,并以元组的格式返回,在使用时urlparse()方法接收三个参数。参数描述urlURL地址scheme默认协议allow_fragments是否忽略锚点urlparse()方法参数任务2-1:使用Urllib模块完成“新闻动态”网页数据采集壹urlparse()的语法格式:fromurllibimportparseparse.urlparse(urlstring,scheme='',allow_fragments=True)urlparse()方法返回结果包含字段字段描述scheme协议netloc域名path路径params参数query查询条件fragment锚点任务2-1:使用Urllib模块完成“新闻动态”网页数据采集壹(2)urljoin()urljoin()方法用于URL路径的连接,在使用时会接收两个路径参数,之后会连接两个URL路径,连接时会使用第一个参数补齐第二个参数的缺失部分,当两个参数均为完整路径时,则以第二个为主。urljoin()的语法格式:fromurllibimportparseparse.urljoin(url1,url2)任务2-1:使用Urllib模块完成“新闻动态”网页数据采集壹(3)quote()、unquote()quote()和unquote()方法是一对功能相对的方法,其中,quote()方法用于对URL路径中包含的中文进行编码操作,而unquote()方法则用于对quote()方法编码后的内容执行解码操作。语法格式:fromurllibimportparseparse.quote(url)parse.unquote(url)2-1:任务实施壹抓取页面内容输入网站地址代码查看工具定位到新闻信息区域,分析代码结构创建NewsInformation.py文件读取Response对象中包含的页面内容通过error模块的URLError定义网络地址异常,将代码封装到getHTML函数中完成新闻动态页面数据采集任务2-2:使用Requests库完成“浪潮云说”网页数据采集贰Requests简介及安装任务技能Requests是一个使用Python编写的http库Requests库主要有pip安装、wheel安装和源码安装等方式Requests基本使用get()、post()、head()、put()、patch()、delete()Requests高级使用会话对象、文件上传、超时设置、异常处理、证书认证、代理设置任务2-2:使用Requests库完成“浪潮云说”网页数据采集贰1Requests简介及安装
在Python中,除了上述的Urllib库外,Requests库同样被用于数据的采集,Requests是一个使用Python编写的http库,基于Urllib建立,为解决Urllib存在的安全缺陷以及代码冗余等问题而被推出,方便快捷,可以大大减少工作量,完全满足开发的需要。任务2-2:使用Requests库完成“浪潮云说”网页数据采集贰用wheel方式安装Requests库Step1输入/~gohlke/pythonlibs/进入Requests的wheel文件下载地址Step3在命令窗口输入“pipinstall+wheel文件路径”Step2单击指定的文件格式进行wheel文件的下载Step4进入Python交互式命令行,输入“importrequests”代码,没有出现错误说明Requests库安装成功任务2-2:使用Requests库完成“浪潮云说”网页数据采集贰2Requests基本使用HTTP请求类型类型描述GET向服务端发送获取信息请求POST将数据发送到服务器以创建或更新资源HEAD向服务端请求HTTP头信息PUT向服务器端发送数据,从而更新信息PATCH对已知资源进行局部更新DELETE向服务端发送删除资源请求任务2-2:使用Requests库完成“浪潮云说”网页数据采集贰Requests库请求方法方法描述get()获取HTML网页的主要方法post()获取HTML网页头信息的方法head()向HTML网页提交post请求的方法put()向HTML网页提交PUT请求的方法patch()向HTML网页提交局部修改请求delete()向HTML页面提交删除请求任务2-2:使用Requests库完成“浪潮云说”网页数据采集贰(1)get()get()方法包含参数参数描述url页面的URL链接paramsURL额外参数,以字典或字节序列形式作为参数增加到URL中**kwargs控制访问的参数任务2-2:使用Requests库完成“浪潮云说”网页数据采集贰**kwargs包含参数参数描述data字典、字节序列或文件对象,作为Request的内容jsonJSON格式的数据,作为Request的内容headers字典,HTTP定制头cookie字典或CooKiJar,作为Request中的cookieauth元祖,支持HTTP认证功能files字典类型,作为传输文件timeout超时时间,秒为单位proxies字典类型,设定访问代理服务器,可以增加登录认证allow_redirects重定向开关stream获取内容立即下载开关verity认证SSL证书开关cert本地SSL证书路径任务2-2:使用Requests库完成“浪潮云说”网页数据采集贰Response对象包含属性属性描述status_code状态码text字符串形式页面内容content二进制形式页面内容encoding从HTTPheader中猜测的响应内容编码方式apparent_encoding从内容中分析出的响应内容编码方式cookies响应的cookieurlURL路径headers请求头信息任务2-2:使用Requests库完成“浪潮云说”网页数据采集贰常用状态码状态码描述200请求成功301请求的文档在其他地方,新的URL在Location头中给出,浏览器应该自动地访问新的URL400请求有语法错误,不能被服务器所理解401请求未经授权403服务器收到请求,但是拒绝提供服务404请求资源不存在500服务器发生不可预期的错误503服务器当前不能处理客户端的请求,一段时间后可能恢复正常任务2-2:使用Requests库完成“浪潮云说”网页数据采集贰(2)post()post()方法包含参数参数描述url页面的URL链接data字典、字节序列或文件对象,作为Request的内容jsonJSON格式的数据,作为Request的内容**kwargs控制访问的参数任务2-2:使用Requests库完成“浪潮云说”网页数据采集贰(3)head()语法格式:importrequestsrequests.head(url,**kwargs)任务2-2:使用Requests库完成“浪潮云说”网页数据采集贰(4)put()语法格式:importrequestsrequests.put(url,data=None,**kwargs)任务2-2:使用Requests库完成“浪潮云说”网页数据采集贰(5)patch()语法格式:importrequestsrequests.patch(url,data=None,**kwargs)任务2-2:使用Requests库完成“浪潮云说”网页数据采集贰(6)delete()语法格式:importrequestsrequests.delete(url,**kwargs)任务2-2:使用Requests库完成“浪潮云说”网页数据采集贰method包含参数值参数值描述GET获取HTML网页POST获取HTML网页头信息HEAD向HTML网页提交post请求PUT向HTML网页提交PUT请求PATCH向HTML网页提交局部修改请求DELETE向HTML页面提交删除请求任务2-2:使用Requests库完成“浪潮云说”网页数据采集贰3Requests高级使用会话对象文件上传异常处理代理设置超时设置证书认证任务2-2:使用Requests库完成“浪潮云说”网页数据采集贰(1)会话对象会话对象能够跨请求保持某些参数,也会在同一个Session实例发出的所有请求之间保持cookie,除此之外它还可以用来提升网络性能。语法格式:importrequestssession=requests.Session()session.get()任务2-2:使用Requests库完成“浪潮云说”网页数据采集贰(2)文件上传
在使用post()方法提交数据时,不仅可以提交文本数据,还可以通过files参数的设置提交文件数据,实现文件的上传操作。语法格式:importrequests#获取文件files={'file':open('文件地址','打开方式')}#文件上传requests.post(url,files=files)任务2-2:使用Requests库完成“浪潮云说”网页数据采集贰(3)超时设置
在Requests中,可通过timeout参数设置超时时间,单位为秒。语法格式:importrequestsrequests.get(url,timeout=0.1)任务2-2:使用Requests库完成“浪潮云说”网页数据采集贰(4)异常处理
在使用Requests库发送HTTP请求时,会出现访问失败而抛出异常的情况,这时为了能够快速的确定是哪种错误,可通过不同的方法进行判断。语法格式:importrequeststry:response=requests.get(url,timeout=0.5)exceptexceptions.Timeout:#异常处理代码块任务2-2:使用Requests库完成“浪潮云说”网页数据采集贰异常处理方法方法描述ConnectionError网络连接错误异常HTTPErrorHTTP错误异常URLRequiredURL缺失异常TooManyRedirects超过最大重定向次数,产生重定向异常ConnectTimeout连接远程服务器超时异常Timeout请求URL超时异常任务2-2:使用Requests库完成“浪潮云说”网页数据采集贰(5)证书认证
Requests为了解决证书自动验证功能问题,可通过添加verify参数并设置参数值将该功能关闭。语法格式:importrequestsrequests.get(url,,verify=False)任务2-2:使用Requests库完成“浪潮云说”网页数据采集贰(6)代理设置
在进行数据采集时,由于网站内容的增多,大规模爬取网页数据时,频繁的网页请求会出现登录认证、验证码验证,甚至禁止当前IP访问页面等情况,时可以通过proxies参数设置代理解决。语法格式:importrequests#IP列表proxies={"http":"0:3128","https":"1:3129",}#通过代理使用不同的IP访问页面requests.get(url,proxies=proxies)2-2:任务实施贰创建Cloudtheory.py文件并导入项目所需的相关模块输入“/1635/”,打开浪潮云说页面打开代码查看工具,打开一个响应,查看请求头信息分析页面结构新建一个名为url的变量,使用get()方法发送一个请求,传入请求头通过text属性获取Response包含的页面内容将页面内容抓取代码封装到getHTML函数中完成浪潮云说界面数据采集与您共同成长项目三
动态网页数据解析目录Content1
使用BeautifulSoup解析“浪潮云说”网页数据2
使用Xpath解析“新闻动态”网页数据项目导言零请求部分解析部分网络爬虫程序通过模拟浏览器发送请求并获取响应通过对响应后返回的页面内容进行解析,并通过定位到数据所在元素获取数据,最终实现网页数据的采集学习目标零知识目标了解Xpath和BeautifulSoup相关概念熟悉Xpath节点定位掌握Xpath数据提取精通BeautifulSoup使用技能目标具备Xpath解析文档和提取数据的能力具备安装BeautifulSoup的能力具备使用BeautifulSoup提取页面数据的能力具备网页数据解析与提取的能力素养目标具备良好的沟通能力和团队合作精神具备强烈的责任感和积极的工作态度具备较强的执行能力任务3-1:使用Xpath解析“新闻动态”网页数据壹Xpath简介任务技能lxml解析库安装、lxml解析库使用定位元素定位、属性定位数据提取属性值提取、元素包含内容提取任务3-1:使用Xpath解析“新闻动态”网页数据壹1Xpath简介Xpath,英文全称为“MLPathLanguage”,是一种通过元素和属性遍历定位XML文档中信息的路径语言。尽管Xpath用于XML文档内容的搜索,但同样可以作用于HTML等半结构化文档。Xpath选择功能十分强大,通过简明的路径表达式,能够使用在大多数需要定位节点的场景中,不仅可以实现节点的定位外,Xpath还可以实现字符串、数值、时间的匹配以及节点、序列的处理等。任务3-1:使用Xpath解析“新闻动态”网页数据壹(1)lxml解析库安装Step1输入“/project/lxml/#files”,进入lxml源码文件下载界面选择符合Python版本的lxml源码文件并下载使用pip命令通过lxml源码文件进行lxml的安装打开Python的交互环境,输入importlxml,如果不报错,就表示安装成功Step2Step3Step4任务3-1:使用Xpath解析“新闻动态”网页数据壹(2)lxml解析库使用etree模块常用方法方法描述HTML()解析HTML文档XML()解析XML文档parse()解析文件tostring()将节点对象转化为bytes类型xpath()实现标签的定位和内容的捕获任务3-1:使用Xpath解析“新闻动态”网页数据壹①HTML()HTML方法包含参数参数描述text字符串类型的HTML文本parser解析器base_url网站根地址,用于处理网页资源的相对路径parser可选参数值参数值描述XMLParser解析XMLXMLPullParser利用事件流模型来解析XMLHTMLParser解析HTMLHTMLPullParser利用事件流模型来解析HTML任务3-1:使用Xpath解析“新闻动态”网页数据壹②
XML()XML()与HTML()方法基本相同,不同之处在于HTML主要用于对HTML文档内容进行解析,而XML()则用于解析XML格式文档。语法格式:fromlxmlimportetreeetree.XML(text,parser=None,base_url=None)任务3-1:使用Xpath解析“新闻动态”网页数据壹③parse()XML()和HTML()主要使用在数据采集之后,可以解析Requests、Urllib的request模块发送请求后响应的XML或HTML内容,而parse()方法则用于对本地文件中包含的内容进行解析。语法格式:fromlxmlimportetreeetree.parse(source,parser=None,base_url=None)任务3-1:使用Xpath解析“新闻动态”网页数据壹parse()方法包含参数参数描述source文件路径,包含xml、html、txt等格式文件parser解析器base_url网站根地址,用于处理网页资源的相对路径任务3-1:使用Xpath解析“新闻动态”网页数据壹④tostring()tostring()方法主要作用于Element对象,可以将Element对象包含内容转换为bytes类型。语法格式:fromlxmlimportetreeetree.tostring(Element,pretty_print=True,encoding="utf-8")任务3-1:使用Xpath解析“新闻动态”网页数据壹tostring()方法包含参数参数描述ElementElement对象pretty_print格式化输出,值为True或Falseencoding编码格式任务3-1:使用Xpath解析“新闻动态”网页数据壹⑤xpath()XPath()即为lxml的主要方法,可以解析XML或HTML文档并从中提取指定内容,其同样作用于Element对象。在使用时,其可以接收路径表达式提取数据,并将结果以Element对象列表的形式返回。语法格式:fromlxmlimportetreeetree.xpath(path,namespaces=None,extensions=None,smart_strings=True)任务3-1:使用Xpath解析“新闻动态”网页数据壹xpath方法包含参数参数描述path路径表达式namespaces名称空间extensions扩展smart_strings是否开启字符串的智能匹配任务3-1:使用Xpath解析“新闻动态”网页数据壹2定位(1)元素定位符号和方法描述/从根节点选取//从匹配选择的当前节点选择文档中的节点,不考虑它们的位置.选择当前节点..选取当前节点的父节点|设置多个路径表达式*匹配任何元素节点nodeName选取名为nodeName的所有节点nodeName[n]选取名为nodeName第n个节点nodeName[last()]选取名为nodeName最后一个节点nodeName[last()-n]选取名为nodeName倒数第n+1个节点nodeName[position()<n]选取名为nodeName前n-1个节点node()匹配任何类型的节点元素定位常用符号和方法任务3-1:使用Xpath解析“新闻动态”网页数据壹常用的元素定位表达式表达式描述//div从根节点选取所有div元素//div/p/a[2]选取第二个a元素//div/p[1]|//div/p[last()]选取第一个、最后1个p元素//div/*选取所有div节点下的任意元素节点任务3-1:使用Xpath解析“新闻动态”网页数据壹节点关系常用属性属性描述ancestor选取当前节点的所有先辈(父、祖父等)ancestor-or-self选取当前节点的所有先辈(父、祖父等)以及当前节点本身self选取当前节点child选取当前节点的所有子元素descendant选取当前节点的所有后代元素(子、孙等)descendant-or-self选取当前节点的所有后代元素(子、孙等)以及当前节点本身parent选取当前节点的父节点following选取文档中当前节点的结束标签之后的所有节点following-sibling选取当前节点之后的所有同级节点preceding选取文档中当前节点的开始标签之前的所有节点preceding-sibling选取当前节点之前的所有同级节点attribute选取当前节点的所有属性任务3-1:使用Xpath解析“新闻动态”网页数据壹属性定位常用符号符号描述@属性选取包含指定属性的元素@*选取包含任意属性的元素@[条件表达式]选取属性符合指定值的元素(2)属性定位任务3-1:使用Xpath解析“新闻动态”网页数据壹Xpath中常用的运算符关系运算符逻辑运算符算术运算符任务3-1:使用Xpath解析“新闻动态”网页数据壹3数据提取(1)属性值提取语法格式:nodeName/@属性在Xpath中,定位到节点后,只需通过“@属性”的方式获取该节点包含指定属性的属性值,并以列表的形式返回。任务3-1:使用Xpath解析“新闻动态”网页数据壹(2)元素包含内容提取语法格式:nodeName/text()相比于属性值的提取,元素包含内容的提取通过text()方法实现,内容包含文本、换行符、制表符等,并且结果同样以列表的形式返回。3-1:任务实施壹使用Xpath定位到每条新闻信息所在节点查看网页确认被采集的信息从lxml库导入etree模块,解析Urllib库获取的HTML文档通过tostring()方法将解析后返回的Element对象转换成bytes类型,验证是否抓取成功定位数据所在节点,并通过属性值提取或文本内容提取的方式实现电影名称、电影简介、电影评分和评价人数的获取将HTML文档解析代码封装为函数,添加获取下一页功能,并将数据存储到本地CSV文件中完成数据的解析和提取任务3-2:使用BeautifulSoup解析“浪潮云说”网页数据贰BeautifulSoup安装任务技能BeautifulSoup使用Python的pip工具安装BeautifulSoup有四个版本,在安装时只需在BeautifulSoup后添加版本号即可安装指定版本BeautifulSoup使用标签选择器、方法选择器、CSS选择器任务3-2:使用BeautifulSoup解析“浪潮云说”网页数据贰1BeautifulSoup安装Step1打开命令窗口,输入“pipinstallbeautifulsoup4”下载命令,进行BeautifulSoup4下载安装Step2使用“importbs4”方式导入BeautifulSoup解析库验证安装是否成功,不出现错误即可说明安装成功任务3-2:使用BeautifulSoup解析“浪潮云说”网页数据贰常见的解析器解析器优势劣势Python标准库Python的内置标准库执行速度适中文档容错能力强Python(2.7.3or3.2.2)前的版本中文档容错能力差lxmlHTML解析器速度快文档容错能力强需要安装C语言库lxmlXML解析器速度快唯一支持XML的解析器需要安装C语言库html5lib最好的容错性以浏览器的方式解析文档生成HTML5格式的文档速度慢任务3-2:使用BeautifulSoup解析“浪潮云说”网页数据贰2BeautifulSoup使用语法格式:importbs4bs4.BeautifulSoup(markup,parser)与Xpath解析器相同,BeautifulSoup同样不能直接用于网页内容的采集,其需要与Urllib、Requests等爬虫库结合使用。在使用时,通过BeautifulSoup()方法实现文档的解析。任务3-2:使用BeautifulSoup解析“浪潮云说”网页数据贰BeautifulSoup()方法包含参数参数描述markup文档parser解析器parser参数值参数值描述html.parserPython标准库lxmllxmlHTM解析器xmllxmlXML解析器html5libhtml5lib任务3-2:使用BeautifulSoup解析“浪潮云说”网页数据贰(1)标签选择器语法格式:importbs4soup=bs4.BeautifulSoup(markup,parser).node.parameter标签选择器主要用于通过文档中包含的标签进行元素的定位,有普通节点、子节点、子孙节点、父节点、兄弟节点等,并在定位节点后实现具体信息的获取。任务3-2:使用BeautifulSoup解析“浪潮云说”网页数据贰标签选择器参数参数描述name节点名称,通过“.”连接node关系节点获取属性,如兄弟节点、父节点等parameter数据提取属性parameter参数包含属性属性描述name获取节点的名称attrs['属性']获取节点所有属性string获取节点内容任务3-2:使用BeautifulSoup解析“浪潮云说”网页数据贰node参数包含属性属性描述contents直接子节点children子孙节点descendants所有子孙节点parent节点的父节点parents节点的祖先节点next_sibling节点下一个兄弟节点previous_sibling节点上一个兄弟节点next_siblings节点后面的全部兄弟节点previous_siblings节点前面的全部兄弟节点任务3-2:使用BeautifulSoup解析“浪潮云说”网页数据贰(2)方法选择器相比于标签选择器,只能通过标签名称逐级进行节点的定位,设置较为繁琐,灵活性不好,而方法选择器可以通过指定的参数设置标签以及相关属性实现节点的直接定位,实现节点包含内容的获取。BeautifulSoup常用方法选择器参数描述name节点名称,通过“.”连接node关系节点获取属性,如兄弟节点、父节点等任务3-2:使用BeautifulSoup解析“浪潮云说”网页数据贰语法格式:importbs4soup=bs4.BeautifulSoup(markup,parser)soup.find(name,attrs,recursive,text,**kwargs)soup.find_all(name,attrs,recursive,text,limit,**kwargs)在BeautifulSoup中,find()和find_all()方法选择器可以通过节点名称和节点包含属性与属性值在文档中查询符合条件的节点内容。任务3-2:使用BeautifulSoup解析“浪潮云说”网页数据贰(3)CSS选择器常用的CSS选择器CSS选择器描述select('title')获取标签为title的所有节点select('.sister')获取class为sister的所有节点select('#link')获取id为link的节点select('p#link')获取p节点下id为link的节点select('a[class="sister"]')获取class为sister的所有a节点select('pa[class="sister"]')获取p节点下class为sister的所有a节点3-2:任务实施贰完成数据的解析和提取通过循环语句遍历每个节点获取数据查看网页确认被采集的信息导入BeautifulSoup,解析Requests库获取的HTML文档通过find_all()方法定位到所有的云说标题节点和所有的发布时间节点,获取标签包含的内容将文档解析并提取数据的代码封装到parser函数,并添加采集下一页的代码导入csv模块,将采集到的数据存储到本地CSV文件中与您共同成长项目四
基于框架实现动态网页数据采集与存储目录Content1使用Scrapy框架完成新闻公告页面数据采集与存储项目导言零
Scrapy是Python的一个应用Twisted异步处理的第三方应用程序框架,用户只需要定制开发几个模块即可实现一个爬虫,用来快速爬取网站并从页面中抓取网页内容以及各种图片。学习目标零知识目标了解Scrapy相关概念熟悉Scrapy框架的设置掌握文本解析与内容存储精通内存存储逻辑技能目标具备项目创建的能力具备使用Scrapy操作命令创建Scrapy项目的能力具备解析网页中文本的能力具备网页数据采集能力素养目标具有较好的团队精神具有高度的责任感具备很强的学习和沟通能力具有清晰思路、较强的逻辑思维能力任务4-1:使用Scrapy框架完成新闻公告页面数据采集与存储壹任务技能Scrapy简介及安装Scrapy简介、Scrapy安装、Scrapy项目结构、Scrapy项目构建流程Scrapy操作指令在操作系统的任何位置均可以使用的全局命令应用于Scrapy项目中的项目命令字段定义及Scrapy设置自定义字段、项目设置、通用参数设置文本解析XPath选择器、CSS选择器内容存储文件存储、管道存储任务4-1:使用Scrapy框架完成新闻公告页面数据采集与存储壹1Scrapy简介及安装Scrapy是Python的一个第三方应用程序框架,主要用于爬取网站并从页面中提取结构数据。(1)Scrapy简介任务4-1:使用Scrapy框架完成新闻公告页面数据采集与存储壹ItemPipeline管道,负责处理Spider中获取到的Item,并进行详细分析、过滤、存储等内容的后期处理。Spiders爬虫,主要用于对Response进行处理,从特定的网页中分析提取数据,并在获取Item字段需要的数据后,将网络地址提交给引擎,再次进入Scheduler。Scheduler即调度器,接收ScrapyEngine的Request请求,多个请求会在整理排序后,等待ScrapyEngine需要时返回给ScrapyEngine。Scrapy
EngineScrapy引擎,能够进行系统数据流的处理、事务的触发等,完成Spiders、ItemPipeline、Downloader、Scheduler等模块之间数据的传输、信号的传递。Downloader下载器,通过ScrapyEngine的Requests请求下载网页内容,并返回包含网页内容的Response,然后由ScrapyEngine提交给Spiders进行处理。Scrapy框架任务4-1:使用Scrapy框架完成新闻公告页面数据采集与存储壹(2)Scrapy安装Scrapy属于Python的第三方框架,可以使用pip安装、wheel安装和源码安装等安装方式,并且在通过pip方式安装Scrapy时,会自动安装lxml、pyOpenSSL、Twisted、PyWin32等相关的依赖库。打开cmd命令窗口,输入“pipinstallscrapy”进入Python的交互式命令行,通过import引入Scrapy进行安装验证Step1Step2任务4-1:使用Scrapy框架完成新闻公告页面数据采集与存储壹(3)Scrapy项目结构任务4-1:使用Scrapy框架完成新闻公告页面数据采集与存储壹01030405060702items.py字段定义文件scrapy.cfg项目配置文件middlewares.py中间件设置文件spiders爬虫文件存储目录settings.py项目设置文件pipelines.py项目管道文件MySpider.py爬虫文件任务4-1:使用Scrapy框架完成新闻公告页面数据采集与存储壹(4)Scrapy项目构建流程通过Xpath或CSS选择器解析XML文档6文本解析在爬虫文件中,根据需求选择通用参数,爬取页面数据5通用参数设置4项目设置修改settings.py文件对项目名称、并发请求、爬取策略、项目管道等进行设置3爬虫文件创建通过genspider命令在spiders目录中创建爬虫文件2字段定义修改items.py文件代码,明确抓取的目标字段7修改pipelines.py代码,通过管道的设置实现爬取内容的存储数据存储1项目创建通过startproject命令创建爬虫项目任务4-1:使用Scrapy框架完成新闻公告页面数据采集与存储壹2Scrapy操作指令全局命令命令描述-h查看可用命令的列表fetch使用Scrapydownloader提取的URLrunspider未创建项目的情况下,运行一个编写好的spider模块settings规定项目的设定值shell给定URL的一个交互式模块startproject用于创建项目version显示Scrapy版本view使用Scrapydownloader提取URL并显示在浏览器中的内容genspider使用内置模板在spiders文件下创建一个爬虫文件bench测试scrapy在硬件上运行的效率任务4-1:使用Scrapy框架完成新闻公告页面数据采集与存储壹项目命令命令描述crawl用来使用爬虫抓取数据,运行项目check检查项目并由crawl命令返回list显示本项目中可用爬虫(spider)的列表edit可以通过编辑器编辑爬虫parse通过爬虫分析给定的URL任务4-1:使用Scrapy框架完成新闻公告页面数据采集与存储壹3字段定义及Scrapy设置(1)自定义字段
在进行网页内容的爬取时,明确目标是不可或缺的一个步骤。在Scrapy中,通过修改items.py文件中代码进行字段的自定义操作即可明确爬取的目标。语法格式:#导入scrapy模块importscrapy#定义包含scrapy.Item参数的类classScrapynameItem(scrapy.Item):#definethefieldsforyouritemherelike:#自定义字段name=scrapy.Field()#通过提示pass任务4-1:使用Scrapy框架完成新闻公告页面数据采集与存储壹除了通过“scrapy.Field()”方法外,还可以通过import命令从Scrapy中先引入Item和Field,之后直接使用即可。语法格式:#导入scrapy的Item参数和Field方法fromscrapyimportItem,Field#定义包含scrapy.Item参数的类classScrapynameItem(Item):#自定义字段name=Field();#通过提示pass任务4-1:使用Scrapy框架完成新闻公告页面数据采集与存储壹items.py文件中包含的内容仅为字段的定义,还需在MySpider.py文件中通过类名称引入items.py文件中class定义的类并实例化字段对象,之后通过“对象[字段名称]=值”的方式进行赋值操作。语法格式:importscrapy#导入ScrapynameItem类fromScrapyName.itemsimportScrapynameItemclassMyspiderSpider(scrapy.Spider):defparse(self,response):item=ScrapynameItem()item["name"]="值"任务4-1:使用Scrapy框架完成新闻公告页面数据采集与存储壹(2)项目设置Scrapy中项目的设置通过settings.py文件,通过指定项目属性和属性值定义设置项目,包括项目名称设置、并发请求设置、爬虫中间件设置等。任务4-1:使用Scrapy框架完成新闻公告页面数据采集与存储壹(3)通用参数设置通用spider参数参数描述scrapy.Spider通用SpiderCrawlSpider指定规则爬取网站XMLFeedSpider通过迭代节点分析XML内容任务4-1:使用Scrapy框架完成新闻公告页面数据采集与存储壹(1)XPath选择器4文本解析符号和方法描述nodeName选取此节点的所有节点/根节点//选择文档中的所有匹配节点.当前节点..当前节点的父节点@选取属性*匹配任何元素节点@*匹配任何属性节点Node()匹配任何类型的节点text()获取文本内容Xpath路径表达式包含符号和方法任务4-1:使用Scrapy框架完成新闻公告页面数据采集与存储壹在Scrapy中,路径表达式通过xpath()方法应用。语法格式:importscrapy#从scrapy.selector中导入Selectorfromscrapy.selectorimportSelectorclassMyspiderSpider(scrapy.Spider):name='MySpider'allowed_domains=['域名列表']start_urls=['网址列表']defparse(self,response):#构造Selector实例sel=Selector(response)#解析HTMLxpath=sel.xpath('表达式')pass任务4-1:使用Scrapy框架完成新闻公告页面数据采集与存储壹
在Scrapy中,CSS路径表达式通过css()方法应用。(2)CSS选择器语法格式:importscrapy#从scrapy.selector中导入Selectorfromscrapy.selectorimportSelectorclassMyspiderSpider(scrapy.Spider):name='MySpider'allowed_domains=['域名列表']start_urls=['网址列表']defparse(self,response):#构造Selector实例sel=Selector(response)#解析HTMLcss=sel.css('表达式')pass任务4-1:使用Scrapy框架完成新闻公告页面数据采集与存储壹(1)文件存储5内容存储语法格式:scrapycrawl爬虫文件名称path在Scrapy中,可以使用crawl命令的“-o”参数,在运行Scrapy项目时将数据保存到本地JSON、CSV等文件中。任务4-1:使用Scrapy框架完成新闻公告页面数据采集与存储壹(2)管道存储语法格式:ITEM_PIPELINES={'ScrapyProject.pipelines.ScrapyprojectPipeline':300,}Scrapy中管道的使用需要先在settings.py文件添加ITEM_PIPELINES参数,进行管道的启用。任务4-1:使用Scrapy框架完成新闻公告页面数据采集与存储壹ITEM_PIPELINES参数说明参数描述ScrapyProject项目名称pipelines管道文件名称ScrapyprojectPipeline'管道中包含的类名称300执行管道的优先级,值为0~1000,数字越小,管道的优先级越高,优先调用4-1:任务实施贰切换到命令行,进入PressRelease的项目,使用genspider命令在spiders目录中创建一个名为job的爬虫文件输入地址/lcjtww/445068/445237/index.html打开命令窗口,使用startproject命令创建一个名为PressRelease的Scrapy项目修改配置文件,进入settings.py文件,将robots.txt策略设置为不采用,并添加ITEM_PIPELINES参数开启管道在名为“mysql”的MySQL数据库中,创建一个用于存储数据的表“press_release”查看数据表press_release中的数据,对数据存储是否成功进行验证使用Scrapy框架实现新闻公告页面内容的采集与存储与您共同成长项目5
动态网页访问日志数据采集使用Flume采集某官网访问日志数据目录Content1使用Kafka消费Flume中某官网访问日志数据
2项目导言零
日志中通常包含了大量的用户访问网站的行为信息,比如页面响应时间、消耗的流量、访问时间、停留时间、是否访问成功等等一系列的信息,网站运营者可通过分析这些信息,对网站运营做出一定的决策。学习目标零知识目标了解什么是日志采集;熟悉日志数据采集的方法;掌握Flume进行数据采集的方法;精通使用Kafka进行消息订阅发布的方法技能目标具备使用Flume拦截器过滤数据的能力;具备熟悉Kafka的脚本操作的能力;具备掌握Flume采集日志文件的能力;具备掌握使用Kafka进行消息发布订阅的能力;素养目标具备精通Flume+Kafka架构实现数据采集的能力。技能目标具备事业心和责任心;具有艰苦奋斗的精神和务实作风;具有健康的体魄,良好的身体素质;具备责任心。任务5-1使用Flume采集某官网访问日志数据壹Flume简介任务技能Flume是一个由Cloudera开发的分布式、可靠和高可用的海量日志收集和传输系统,具有基于流数据的简单灵活的架构。Flume数据采集配置Flume实现数据采集的方式非常简单,只需编辑相应的配置文件即可完成特定数据的采集与存储。Flume启动启动Flume代理使用名为flume-ng的shell脚本,该脚本位于Flume发行版的bin目录中。Flume拦截器配置Flume能够在数据采集的过程中对事件进行删除或修改,可理解为对事件进行过滤,这些功能是靠拦截器完成的。任务5-1使用Flume采集某官网访问日志数据壹1Flume简介Flume是一个由Cloudera开发的分布式、可靠和高可用的海量日志收集和传输系统,具有基于流数据的简单灵活的架构。它具有可调整的可靠性机制以及故障转移和恢复机制,具有健壮性和容错性。Flume-og,随着功能的逐渐增多和完善,其存在的缺点也逐渐的暴露出来,Flume-og部分缺点如下:2核心组件设计不合理代码过于臃肿14“日志传输”十分不稳定核心配置缺乏标准3任务5-1使用Flume采集某官网访问日志数据壹(1)Flume三层架构Flume由三层架构组成,分别为agent、collector和storage。Agent层01包含Flume的Agent组件,与需要传输数据的数据源进行连接Collector02通过多个收集器收集Agent层的数据,然后将这些转发到下一层storage03接收collector层的数据并存储任务5-1使用Flume采集某官网访问日志数据壹(1)Flume三层架构Fume中包含三个核心组件分别为Source、Channel和Sink,组件说明如下所示。Sink下沉组件,负责取出Channel中的消息数据,将channel中的event数据发送到文件存储系统或服务器等。采集组件,用于与数据源进行对接,获取数据。Source支持的数据源包括Avro、Thrift、exec、JMS、spoolingdirectory、netcat、sequencegenerator、syslog、http、legacy、自定义类型。SourceChannel是一个缓存区,用于链接Source和Sink组件,缓存Source写入的Event任务5-1使用Flume采集某官网访问日志数据壹(2)Flume扇入与扇出
扇入流(数据流合并)0102Flume日志收集中常见的场景是将客户端大量生成的日志数据发送到存储子系统或一消费者代理。任务5-1使用Flume采集某官网访问日志数据壹(2)Flume扇入与扇出
扇出流(数据流复用)Flume不仅能够同时采集多个服务器的数据到同一个服务器中,还能够将数据采集并分别保存到不同服务器中。任务5-1使用Flume采集某官网访问日志数据壹2Flume数据采集配置
Flume实现数据采集的方式非常简单,只需编辑相应的配置文件即可完成特定数据的采集与存储,配置文件中需要对数据源(source)、通道(channel)和接收器(sink)进行配置。1.数据源配
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论