数据分析介绍

1、数据分析是什么 在我们如今这个时代,相信大多数人都能明白数据的重要性,数据就是信息,而数据分析就是可以让我们发挥这些信息功能的重要手段。 2、数据分析能干什么 对于数据分析能干什么其实我们可以简单的举几个例子: 1、淘宝可以观察用户的购买记录、搜索记录以及人们在社交媒体上发布的内容选择商品推荐 2、股票可以根据相应的数据选择买进卖出 3、今日头条可以将数据分析应用到新闻推送排行算法当中 4、爱奇艺可以为用户提供个性化电影推荐服务 其实数据分析不仅可以完成像以上这样的推荐系统,在制药行业也可运用数据分析来预测什么样的化合物更有可能制成高效药物等 所以说数据分析绝对是未来所有公司不可或缺的岗位,目前社会上获取数据方式太多了,这么多的数据,只要我们拥有数据分析的技能,绝对可以应付任何岗位上的工作。 3、为什么利用Python进行数据分析 1、Python的代码语法简单易学 2、Python可以很容易的整合C、C++等语言的代码 3、Python有大量用于科学计算的库 4、Python不仅可以用于研究和原型构建,同时也适用于构建生产系统 4、数据分析过程概述 4.1、提出问题 在真正的工作场景下,往往我们需要的处理的是多个庞大的数据集还有可能是类型完全不同的数据,那这个时候一个准确的问题就可以让我们聚集与问题相关的那部分数据,为后续的分析操作提供一个明确的方向,帮助我们得到一个有意义的结论。 4.2、整理数据 整理数据主要分为三步: (1)、收集数据 通过多种途径拿到数据,导入到Jupyter Notebook中 (2)、评估数据 这一步主要是需要找出数据是否存在质量或者结构等方面的问题 (3)、清理数据 通过修改、替换、删除等方式保证数据质量高、结构好 3.3、探索性数据分析 在这一步骤主要可以探索并且扩充数据 4.4、得出结论 在进行完探索性数据分析之后肯定会得出一个结果或者说是结论,这样我们就可以根据这样一个结论进行相应的操作,就比如说分析股票数据得到那个大盘趋势好可以选择买进,又或者说类似于万达这样的大型商场可以分析那种类型的商品会比较受用户的欢迎,以便针对性的存货。但是具体的操作可能就需要用到机器学习或者推断统计学来实现,这个就与数据分析不一样了 4.5、传达结果 分析的能力有多强,分析的价值就有多大。 这一步主要是向其他人证明你发现的见解以及传达意义 5、常用库简介 Numpy Numpy是Numerical Python的简写,主要可以用来做Python数值计算。它提供了多种数据结构、算法以及大部分涉及Python数值计算所需的接口。 快速、高效的多维数组对象ndarray 基于元素的数组计算以及直接对数组执行数学运算的函数 用于读写硬盘上基于数组的数据集的工具 线性代数运算、傅里叶变换,以及随机数生成 用于将C、C++、Fortran代码集成到python的工具 Pandas Pandas使我们进行数据分析的一个主要工具。它所包含的数据结构和数据处理工具的设计使得Python中进行数据清洗和分析非常快捷。pandas一般也是和其他数值计算工具一起使用的,支持大部分Numpy语言风格的数组计算。pandas和numpy最大的区别就是pandas是用来处理表格型或者异质性数据的,而Numpy则刚好相反,它更适合处理同质型的数值类数组数据 matplotlib matplotlib是最流行的用于绘制数据图表的python库。 Scipy Scipy是科学计算领域针对不同标准问题域的包集合。提供了强大的科学计算方法(矩阵分析、信号分析、数理分析等) IPython和Juypyter notebook IPython是一个加强版的Python解释器,Juypyter notebook是一种基于Web的代码笔记本,最初也是源于IPython项目。

2019年12月2日 · 1 分钟

数据分析开发环境部署

