Python爬虫与网络数据采集案例实践(微课视频版)课件 第9章 实践案例-多类型数据采集与存储_第1页
Python爬虫与网络数据采集案例实践(微课视频版)课件 第9章 实践案例-多类型数据采集与存储_第2页
Python爬虫与网络数据采集案例实践(微课视频版)课件 第9章 实践案例-多类型数据采集与存储_第3页
Python爬虫与网络数据采集案例实践(微课视频版)课件 第9章 实践案例-多类型数据采集与存储_第4页
Python爬虫与网络数据采集案例实践(微课视频版)课件 第9章 实践案例-多类型数据采集与存储_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

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

文档简介

第9章实践案例—多类型数据采集与存储学习目标知识目标(1)理解股票财经信息、天气数据和房源信息采集的业务需求与技术实现。(2)解股票财经信息、天气数据和房源信息采集的业务需求与技术实现。(3)熟悉带有权限要求的API的请求方式,特别是在天气数据采集中的应用。(4)了解如何将采集到的安居客租房房源信息存储到MongoDB数据库中。学习目标能力目标(1)具备设计和实现多类型数据采集项目的能力,能够根据不同场景选择合适的爬虫策略和技术方案。(2)能够编写高效、稳定的爬虫代码,处理复杂数据结构,并将数据转换为可分析的格式。(3)熟练运用身份认证技术,正确请求有权限要求的API接口,采集相关数据。(4)掌握大规模数据的持久化方法,尤其是将数据存储到非关系型数据库如MongoDB中。素质目标(1)提升应对复杂网络环境的综合分析与问题解决能力。(2)增强处理复杂数据结构、解析API接口数据的技能,培养面对复杂任务时的项目设计与实现能力。(3)提高对实际项目中反爬虫机制的应对能力,灵活调整策略以实现数据采集目标。思维导图章节内容行业PPT模板/hangye/9.29.3采集聚合数据官网的天气数据采集安居客租房信息9.1采集股票财经信息PATR01采集股票财经信息COMTENS0102JSON数据解析股票财经信息采集采集股票财经信息金融市场的动态变化为投资决策提供了大量的数据支持。采集股票财经信息的主要目标是实时获取股票价格、涨跌幅、成交量等关键数据,以便分析市场走势。金融数据的时效性决定了信息采集的速度和稳定性非常重要。股票数据通常以JSON格式通过API提供,并包含许多嵌套的结构,因此解析这些数据是后续数据存储处理的重点引言JSON数据解析9.1.1JSON格式的数据总体是字符串格式,对象中的字符必须用双引号包围,数组与对象相互嵌套。JSON数据解析最高效的方式是采用Pandas库转换DataFrame,DataFrame是pandas库中的一种二维表格型数据结构,可以存储和处理各种数据类型,广泛应用于数据清洗、数据分析和机器学习等领域。简单的JSON数据转换为DataFrame数据格式示例代码如下:importpandasaspdJSON_data={#简单JSON数据"name":"AppleInc.","price":150.23,"change_percent":1.25,"volume":32000000}df=pd.DataFrame([JSON_data])#转换为DataFrameprint(df)#显示DataFrame程序运行结果如下图所示:接下来通过一个案例来演示,嵌套的JSON数据转换为DataFrame数据格式,示例代码如下:JSON数据解析9.1.1#嵌套JSON股票数据nested_JSON={"data":{"stock_info":[{"name":"AppleInc.","price":150.23,"change_percent":1.25,"volume":32000000},{"name":"GoogleInc.","price":2750.55,"change_percent":-0.75,"volume":1200000}]}}#提取嵌套的股票信息列表stock_info=nested_JSON["data"]["stock_info"]#转换为DataFramedf=pd.DataFrame(stock_info)#显示DataFrameprint(df)程序运行结果如下图所示:对于多层嵌套的数据结构,可以使用JSON_normalize来展平JSON数据。接下来通过一个案例来演示,JSON_normalize展平多层嵌套的JSON数据,示例代码如下所示:JSON数据解析9.1.1frompandasimportJSON_normalizecomplex_JSON={#更复杂的嵌套JSON数据"data":{"stock_info":[{"name":"AppleInc.","price":150.23,"details":{"currency":"USD","exchange":"NASDAQ"}},{"name":"GoogleInc.","price":2750.55,"details":{"currency":"USD","exchange":"NASDAQ"}}]}}#展平嵌套的JSON数据df=JSON_normalize(complex_JSON["data"]["stock_info"])#显示DataFrameprint(df)程序运行结果如下图所示:股票财经信息采集-案例分析本案例通过爬取巨潮资讯网提供的股票数据,以“新城市”股票为例,采集其相关的财经信息并进行分析。整个过程包括从网页获取数据、解析股票的详细信息、转换为便于分析的格式DataFrame,并进行基本的数据分析。采集任务是从巨潮资讯网获取“新城市”股票的财务报表,内容包括2019年至2023年的财务数据。打开巨潮资讯网(/),在右上角搜索框输出关键字“新城市”,点击搜索进入“新城市”股票网页,点击“财务报表”功能按钮即可进入财务报表网页,如下图所示:9.1.2数据采集思路分析右键检查打开开发者工具,选择网络面板,通过抓包工具获取页面真实请求地址,选择Fetch/XHR菜单,刷新网页,截获XHR请求查看相应数据,可见数据为JSON格式,如图所示:9.1.2数据采集思路分析选中光标处url,右键移到复制,选择复制链接地址,此地址即为JSON数据url:9.1.2数据采集思路分析将复制的url复制到浏览器,打开网址,观察JSON数据嵌套结构如右图所示:可见我们需要的财务数据包含在键data-records中,里面year键对应的数据是年报数据,three键对应的数据是三季报的数据,middle键对应的数据是中报数据,one键对应的数据是一季报数据。9.1.2接下来编写爬虫代码,采集url直接写财务报表JSON数据的url,可以直接返回JSON数据,选取JSON数据中的目标数据,解析转换为DataFrame,编写代码如下:采集代码实现importrequests#导入requests库importpandasaspd#导入pandas库importmatplotlib.pyplotasplt

#导入绘图库#配置请求地址url,请求其他股票,仅需要修改最后的股票代码即可url='/data20/financialData/getIncomeStatement?scode=300778&sign=1'#请求地址r=requests.get(url)#解析返回的JSON数据s=r.JSON()#将数据提出关键信息,转换为DataFrame#从Python对象中按键或下标来索引出数据,如year年报data=s['data']['records'][0]['year']df=pd.DataFrame(data)9.1.2接下来编写代码,将DataFrame保存为Excel文件,再绘制该股票营业总成本、营业总收入的折线图,编写代码如下:采集代码实现#用iloc按下标位置,对列进行调整。Df2=df.iloc[:,[3,0,5,4,2,1,]]Print(df2)#将DataFrame保存为Excel文件。df2.to_excel('年报数据_300778.xlsx')#解决中文乱码问题plt.rcParams['font.sans-serif']=['Simhei']fig=plt.figure(figsize=(12,7))#设置画布大小为12X7#画折线图,x是df2的列中从下标1到最后,y是下标为0的行和下标为1的列到最后,#线的形状为‘-o’,实线加圆点,标签是下标为0的行里面的下标为0的列plt.plot(df2.columns[1:],df2.iloc[0,1:],'-o',label=df2.iloc[0,0])#画第二条折线图,x是df2的列中从下标1到最后,y是下标为1的行和下标为1的列到最后,#线的形状为‘-o’,实线加圆点,标签是下标为1的行里面的下标为0的列plt.plot(df2.columns[1:],df2.iloc[1,1:],'-o',label=df2.iloc[1,0])plt.legend()#显示图示plt.show()#显示图9.1.2数据采集结果运行采集股票财经信息代码,可见JSON财经信息中目标数据已保存到当前目录“年报数据_300778.xlsx”文件中,打开文件如下所示:9.1.2数据采集结果营业总成本、营业总收入的折线图如下图所示,可见该股票营业收入呈下降趋势。通过同样的方法还可以轻松地进行进一步的股票数据分析与可视化,帮助我们更好地了解股票的市场表现。9.1.2PATR02采集聚合数据官网的天气数据COMTENS0102聚合数据API使用流程天气数据采集与分析采集聚合数据官网的天气数据聚合数据是中国领先的数据服务平台,专注于提供各种类型的API接口服务,帮助开发者、企业和个人更轻松地获取互联网资源和数据。通过聚合数据,用户可以快速集成各种行业的数据,如天气、新闻、金融、物流、支付、短信等,降低了数据集成的技术门槛,广泛应用于多个行业场景。聚合数据的天气数据服务是其最受欢迎的API之一,提供全国各地的实时天气预报、历史天气数据、生活指数等详细的气象信息。主要功能包括:实时天气:提供指定城市的当前天气状况、温度、风速、湿度等。未来天气预报:获取未来数天的天气预报信息。空气质量指数:包括PM2.5、PM10、O3等空气质量数据。引言聚合数据API使用流程9.2.1登录聚合数据官网,然后注册用户,注册过程需要用户进行实名认证,并提供手机、身份证号等信息,请提前做好准备1.注册聚合数据网站的账号点击网站右上角的登录按钮登录,单击网址右上角的“个人中心”按钮,进入个人中心,单击左侧菜单中“数据中心/我的API”,单击“申请新数据”按钮。在申请数据页面,单击导航菜单中的“应用开发/73_天气预报”,然后单击“申请”按钮,在弹出的对话框中,勾选下方的我已阅读并同意复选框,然后单击“立即申请”按钮。申请完成后,回到“我的API”页面,申请的天气预报已经出现在列表中,并且网址提供了一个Key。2.申请API密钥聚合数据天气预报API聚合数据天气预报API如下图所示,官网为用户提供的AppKey在图中标注。9.2.1聚合数据API使用流程9.2.1在“我的API”页面打开天气预报页面,可以查看产品功能介绍及接口文档,产品功能主要介绍天气预报数据提供的功能,包括温度查询、湿度查询、空气质量查询及天气状况查询。接口文档如图所示,提供根据城市查询天气、根据城市查询生活指数、天气总类列表、支持城市列表详细的说明文档及示例代码3.查看接口文档5.循环进行直到抓取结束聚合数据API使用流程9.2.1在API-天气预报界面点击“测试API”按钮,即可进入请求天气数据接口测试页面如图所示4.使用接口测试API5.循环进行直到抓取结束使用接口测试API在请求参数-值文本框中输入要请求的城市(如:广州),点击“发送请求”按钮,即可进行数据请求测试,下方将即时显示请求详情和返回内容如图所示。请求详情包括请求地址、请求参数及请求方式。返回内容为JSON格式数据,后续可进行JSON数据解析及进一步数据处理。在文档的指导下,用户可以通过HTTP请求,按照API要求传递必要的参数,并在请求头或URL中附加API密钥。API返回的数据通常为JSON格式,便于解析和处理。用户也可以在控制台查看每日的调用情况、使用量统计、错误记录等,方便管理和优化API调用。020301查询指定城市的实时天气信息查询指定城市未来5天的天气情况查询多个城市的天气天气数据采集与分析-采集任务9.2.2查询指定城市的实时天气信息本次案例以广州为例,主要目标是查询如下信息:(1)天气状况:当前天气,如晴天、阴天等。(2)温度:获取当前的温度。(3)风速和湿度:获取风速和湿度等气象数据。采集广州实时天气数据。编写代码如下,注意将天气预报APIKey替换为用户的API密钥9.2.2importrequests#导入requests请求库。importpandasaspd#导入pandas#请替换为实际的API密钥Key='your_api_key_here'#设置为天气预报请求到的keyurl='/simpleWeather/query?city={}&key='+Keyr=requests.get(url.format('广州'))#通过format方法填入将{}替换为“北京”data=r.JSON()#将返回的JSON字符串解析为Python对象w=data['result']['realtime’]#从Python对象中索引数据print("广州市实时天气:")print("温度:{},湿度:{},{},风向:{},风力:{},空气质量:{}".format(w['temperature'],w['humidity'],w['info'],w['direct'],w['power'],w['aqi']))程序运行结果如下图所示:查询指定城市未来5天的天气情况通过对之前测试返回的JSON文件数据嵌套分析,可见"future"键对应的数据为指定城市未来5天的天气数据,所以直接获取此键数据即可9.2.2importrequests#导入requests请求库。importpandasaspd#导入pandas#请替换为实际的API密钥Key='your_api_key_here'#设置为天气预报请求到的keyurl='/simpleWeather/query?city={}&key='+Keyr=requests.get(url.format(‘广州’))#通过format方法填入将{}替换为“广州”data=r.JSON()#将返回的JSON字符串解析为Python对象w=data['result']['future']#提取未来5天的天气df=pd.DataFrame(w)#将返回数据转换为DataFramedf.columns=["日期","温度","天气","wid","风向"]#设置DataFrame的列名称df=df.drop('wid',axis=1)#wid(天气标识)列没有用,删除print(df)程序运行结果如下图所示:查询多个城市的天气同时查询多个城市的天气数据,可以进行城市天气比较分析,采集北京、上海、广州、郑州、重庆、长春天气数据。将实时天气数据进行城市温度对比分析,将未来5日天气数据合并到一个列表中供后续查询。9.2.2importrequests#导入requests请求库。importpandasaspd#导入pandasimportmatplotlib.pyplotaspltfrommatplotlib.font_managerimportFontPropertiescities=['北京','上海','广州','郑州','重庆','长春']Key='your_api_key_here'#设置为天气预报请求到的keyurl='/simpleWeather/query?city={}&key='+Keyweather_real=[]#设置空列表,用于保存各城市的实时天气forcityincities:r=requests.get(url.format(city))#请求url,填入占位符的实际值

data=r.JSON()#返回的JSON字符串转为Python对象

w=data['result']['realtime']#提取实时天气

weather_real.append(w)#将字典添加到列表中df1=pd.DataFrame(weather_real,index=cities)#转换列表为DataFramedf1.columns=["温度","wid","湿度","天气","风向","风力","空气质量"]df1=df1.drop('wid',axis=1)#删除wid列,天气标识。df1.to_csv("多城市实时天气数据.csv")#保存#绘制城市实时温度对比图plt.rcParams['font.sans-serif']=['SimHei']#用来正常显示中文标签plt.bar(cities,df1['温度'].astype(int))plt.title('城市温度对比')plt.xlabel(u'城市')plt.ylabel(u'温度(°C)')plt.show()weather_future=[]#设置空列表,用于保存各城市的未来5日天气forcityincities:r=requests.get(url.format(city))#请求url,填入占位符的实际值

data=r.JSON()#返回的JSON字符串转为Python对象

w=data['result']['future']#提取实时天气

df2=pd.DataFrame(w)#转换为DataFramedf2['city']=city#添加城市名为一个新列

weather_future.append(df2)#将DataFrame添加到列表中df2=pd.concat(weather_future,ignore_index=True)#将DataFrame进行合并df2.columns=["日期","温度","天气","wid","风向","城市"]#修改列名df2.to_csv("多城市未来5日天气数据.csv")#保存查询多个城市天气运行代码,下方即可展示北京、上海、广州、郑州、重庆、长春实时天气情况如图9-16所示,同时数据存储到当前目录下的“多城市实时天气数据.csv”文件中。采用matplotlib库绘制城市气温对比图如图9-17所示,可见长春气温最低为4度,广州气温最高为24度。9.2.2查询多个城市天气代码中列表weather_future用于保存6个城市未来5日的天气数据,可将5日天气数据一次性集成到列表中,并保存到当前目录下的“多城市未来5日天气数据.csv”文件中,如下图所示。9.2.2在接口文档中,还可以根据城市查询生活指数、采集天气种类列表、采集支持城市列表。在实际应用中,可以根据需要进行数据采集。PATR03采集安居客租房信息COMTENS0102采集需求分析采集思路分析采集安居客租房信息03数据采集及存储采集需求分析本案例的目标是通过爬虫采集安居客网站上的租房信息。具体采集的内容包括标题、链接、价格、大小、户型、姓名、小区、地址、整租、方向、电梯、地铁、展示图片等。通过这些信息,用户可以根据租房数据分析租金水平、房源分布。本案例以广州作为目标城市。鉴于安居客网站针对频繁访问及数据爬取设有相应的防爬虫机制,在实际开展爬取工作时,有必要运用反爬策略予以应对,诸如借助代理IP来实施数据抓取操作。在数据爬取进程之中,涉及将房源图片另行存储至本地文件夹这一任务,此时,可采用多线程技术达成高效的图片爬取与本地保存目的。多线程技术的运用,能够确保在不干扰主程序正常运行的前提下,同步开展多张图片的下载工作,有效避免程序阻塞,进而显著提升爬虫整体工作效率。9.3.1采集思路分析9.3.2使用谷歌浏览器访问安居客网站(/),发现不用登录即可进行城市租房房源查询,选择广州进行租房查询,主页面如图所示1.访问安居客网站采集思路分析在页面右键选择检查打开开发者工具,选择Elements面板,定位目标元素位置,如标题、图片、房源关键信息、租金等,右键复制目标元素XPath备用,如图所示9.3.2采集思路分析由于安居客网站有防爬虫机制,同一个IP爬取多次后会弹出界面提示频繁访问异常,禁止继续爬取,所以需要在此案例使用代理IP隐藏真实的IP地址,避免被目标网站反爬虫策略限制。在此案例中,需要将图片爬取下来另存到本地文件夹,为了提高爬虫效率,使用多线程进行图像爬取。在Python中,要启动一个线程,可以使用threading包中的Thread类建立一个对象。Thread类的基本原型是:t=Thread(target,args=None)其中,target是要执行的线程函数,args是一个元组或者列表,作用是为target()函数提供参数,然后程序调用t.start()启动线程。在多线程的程序中,往往一个线程(如主线程)要等待其他线程执行完毕后才继续执行,这可以使用join()函数,使用的方法是:线程对象.join()在一个线程代码中执行这条语句,当前的线程就会停止执行,一直等到指定线程对象的线程执行完毕后才继续执行,即这条语句起到阻塞的作用。使用download()函数下载图片,把每次调用download()函数的过程设置成一个子线程,下载图像的过程就变成多线程。9.3.2使用多线程下载图片通过一个简单案例展示多线程下载图片。关键代码如下:count+=1T=threading.Thread(target=download,args=[count,title,src])#download()函数的设置成一个子线程T.setDaemon(False)#将线程T设置为非守护线程,当主线程结束时,如果还有非守护线程在运行,主线程会等待这些线程完成后再退出T.start()#启动一个新线程TS.append(T)#将新线程加入到线程列表#下载图片函数定义defdownload(count,src):try:p=src.rfind("/")name=src[p+1:]resp=urllib.request.urlopen(src)data=resp.read()f=open("download\\"+name,"wb")

f.write(data)

f.close()print(count,"download",name)exceptExceptionaserr:print(err)为了在程序结束前等待所有的图像下载完毕,设计一个TS的全局线程列表变量,它记录每次启动的线程,在程序结束前执行循环,代码如下:forTinTS:

T.join()#线程阻塞使用多线程下载图片MongoDB是一个基于分布式文件存储的数据库,由数据库、集合和文档对象3个层次组成。为了方便结构化数据及图片数据的存储,将爬取到的数据和图片保存到MongoDB数据库。将爬取到的租房关键信息保存到MongoDB集合中,对于每张图片,下载图片内容,将其转换为base64编码的字符串,然后保存到MongoDB集合中。保存数据及图片到MongoDB代码如下:frombs4importBeautifulSoupimportpymongofromPILimportImagefromioimportBytesIOimportbase64#MongoDB连接client=pymongo.MongoClient('mongodb://localhost:27017/')db=client['mydatabase']collection=db['mycollection']url=''response=requests.get(url)#检查请求是否成功ifresponse.status_code==200:soup=BeautifulSoup(response.content,'html.parser’)title=soup.find('title').textimages=soup.find_all('img')

#保存文本数据到MongoDBdata={"title":title,"url":url}MongoDB

collection.insert_one(data)#保存图片到MongoDBforimginimages:

img_url=img['src']

img_response=requests.get(img_url)ifimg_response.status_code==200:

img_data=img_response.content

#将图片保存为base64字符串

img_base64=base64.b64encode(img_data).decode('utf-8')

image_record={"url":img_url,"image_data":img_base64}

collection.insert_one(image_record)print("数据和图片已保存到MongoDB")数据采集及存储在PyCharm中打开工程项目“CrwalProject”,选择Chapter9Code”包。右击该包,在快捷菜单中选择“New”->“PythonFile”命令,新建一个名称为“案例-采集安居客租房数据信息”的Python文件,在此文件中写入爬虫代码如下所示:9.3.3importdatetimeimportJSONimportosimportthreadingimporttimeimportrequestsfromlxmlimportetreeimportcsvfrompymongoimportMongoClientclassAnjuke(object):def__init__(self):self.url='/?from=navigation'

self.headers={'user-agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)''Chrome/87.0.4280.88Safari/537.36','referer':'/'}

self.client=MongoClient("",27017)

self.db=self.client['Anjuke']

self.col=self.db['House']

self.threads=[]数据采集及存储9.3.3defget_data(self):

url="/company/postpay/getips?auto_white=1&num=1&pt=1&result_type=text&split=1&trade_no=6109837093171821&sign=5ddeb951c1c77440d0e37f1fb12b1954"while1:try:r=requests.get(url,timeout=10)#except:continue

ip=r.text.strip()if'请求过于频繁'inip:print('IP请求频繁')

time.sleep(1)continuebreak

xies={'https':'%s'%ip}response=requests.get(url=self.url,proxies=xies)returnresponse数据采集及存储9.3.3

#下载图像

defdownload(self,src):data=Noneifsrc:response=requests.get(url=src,timeout=400)

imgname=src.split('/')[-1]

imgpath='./download/'+imgname

imgdata=requests.get(src).contentifresponse.status_code==200:withopen(imgpath,'wb')asfile:

file.write(imgdata)print("download",imgpath)defparse_data(self,response):html=etree.HTML(response.content)

node_list=html.xpath('//div[@class="zu-itemmodclearfix"]')

data_list=list()fornodeinnode_list:temp={}temp["标题"]=node.xpath("./div[1]/h3/a/b/text()")[0]temp["链接"]=node.xpath("./div[1]/h3/a/@href")[0]temp["价格"]=node.xpath("./div[2]/strong/text()")[0]+'元'temp["大小"]=node.xpath("./div[1]/p[1]/b[3]/text()")[0]+'平米'

shi=node.xpath("./div[1]/p[1]/b[1]/text()")[0]数据采集及存储9.3.3ting=node.xpath("./div[1]/p[1]/b[2]/text()")[0]temp["户型"]=shi+'室'+ting+'厅'temp["姓名"]=node.xpath("./div[1]/p[2]/span/text()")[0].strip()temp["小区"]=node.xpath("./div[1]/address/a/text()")[0]temp["地址"]=node.xpath("./div[1]/address/text()")[1].strip()temp["整租"]=node.xpath("./div[1]/p[2]/span[1]/text()")[0]temp["方向"]=node.xpath("./div[1]/p[2]/span[2]/text()")[0]try:temp["电梯"]=node.xpath("./div[1]/p[2]/span[3]/text()")[0]except:temp["电梯"]="无"try:temp["地铁"]=node.xpath("./div[1]/p[2]/span[4]/text()")[0]except:temp["地铁"]="无"try:temp["图片"]=node.xpath("./a/img/@src")[0]

src=temp["图片"]T=threading.Thread(target=self.download,args=(src,))

T.daemon=True

T.start()

self.threads.append(T)except:temp["图片"]=''数据采集及存储9.3.3

data_list.append(temp)returndata_listdefsave_data(self,data_list):fordataindata_list:

csv_writer.writerow([data["标题"],data["链接"],data["价格"],data["大小"],data["户型"],data["姓名"],data["小区"],data["地址"],data["整租"],data["方向"],data["电梯"],data["地铁"],data

温馨提示

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

评论

0/150

提交评论