《大数据运营》基于Python的数据处理技术_第1页
《大数据运营》基于Python的数据处理技术_第2页
《大数据运营》基于Python的数据处理技术_第3页
《大数据运营》基于Python的数据处理技术_第4页
《大数据运营》基于Python的数据处理技术_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

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

文档简介

基于Python的数据处理技术本章知识点(1)了解网络爬虫与数据采集的概念。(2)理解NumPy数值计算库。(3)理解Pandas数据分库。(4)掌握网络爬虫与数据采集的方法。(5)掌握NumPy和Pandas应用。01网络爬虫与数据采集02数据处理PART01网络爬虫与数据采集网络爬虫网络爬虫是一种数据采集的主要方式,也是通过网络获取数据信息的主要手段和工具。谈起网络爬虫,离不开搜索引擎,搜索引擎是伴随互联网的发展而产生和发展的,几乎每个人上网都会使用搜索引擎,例如百度、谷歌都是大家常用的搜索引擎。搜索引擎的工作过程可以简单视为从互联网上抓取信息、建立索引、搜索信息三个部分,抓取信息的主要方式就是采用网络爬虫。网络爬虫,又称为网络蜘蛛,网络机器人,是一种按照一定的规则,自动地抓取互联网信息的程序或者脚本。网络蜘蛛即WebSpider,是一个非常形象的名字。把互联网比喻成一个蜘蛛网,那么Spider就是在网上爬来爬去的蜘蛛。网络蜘蛛是通过网页的链接地址来寻找网页,从网站某一个页面(通常是首页)开始,读取网页的内容,找到在网页中的其它链接地址,然后通过这些链接地址寻找下一个网页,这样一直循环下去,直到把这个网站所有的网页都抓取完为止。如果把整个互联网当成一个网站,那么网络蜘蛛就可以用这个原理把互联网上所有的网页都抓取下来。这样看来,网络蜘蛛就是一个爬行程序,一个抓取网页的程序。网络蜘蛛实际上是一种电脑“机器人”(ComputerRobot),一种专门用于检索信息的“机器人”程序,就像蜘蛛一样在网络间爬来爬去,反反复复,不知疲倦。所以,网络爬虫也叫网络机器人。网络爬虫除了通过页面进行数据采集,也可以通过各种网络接口采集数据,例如通过RestfulAPI接口访问数据,这样获取的数据格式更加规范,更加易于处理。网络爬虫有网络爬虫就有反爬虫。有些网站为了避免数据被爬取,会采用各种各样的反爬虫措施。反爬虫技术主要分为两个环节,一是识别爬虫、二是对爬取信息做出限制。对应我们的网站也可以设置网络爬虫的规则,这里就涉及到robots协议。Robots协议(也称为爬虫协议、机器人协议等)的全称是“网络爬虫排除标准”(RobotsExclusionProtocol),网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。其目的是保护网站数据和敏感信息,确保用户个人信息和隐私不被侵犯。robots.txt(统一小写)是一种存放于网站根目录下的ASCII编码的文本文件,对搜索引擎访问的内容进行限制。