1、Anaconda Anaconda是Python的一个开源的发行版本,里面包含了很多科学计算相关的包,它和Python的关系就像linux系统中centos和Ubuntu的关系一样,不冲突,你可以同时在电脑上安装这两个东西。那至于为什么我已经在电脑上安装了pycharm还要安装这个Anaconda呢,主要有以下几点原因: (1)Anaconda附带了一大批常用数据科学包,它附带了conda、Python和 150 多个科学包及其依赖项。因此你可以用Anaconda立即开始处理数据。 (2)管理包。Anaconda 是在 conda(一个包管理器和环境管理器)上发展出来的。在数据分析中,你会用到很多第三方的包,而conda(包管理器)可以很好的帮助你在计算机上安装和管理这些包,包括安装、卸载和更新包。 (3)管理环境。为什么需要管理环境呢?比如你在A项目中用到了Python2,而新的项目要求使用Python3,而同时安装两个Python版本可能会造成许多混乱和错误。这时候conda就可以帮助你为不同的项目建立不同的运行环境。还有很多项目使用的包版本不同,比如不同的pandas版本,不可能同时安装两个pandas版本。你要做的应该是在项目对应的环境中创建对应的pandas版本。这时候conda就可以帮你做到。 总结:Anaconda解决了官方Python的两大痛点: (1)提供了包管理功能,Windows平台安装第三方包经常失败的场景得以解决 (2)提供环境管理功能,解决了多版本Python并存、切换的问题。 接下来就需要了解Anaconda如何进行安装 2、下载 Anaconda下载入口 按照上面的路径点击下载,下载完成后就可以一路点击下一步完成安装,如果中间需要修改安装路径可以自己改一下。安装成功之后我们会发现,多出来几个应用 Anaconda Navigtor :用于管理工具包和环境的图形用户界面,后续涉及的众多管理命令也可以在 Navigator 中手工实现。 Jupyter notebook :基于web的交互式计算环境,可以编辑易于人们阅读的文档,用于展示数据分析的过程。 qtconsole :一个可执行 IPython 的仿终端图形界面程序,相比 Python Shell 界面,qtconsole 可以直接显示代码生成的图形,实现多行代码输入执行,以及内置许多有用的功能和函数。 spyder :一个使用Python语言、跨平台的、科学运算集成开发环境。 那以上应用我们简单了解一下就好,不需要管。 3、配置环境变量 3.1、windows 系统 如果是Windows环境的话就需要在控制面板\系统和安全\系统\高级系统设置\环境变量\用户变量\PATH当中添加anaconda的安装目录的Scripts文件夹。 验证: 打开命令行输入conda –version,如果能输出版本号就对了 3.2、Mac系统 在终端输入以下命令 export PATH=~/anaconda/bin:$PATH 4、管理包 在anaconda当中虽然已经存在了很多科学计算的包,但是我们总有需要安装新的包的需求,有了anaconda就可以很好地管理这些包了 # 管理包在Python解释器中有pip,在anaconda中conda,它的功能和pip是一样的,在anaconda中选择pip也是可以安装包的 1、安装包 conda install requests 2、卸载包 conda remove requests 3、更新包 conda update requests 4、查询已安装的包 conda list 5、管理环境 可以通过conda创建不同的运行环境 ...

2019年12月2日 · 1 分钟

【爬虫】请求库之selenium库

一、介绍 selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题 selenium本质是通过驱动浏览器,完全模拟浏览器的操作,比如跳转、输入、点击、下拉等,来拿到网页渲染之后的结果,可支持多种浏览器 from selenium import webdriver browser=webdriver.Chrome() browser=webdriver.Firefox() browser=webdriver.PhantomJS() browser=webdriver.Safari() browser=webdriver.Edge() 官网:http://selenium-python.readthedocs.io 二、安装 1.有界面浏览器 selenium+chromedriver #安装:selenium+chromedriver pip3 install selenium 下载chromdriver.exe放到python安装路径的scripts目录中即可,注意最新版本是2.38,并非2.9 国内镜像网站地址:http://npm.taobao.org/mirrors/chromedriver/2.38/ 最新的版本去官网找:https://sites.google.com/a/chromium.org/chromedriver/downloads #验证安装 C:\Users\Administrator>python3 Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 18:41:36) [MSC v.1900 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> from selenium import webdriver >>> driver=webdriver.Chrome() #弹出浏览器 >>> driver.get('https://www.baidu.com') >>> driver.page_source #注意: selenium3默认支持的webdriver是Firfox,而Firefox需要安装geckodriver 下载链接:https://github.com/mozilla/geckodriver/releases selenium+chromedriver 2.无界面浏览器 selenium+phantomjs PhantomJS不再更新 ...

2019年11月29日 · 7 分钟

【爬虫】基本原理

一、爬虫是什么? #1、什么是互联网? 互联网是由网络设备(网线,路由器,交换机,防火墙等等)和一台台计算机连接而成,像一张网一样。 #2、互联网建立的目的? 互联网的核心价值在于数据的共享/传递:数据是存放于一台台计算机上的,而将计算机互联到一起的目的就是为了能够方便彼此之间的数据共享/传递,否则你只能拿U盘去别人的计算机上拷贝数据了。 #3、什么是上网?爬虫要做的是什么? 我们所谓的上网便是由用户端计算机发送请求给目标计算机,将目标计算机的数据下载到本地的过程。 #3.1 只不过,用户获取网络数据的方式是: 浏览器提交请求->下载网页代码->解析/渲染成页面。 ``` #3.2 而爬虫程序要做的就是: 模拟浏览器发送请求->下载网页代码->只提取有用的数据->存放于数据库或文件中 #3.1与3.2的区别在于: ``` 我们的爬虫程序只提取网页代码中对我们有用的数据 #4、总结爬虫 #4.1 爬虫的比喻: 如果我们把互联网比作一张大的蜘蛛网,那一台计算机上的数据便是蜘蛛网上的一个猎物,而爬虫程序就是一只小蜘蛛,沿着蜘蛛网抓取自己想要的猎物/数据 ``` #4.2 爬虫的定义: ``` 向网站发起请求,获取资源后分析并提取有用数据的程序 ``` #4.3 爬虫的价值: 互联网中最有价值的便是数据,比如天猫商城的商品信息,链家网的租房信息,雪球网的证券投资信息等等,这些数据都代表了各个行业的真金白银,可以说,谁掌握了行业内的第一手数据,谁就成了整个行业的主宰,如果把整个互联网的数据比喻为一座宝藏,那我们的爬虫课程就是来教大家如何来高效地挖掘这些宝藏,掌握了爬虫技能,你就成了所有互联网信息公司幕后的老板,换言之,它们都在免费为你提供有价值的数据。 ``` 二、爬虫的基本流程 #1、发起请求 使用http库向目标站点发起请求,即发送一个Request Request包含:请求头、请求体等 #2、获取响应内容 如果服务器能正常响应,则会得到一个Response Response包含:html,json,图片,视频等 #3、解析内容 解析html数据:正则表达式,第三方解析库如Beautifulsoup,pyquery等 解析json数据:json模块 解析二进制数据:以b的方式写入文件 #4、保存数据 数据库 文件 三、请求与响应 #http协议:http://www.cnblogs.com/linhaifeng/articles/8243379.html #Request:用户将自己的信息通过浏览器(socket client)发送给服务器(socket server) #Response:服务器接收请求,分析用户发来的请求信息,然后返回数据(返回的数据中可能包含其他链接,如:图片,js,css等) #ps:浏览器在接收Response后,会解析其内容来显示给用户,而爬虫程序在模拟浏览器发送请求然后接收Response后,是要提取其中的有用数据。 四、Request #1、请求方式: 常用的请求方式:GET,POST 其他请求方式:HEAD,PUT,DELETE,OPTHONS ``` ps:用浏览器演示get与post的区别,(用登录演示post) post与get请求最终都会拼接成这种形式:k1=xxx&k2=yyy&k3=zzz post请求的参数放在请求体内: 可用浏览器查看,存放于form data内 get请求的参数直接放在url后 ``` #2、请求url url全称统一资源定位符,如一个网页文档,一张图片 一个视频等都可以用url唯一来确定 ``` url编码 https://www.baidu.com/s?wd=图片 图片会被编码(看示例代码) ``` ``` 网页的加载过程是: 加载一个网页,通常都是先加载document文档, 在解析document文档的时候,遇到链接,则针对超链接发起下载图片的请求 ``` #3、请求头 User-agent:请求头中如果没有user-agent客户端配置, 服务端可能将你当做一个非法用户 host cookies:cookie用来保存登录信息 ``` 一般做爬虫都会加上请求头 ``` #4、请求体 如果是get方式,请求体没有内容 如果是post方式,请求体是format data ``` ps: 1、登录窗口,文件上传等,信息都会被附加到请求体内 2、登录,输入错误的用户名密码,然后提交,就可以看到post,正确登录后页面通常会跳转,无法捕捉到post ``` from urllib.parse import urlencode import requests headers={ 'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8', 'Cookie':'H_WISE_SIDS=101556_115474_115442_114743_108373_100099_115725_106201_107320_115339_114797_115553_116093_115546_115625_115446_114329_115350_114275_116040_110085; PSTM=1494300712; BAIDUID=42FE2934E37AF7AD1FA31D8CC7006D45:FG=1; BIDUPSID=2996557DB2710279BD865C50F9A68615; MCITY=-%3A; __cfduid=da9f97dea6458ca26aa4278280752ebb01508939712; BDSFRCVID=PGLsJeCCxG3wt_3ZUrBLDfv2D_qBZSjAgcEe3J; H_BDCLCKID_SF=tJAOoCLytI03qn5zq4Oh-4oHhxoJq5QxbT7Z0l8KtfcNVJQs-lCMhbtp-l3GJPoLWK6hBKQmWIQHDnbsbq0M2tcQXR5-WROCte74KKJx-4PWeIJo5tKh04JbhUJiB5OLBan7Lq7xfDDbbDtmej_3-PC3ql6354Rj2C_X3b7EfKjIOtO_bfbT2MbyeqrNQlTkLIvXoITJQD_bEP3Fbfj2DPQ3KabZqjDjJbue_I05f-oqebT4btbMqRtthf5KeJ3KaKrKW5rJabC3hPJeKU6qLT5Xjh6B5qDfyDoAbKOt-IOjhb5hMpnx-p0njxQyaR3RL2Kj0p_EWpcxsCQqLUonDh8L3H7MJUntKjnRonTO5hvvhb6O3M7-XpOhDG0fJjtJJbksQJ5e24oqHP-kKPrV-4oH5MQy5toyHD7yWCvjWlT5OR5Jj6KMjMkb3xbz2fcpMIrjob8M5CQESInv3MA--fcLD2ch5-3eQgTI3fbIJJjWsq0x0-jle-bQypoa-U0j2COMahkMal7xO-QO05CaD53yDNDqtjn-5TIX_CjJbnA_Hn7zepoxebtpbt-qJJjzMerW_Mc8QUJBH4tR-T3keh-83xbnBT5KaKO2-RnPXbcWjt_lWh_bLf_kQN3TbxuO5bRiL66I0h6jDn3oyT3VXp0n54nTqjDHfRuDVItXf-L_qtDk-PnVeUP3DhbZKxtqtDKjXJ7X2fclHJ7z-R3IBPCD0tjk-6JnWncKaRcI3poiqKtmjJb6XJkl2HQ405OT-6-O0KJcbRodobAwhPJvyT8DXnO7-fRTfJuJ_DDMJDD3fP36q4QV-JIehmT22jnT32JeaJ5n0-nnhP3mBTbA3JDYX-Oh-jjRX56GhfO_0R3jsJKRy66jK4JKjHKet6vP; ispeed_lsm=0; H_PS_PSSID=1421_24558_21120_17001_24880_22072; BD_UPN=123253; H_PS_645EC=44be6I1wqYYVvyugm2gc3PK9PoSa26pxhzOVbeQrn2rRadHvKoI%2BCbN5K%2Bg; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598', 'Host':'www.baidu.com', 'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36'} # response=requests.get('https://www.baidu.com/s?'+urlencode({'wd':'美女'}),headers=headers) response=requests.get('https://www.baidu.com/s',params={'wd':'美女'},headers=headers) #params内部就是调用urlencode print(response.text) 五、Response #1、响应状态 200:代表成功 301:代表跳转 404:文件不存在 403:权限 502:服务器错误 #2、Respone header set-cookie:可能有多个,是来告诉浏览器,把cookie保存下来 #3、preview就是网页源代码 最主要的部分,包含了请求资源的内容 如网页html,图片 二进制数据等 六、总结 #1、总结爬虫流程: 爬取--->解析--->存储 #2、爬虫所需工具: 请求库:requests,selenium 解析库:正则,beautifulsoup,pyquery 存储库:文件,MySQL,Mongodb,Redis #3、爬虫常用框架: scrapy 爬取校花网视频 ...