为什么需要Robots协议呢?互联网上的网页是通过超级链接互相关联起来的,从而形成了网页的网状结构。爬虫的工作方式就像蜘蛛在网上沿着链接爬来爬去,对于网站的管理者来说,就存在这样的需求,某些路径下是个人隐私或者网站管理使用,不想被搜索引擎抓取,比如说商品数据;网站内容的所有者是网站管理员,搜索引擎应该尊重所有者的意愿,为了满足以上要求,就需要提供一种网站和爬虫进行沟通的途径,给网站管理员表达自己意愿的机会。那么robots协议就此诞生,通过robots协议设置允许网络爬虫爬取信息的权限和范围。数据采集数据采集是更大的概念,上节所述的网络爬虫只是数据采集的一种方式。数据采集是进行大数据分析的前提也是必要条件,在整个流程中占据重要地位。数据采集的流程即使从网络爬虫的方式来讲也涉及到几个环节,一是通过网络爬虫爬取数据,二是爬取数据需要把数据存储起来,三是存储的数据进行数据的清洗等。本节概述完数据采集后,我们对网络爬虫及数据采集涉及到的一些基本概念和技术做进一步的介绍。常见的数据采集方式有系统日志采集法、数据库采集、网络数据采集法以及其他数据采集法等等。网络数据采集法就是本章的网络爬虫涉及到的内容。数据采集系统日志采集法,显而易见,就是采集日志信息。在我们的操作系统中,我们使用的各种应用与服务,大部分都有日志文件,系统日志、应用日志、安全日志等。我们都知道Linux操作系统在服务器中应用非常广泛,Linux就有非常完备的日志管理系统;用于记录Linux操作系统中各种运行的消息,不同的日志文件记载了不同类型的信息,如Linux内核消息、用户登录事件、程序错误等。Linux系统上运行的各种应用程序也提供日志管理,例如Web应用服务系统Nginx或者Tomcat应用,我们就可以从Nginx或者Tomcat应用服务器中采集到每个访问用户的来源IP地址、访问时间、浏览的页面、用户使用的浏览器信息等等,通过这些信息,我们可以用来分析页面点击量,分析哪些页面更受用户喜欢。数据库采集数据采集数据库采集主要从数据库系统中采集数据,传统企业会使用传统的关系型数据库MySQL和Oracle等来存储数据。随着大数据时代的到来,Redis、MongoDB和HBase等NoSQL数据库也常用于数据的采集。企业通过在采集端部署大量数据库,并在这些数据库之间进行负载均衡和分片,来完成大数据采集工作。关于数据库,我们知道有关系型数据库和非关系型数据库之分,关系型数据库的数据结构定义是严格和约束严谨的,数据存储的单元是数据库表,数据库表有各种数据类型的字段,数据库表之间通过外键形成关系。我们把关系型数据库存储的数据称之谓结构化数据。关系型数据库对应的有非关系型数据库,存储的是非结构化的数据,什么是非结构化的数据呢?我们常见的文档、图片、视频这类数据就是非结构化数据。互联网上我们浏览到的更多的就是这类数据。网络爬虫主要针对的就是这类非结构化的数据。网络采集到的数据需要进行存储,就需要技术人员选择存储的方式,是选择关系型数据库还是非关系型数据库,需要技术人员对这两种不同类型的数据库优势、劣势非常清楚才能做出合理和正确的选型。其他数据采集包括感知设备数据采集,通过传感器、摄像头和其他智能终端自动采集信号、图片或录像来获取数据等,这里不做过多叙述。网络爬虫与数据采集相关知识本章会通过代码来展示网络爬虫和数据采集的过程,让读者能够通过代码扩展更多的概念,掌握一些入门的技术。网络爬虫和数据采集我们会提供一个完整的、简单的项目案例,通过从网络上爬取未来7天的天气数据,进行一些简单的处理。主要涉及到的知识有Python编程语言、http或https网络请求、RestfulAPI编程接口、Python网络相关软件模块等。下面逐一进行介绍。案例网络爬虫与数据采集相关知识1.Python编程语言Python编程语言在大数据、人工智能技术中应用非常广泛,后面小节会采用Python编程语言进行代码实现,代码实现相对简单,读者可以自行安装一个Python编程环境,通过代码来认识Python,掌握最基本的Python语言程序结构即可。让我们认识一下基本的程序结构:#-*-coding:UTF-8-*-defsay_hello():greet_string="hello,world!"#定义一个字符串print(greet_string)#打印字符串if__name__=='__main__':#程序入口say_hello()保存文件为helloWorld.py,运行程序命令:python.\helloWorld.py,就会输出hello,world!字符串。在这个简单的程序中,我们定义了一个函数say_hello(),在main主程序体种调用了该函数。并对程序作了部分的注释。网络爬虫与数据采集相关知识2.网络请求网络爬虫需要访问互联网,因此,我们需要了解访问互联网所使用的协议http、https、页面的请求(request)与响应(response)的概念。我们通过浏览器访问一个常用的网站:。打开浏览器开发者工具,访问截图如下:通过开发者工具查看的截图,我们可以看到请求的网页的详细信息,你可以看到请求、响应的数据,可以查看到cookie、session,可以查询到网页使用的css样式文件、js文件以及图片等数据。具体大家可以通过浏览器打开开发者工具详细探索一番。这里主要讲一些基本的概念。这里要讲的就是http和https。网络爬虫与数据采集相关知识刚才我们访问的详细地址是“”,使用的就是https协议。http和https是实现网络通信的网络协议,网络协议是计算机之间为了实现网络通信而达成的一种“约定”或者”规则“,有了这种”约定“,不同厂商的生产设备,以及不同操作系统组成的计算机之间,就可以实现通信。HTTP协议是超文本传输协议的缩写,英文是HyperTextTransferProtocol。它是从WEB服务器传输超文本标记语言(HTML)到本地浏览器的传送协议。http协议支持客户端/服务端模式,也是一种请求/响应模式的协议。请求方法常用的有GET、POST、patch、delete。从刚才我们请求的截图中就能看到采用的请求方法是get。HTTPS是HTTP协议的安全版本,HTTP协议的数据传输是明文的,是不安全的,HTTPS使用了SSL/TLS协议进行了加密处理。HTTPS协议(HyperTextTransferProtocoloverSecureSocketLayer),一般理解为HTTP+SSL/TLS,通过SSL证书来验证服务器的身份,并为浏览器和服务器之间的通信进行加密来实现数据的安全性。SSL(SecureSocketLayer,安全套接字层),为数据通讯提供安全支持。http和https使用连接方式不同,默认端口也不一样,http是80,https是443。网络爬虫与数据采集相关知识通过开发者工具你可以看到请求头和响应头,这在网络请求、web前端开发中经常用到的知识。请求头:请求头是客户端发送给服务器端的一些信息,使用键值对表示,常见的请求头及其含义如下:常见请求头描述Referer浏览器通知服务器,当前请求来自何处。如果是直接访问,则不会有这个头。常用于:防盗链If-Modified-Since浏览器通知服务器,本地缓存的最后变更时间。与另一个响应头组合控制浏览器页面的缓存。Cookie与会话有关技术,用于存放浏览器缓存的cookie信息。User-Agent浏览器通知服务器,客户端浏览器与操作系统相关信息Connection保持连接状态。Keep-Alive连接中,close已关闭Host请求的服务器主机名Content-Length请求体的长度Content-Type如果是POST请求,会有这个头,默认值为application/x-www-form-urlencoded,表示请求体内容使用url编码Accept:浏览器可支持的MIME类型。文件类型的一种描述方式。MIME格式:大类型/小类型[;参数]例如:text/html,html文件text/css,css文件text/javascript,js文件image/*,所有图片文件Accept-Encoding浏览器通知服务器,浏览器支持的数据压缩格式。如:GZIP压缩Accept-Language浏览器通知服务器,浏览器支持的语言。各国语言(国际化i18n)网络爬虫与数据采集相关知识响应头:响应也是键值对形式,服务器端将信息以键值对的形式返回给客户端。常见请求头描述Location指定响应的路径,需要与状态码302配合使用,完成跳转。Content-Type响应正文的类型(MIME类型)取值:text/html;charset=UTF-8Content-Disposition通过浏览器以下载方式解析正文取值:attachment;filename=xx.zipSet-Cookie与会话相关技术。服务器向浏览器写入cookieContent-Encoding服务器使用的压缩格式取值:gzipContent-length响应正文的长度Refresh定时刷新,格式:秒数;url=路径。url可省略,默认值为当前页。取值:3;url=//三秒刷新页面到Server指的是服务器名称,默认值:Apache-Coyote/1.1。可以通过conf/server.xml配置进行修改。<Connectorport="8080"...server="itcast"/>Last-Modified服务器通知浏览器,文件的最后修改时间。与If-Modified-Since一起使用。网络爬虫与数据采集相关知识3.RESTfulAPI接口与JSON数据格式要弄清楚什么是RESTfulAPI,首先要知道REST是什么。1)表示性状态转移(representationstatetransfer,REST)用URI表示资源,用HTTP的方法(GET,POST,PUT,DELETE)表征对这些资源进行操作。RESTfulAPI就是REST风格的API。现在终端平台多样,移动、平板、PC等许多媒介向服务端发送请求后,如果不适用RESTfulAPI,需要为每个平台的数据请求定义相应的返回格式,以适应前端显示。但是RESTfulAPI要求前端以一种预定义的语法格式发送请求,那么服务端就只需要定义一个统一的响应接口,不必像之前那样解析各色各式的请求。Resource:资源,即数据,存在互联网上的可被访问的实体Representation:数据的某种表现形式,如HTML,JSON。StateTransfer:状态变化,HTTP方法实现网络爬虫与数据采集相关知识2)RESTful是典型的基于HTTP的协议RESTful有以下设计原则和规范资源首先要明确资源就是网络上的一个实体,可以是文本、图片、音频、视频。资源总是以一定的格式来表现自己。文本用txt、html;图片用JPG、JPEG等等。而JSON是RESTfulAPI中最常用的资源表现格式。统一接口对于业务数据的CRUD,RESTful用HTTP方法与之对应。URI统一资源标识符,它可以唯一标识一个资源。注意到,URL(统一资源定位符)是一种URI,因为它可以唯一标志资源。但URL!=URI。应该说URL是URI的子集。因为URL使用路径来唯一标识资源,这只是唯一标识资源的一种方式。还可以用一个唯一编号来标识资源,如example.html.fuce2da23。只不过这种方式并不被广泛使用。总之,要在概念上对URL和URI有所区分。无状态所谓无状态是指所有资源都可以用URI定位,而且这个定位与其他资源无关,不会因为其他资源的变动而变化。这里引入一个幂等性的概念:无论一个操作被执行一次还是多次,执行后的效果都相同。比如对某资源发送GET请求,如果访问一次和访问十次获得的数据一样,那么就说这个请求具有幂等性。01030402网络爬虫与数据采集相关知识3)JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式JSON采用完全独立于语言的文本格式,这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成。JSON数据格式有两种结构:“名称/值”对的集合(Acollectionofname/valuepairs)。不同的语言中,它被理解为对象(object),记录(record),结构(struct),字典(dictionary),哈希表(hashtable),有键列表(keyedlist),或者关联数组(associativearray)。示例:{"firstName":"Jack","lastName":"Smith","email":"smith@"}值的有序列表(Anorderedlistofvalues)。在大部分语言中,它被理解为数组(array)。{"people":[{"firstName":"Brett","lastName":"McLaughlin","email":"aaaa"},{"firstName":"Jason","lastName":"Hunter","email":"bbbb"},{"firstName":"Elliotte","lastName":"Harold","email":"cccc"}]}网络爬虫与数据采集相关知识4)RESTfulAPI接口以及JSON数据格式如何调用一个http接口。这里有一个开放免费的天气API,大家可以自己注册一个免费账号进行测试。接口如下:接口解释:Url:/free/week/api方法(method):GET请求的参数:appid、appsecret、city,appid和appsecret是注册用户的id和密钥,用于安全认证使用。接下来我们直接从浏览器中访问查看返回的数据。/free/week?appid=53487633&appsecret=eQs06GRV&city=北京网络爬虫及数据采集应用本节我们希望能够掌握简单的数据采集的实现,主要介绍采用Python语言进行程序编写,使用Python网络请求模块进行网络请求,采集到的数据存储到本地JSON格式文件。数据源来至于/网,我们通过网络请求获取未来7天的天气情况。本节主要是为了示例,不采集所有城市的数据,选择10个城市采集未来7天的天气情况,城市选择包括:北京、上海、广州、深圳、南宁、桂林、天津、重庆、哈尔滨、拉萨。采集的接口如下:请求地址(URL):/free/week请求方法:GET请求参数说明:参数名必选类型说明备注(示例)appid是string用户appid需要注册免费账号,查看appidappsecret是string用户appsecret需要注册免费账号,查看appsecretcityid否string城市ID请参考城市ID列表city否string城市名称不要带市和区,支持市区县,不支持乡镇级别;如:青岛、铁西ip否stringIP地址查询IP所在城市天气callback否stringjsonp参数如:jQuery.Callbacksvue否string跨域参数如果您使用的是react、vue、angular请填写值:1网络爬虫及数据采集应用响应参数说明:参数名类型说明备注cityidString城市ID