2019年11月25日 · 2 分钟

【爬虫】请求库之requests库

一、介绍 #介绍:使用requests可以模拟浏览器的请求,比起之前用到的urllib,requests模块的api更加便捷(本质就是封装了urllib3) #注意:requests库发送请求将网页内容下载下来以后,并不会执行js代码,这需要我们自己分析目标站点然后发起新的request请求 #安装:pip3 install requests #各种请求方式:常用的就是requests.get()和requests.post() >>> import requests >>> r = requests.get('https://api.github.com/events') >>> r = requests.post('http://httpbin.org/post', data = {'key':'value'}) >>> r = requests.put('http://httpbin.org/put', data = {'key':'value'}) >>> r = requests.delete('http://httpbin.org/delete') >>> r = requests.head('http://httpbin.org/get') >>> r = requests.options('http://httpbin.org/get') #建议在正式学习requests前,先熟悉下HTTP协议 官网链接:http://docs.python-requests.org/en/master/ 二、基于GET请求 1、基本请求 import requests response=requests.get(' print(response.text) 2、带参数的GET请求->params #在请求头内将自己伪装成浏览器,否则百度不会正常返回页面内容 import requests response=requests.get('https://www.baidu.com/s?wd=python&pn=1', headers={ 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36', }) print(response.text) #如果查询关键词是中文或者有其他特殊符号,则不得不进行url编码 from urllib.parse import urlencode wd='egon老师' encode_res=urlencode({'k':wd},encoding='utf-8') keyword=encode_res.split('=')[1] print(keyword) # 然后拼接成url url='https://www.baidu.com/s?wd=%s&pn=1' %keyword response=requests.get(url, headers={ 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36', }) res1=response.text 自己拼接GET参数 params参数的使用 ...

2019年11月25日 · 4 分钟

Chrome浏览器78版本关闭鼠标落在标签页上标题提示

Chrome 78版本开启了鼠标落在标签页标题内容提示 怎么关闭这个提示呢? chrome://flags/#tab-hover-cards 为 Disable 即可! 有网友发现还有一项设置:Tab Hover Card Images 鼠标落在标签页,显示缩略图! chrome://flags/#tab-hover-card-images 默认是关闭,设置成 Enable 即可开启

2019年11月20日 · 1 分钟

Chrome浏览器多线程下载开关

chrome://flags/#enable-parallel-downloading Enable parallel downloading to accelerate download speed. – Mac, Windows, Linux, Chrome OS, Android 启用并行下载以加快下载速度。–Mac、Windows、Linux、Chrome操作系统、Android

2019年11月20日 · 1 分钟

【DRF】 django rest framework总结

1.接口** ** """ 1、什么是接口:url+请求参数+响应数据 | 接口文档 2、接口规范: url:https,api,资源(名词复数),v1,get|post表示操作资源的方式,?过滤条件 响应数据:status,msg,results|data,url资源数据 """ 2.DRF入门 """ 1、封装风格 2、请求生命周期:走APIView的as_view => View的as_view调用APIView的dispatch => 分发给视图类的请求函数 => 响应 3、请求模块:二次封装request 4、解析模块:局部全局配置,form-data、urlencoding、json 5、渲染模块:局部全局配置,html、json 6、响应模块:Response(data, http_status, header) data={'detail': serializer_obj.errors} => http_status=4..|5.. # 4,5开头字段状态码,前台axios请求响应会解析到catch分支 axios({}).then().catch() 7、二次封装Response: i) 继承Response ii) 自定义参数格式化成data,传给 super().__init__(data=data) iii) 网络状态码、响应头等信息带给super().__init__() 8、异常模块:在请求生命周期中,分发请求任务执行时,被一个超大的try except包裹,一旦出现任何异常,都会交给exception_handler函数处理 自定义原因:系统只处理了部分,所以手动还需要处理;后期异常信息需要记录到日志文件 工作流程:先交给drf处理异常,如果有响应结果,代表drf已处理,如果是None,自己处理 """ 3.序列化组件** ** # 1)可以将model对象序列化成可以返回给前台的json数据 # 2)可以校验前台传来的数据,完成model的增与改 模型层 class User(models.Model): name = models.CharField(max_length=16) # 自定义插拔序列化字段 - 完成连表深度查询 @property def my_name(self): return self.name 序列化层 ...