cityString城市名称

update_timeString更新时间

dateString预报日期

weaString天气情况

wea_imgString天气对应图标

tem_dayString白天温度(高温)

tem_nightString白天温度(低温)

winString风向

win_speedString风力等级网络爬虫及数据采集应用我们先采用postman软件工具测试一个城市接口,采集“北京”未来7天的天气情况:请求地址:/free/week?appid=53487633&appsecret=eQs06GRV&city=北京下面Python程序进行10个城市的数据采集,先简单写一个城市的数据采集代码:#-*-coding:UTF-8-*-importrequestsif__name__=='__main__':url='/free/week?appid=53487633&appsecret=eQs06GRV&city=北京'response=requests.get(url=url).json()print(response)程序文件保存在本地,文件名称为dataCollecting.py。这里需要解释几个知识点:Python的程序运行体在前面介绍过,执行该程序首先需要Python运行环境,执行过程只需要一个命令:python.\dataCollecting.py;requests模块Python的一个软件库,一个常用HTTP请求的模块,它使用python语言编写,可以方便的对网页进行爬取,是学习python爬虫较好的http请求模块。安装也非常简单:pipinstallrequests;json()是Python的内置函数,是把Python对象转化成json数据格式的函数。网络爬虫及数据采集应用运行结果:python.\dataCollecting.py{'cityid':'101010100','city':'北京','update_time':'2021-05-1217:54:01','data':[{'date':'2021-05-12','wea':'多云','wea_img':'yun','tem_day':'26','tem_night':'15','win':'东北风','win_speed':'3-4级转<3级'},{'date':'2021-05-13','wea':'多云','wea_img':'yun','tem_day':'26','tem_night':'16','win':'东南风','win_speed':'3-4级转<3级'},{'date':'2021-05-14','wea':'多云转阴','wea_img':'yun','tem_day':'28','tem_night':'18','win':'东南风','win_speed':'3-4级转<3级'},{'date':'2021-05-15','wea':'小雨','wea_img':'yu','tem_day':'22','tem_night':'14','win':'北风','win_speed':'3-4级'},{'date':'2021-05-16','wea':'多云转晴','wea_img':'yun','tem_day':'25','tem_night':'15','win':'北风','win_speed':'<3级'},{'date':'2021-05-17','wea':'晴','wea_img':'qing','tem_day':'28','tem_night':'14','win':'北风','win_speed':'<3级'},{'date':'2021-05-18','wea':'晴','wea_img':'qing','tem_day':'28','tem_night':'16','win':'西南风','win_speed':'<3级'}]}网络爬虫及数据采集应用目前只是调用了一个城市的数据,下面程序我们把北京、上海、广州、深圳、南宁、桂林、天津、重庆、哈尔滨、拉萨10个城市都采集一遍,并保存为JSON格式的文件,保存为文件名alldata.json,程序如下:#-*-coding:UTF-8-*-importrequests#导入requests模块importjson#导入json模块if__name__=='__main__':cities=['北京','上海','广州','深圳','南宁','桂林','天津','重庆','哈尔滨','拉萨']#定义一个列表alldata=[]#定义一个空列表forcityincities:url='/free/week?appid=53487633&appsecret=eQs06GRV&city='+cityresponse=requests.get(url=url).json()alldata.append(response)#增加一个列表元素filename='alldata.json'#把数据写入alldata.json本地文件withopen(filename,'w')asfile_obj:json.dump(alldata,file_obj)上面的程序多增加一些编程知识。首选把10个城市定义为一个list(列表)。编写了一段for循环,遍历10个城市,逐一采集相关城市的天气数据。这里使用了Python的json模块来编码和解码JSON对象,函数如下:函数描述json.dump将Python对象编码成JSON字符串json.load将已编码的JSON字符串解码为Python对象网络爬虫及数据采集应用上面程序就是采用了dump函数,将Python对象编码成JSON字符串,我们再写一个程序,读取刚才保存的alldata.json文件。如下所示:以上两个程序使用到了采用Python语言进行文件操作,文件的写入和读取文件。#-*-coding:UTF-8-*-importjson#导入json模块if__name__=='__main__':#主程序体filename='alldata.json'#定义一个文件名withopen(filename)asfile_obj:#打开文件data=json.load(file_obj)#把JSON格式数据解码为python对象print(data)#打印输出数据PART02数据处理数据处理数据处理有两个非常强大的python软件库,一个是numpy,一个是pandas。NumPy是Python语言的一个扩充程序库。支持高级大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。Pandas是基于NumPy的一种工具,该工具是为了解决数据分析任务而创建的。Pandas纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。Pandas提供了大量能使我们快速便捷地处理数据的函数和方法。本节主要介绍numpy和pandas的一些基础概念和基本用法,详细使用需要进行进一步的学习。Numpy数值计算库机器学习模型:在编写机器学习算法时,需要对矩阵进行各种数值计算。例如矩阵乘法、换位、加法等。NumPy提供了一个非常好的库,用于简单(在编写代码方面)和快速(在速度方面)计算。NumPy数组用于存储训练数据和机器学习模型的参数。数学任务:NumPy对于执行各种数学任务非常有用,如数值积分、微分、内插、外推等。因此,当涉及到数学任务时,它形成了一种基于Python的MATLAB的快速替代。图像处理和计算机图形学:计算机中的图像表示为多维数字数组。NumPy成为同样情况下最自然的选择。实际上,NumPy提供了一些优秀的库函数来快速处理图像。例如,镜像图像、按特定角度旋转图像等。NumPy是一个功能强大的Python库,主要用于对多维数组执行计算。NumPy这个词来源于两个单Numerical和Python。NumPy提供了大量的库函数和操作,可以帮助程序员轻松地进行数值计算。这类数值计算广泛用于以下任务:Numpy数值计算库NumPy的安装就像安装其他python库一样简单,最快也是最简单的方法是在shell上使用以下命令:pipinstallnumpy。NumPy围绕这些称为数组展开,创建数组的4种不同方法的代码如下:a=np.array([0,1,2,3,4])b=np.array((0,1,2,3,4))c=np.arange(5)d=np.linspace(0,2*np.pi,5)print(a)#>>>[01234]print(b)#>>>[01234]print(c)#>>>[01234]print(d)#>>>[0.1.570796333.141592654.712388986.28318531]print(a[3])#>>>3最基本的方法是将序列传递给NumPy的array()函数;你可以传递任何序列(类数组),而不仅仅是常见的列表(list)数据类型。Numpy数值计算库请注意,当我们打印具有不同长度数字的数组时,它会自动将它们填充出来。这对于查看矩阵很有用。对数组进行索引就像列表或任何其他Python序列一样。接下来我们将看看如何使用多维数组表示矩阵和更多的信息。a=np.array([[11,12,13,14,15],[16,17,18,19,20],[21,22,23,24,25],[26,27,28,29,30],[31,32,33,34,35]])print(a[2,4])#>>>25为了创建一个2D(二维)数组,我们传递一个列表的列表(或者是一个序列的序列)给array()函数。如果我们想要一个3D(三维)数组,我们就要传递一个列表的列表的列表,如果是一个4D(四维)数组,那就是列表的列表的列表的列表,以此类推。请注意2D(二维)数组是如何按行和列排列的。要索引2D(二维)数组,我们只需引用行数和列数即可。Pandas数据分析库Pandas是基于Num

温馨提示

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

评论

0/150

提交评论