2019年10月25日 · 2 分钟

【DRF】偏移分页组件/游标分页组件/自定义过滤器/过滤器插件

1.drf偏移分页组件 pahenations.py from rest_framework.pagination import LimitOffsetPagination class MyLimitOffsetPagination(LimitOffsetPagination): # ?offset=从头偏移的条数&limit=要显示的条数 limit_query_param = 'limit' offset_query_param = 'offset' # ?不传offset和limit默认显示前3条,只设置offset就是从偏移位往后再显示3条 default_limit = 3 # ?limit可以自定义一页显示的最大条数 max_limit = 5 # 只使用limit结合ordering可以实现排行前几或后几 # ?ordering=-price&limit=2 => 价格前2 views.py from rest_framework.generics import ListAPIView class CarListAPIView(ListAPIView): # 如果queryset没有过滤条件,就必须 .all(),不然分页会出问题 queryset = models.Car.objects.all() serializer_class = serializers.CarModelSerializer # 分页组件 - 给视图类配置分页类即可 - 分页类需要自定义,继承drf提供的分页类即可 pagination_class = pagenations.MyLimitOffsetPagination 2.drf游标分页组件 pahenations.py # 注:必须基于排序规则下进行分页 # 1)如果接口配置了OrderingFilter过滤器,那么url中必须传ordering # 1)如果接口没有配置OrderingFilter过滤器,一定要在分页类中声明ordering按某个字段进行默认排序 from rest_framework.pagination import CursorPagination class MyCursorPagination(CursorPagination): cursor_query_param = 'cursor' page_size = 3 page_size_query_param = 'page_size' max_page_size = 5 ordering = '-pk' views.py ...

2019年10月25日 · 2 分钟

【DRF】频率组件

1.频率类源码入口 # 1)APIView的dispath方法中的 self.initial(request, *args, **kwargs) 点进去 # 2)self.check_throttles(request) 进行频率认证 # 频率组件核心源码分析 def check_throttles(self, request): throttle_durations = [] # 1)遍历配置的频率认证类,初始化得到一个个频率认证类对象(会调用频率认证类的 __init__() 方法) # 2)频率认证类对象调用 allow_request 方法,判断是否限次(没有限次可访问,限次不可访问) # 3)频率认证类对象在限次后,调用 wait 方法,获取还需等待多长时间可以进行下一次访问 # 注:频率认证类都是继承 SimpleRateThrottle 类 for throttle in self.get_throttles(): if not throttle.allow_request(request, self): # 只要频率限制了,allow_request 返回False了,才会调用wait throttle_durations.append(throttle.wait()) if throttle_durations: # Filter out `None` values which may happen in case of config / rate # changes, see #1438 durations = [ duration for duration in throttle_durations if duration is not None ] duration = max(durations, default=None) self.throttled(request, duration) 2.自定义频率类 # 1) 自定义一个继承 SimpleRateThrottle 类 的频率类 # 2) 设置一个 scope 类属性,属性值为任意见名知意的字符串 # 3) 在settings配置文件中,配置drf的DEFAULT_THROTTLE_RATES,格式为 {scope字符串: '次数/时间'} # 4) 在自定义频率类中重写 get_cache_key 方法 # 限制的对象返回 与限制信息有关的字符串 # 不限制的对象返回 None (只能放回None,不能是False或是''等) 短信接口1/min频率限制 ...

2019年10月22日 · 2 分钟